设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
楼主: emilyfu
打印 上一主题 下一主题

[其它] 怎么样来实现这两个数据框之间的通信呢?

[复制链接]
21#
发表于 2003-12-4 00:30:00 | 只看该作者
好吧。忘了加注释,对不起了。一下子也找不到access2000,现在就把demo1和demo2的核心语句解释一下吧。

demo1的核心语句很少,就是在这里:

If lstFactory.ItemsSelected.Count > 0 Then
    For Each temp In lstFactory.ItemsSelected
        result = result & " (ID = " & lstFactory.ItemData(temp) & ") OR"
    Next temp
    DoCmd.OpenReport "rptFactory", acViewPreview, , , , Left(result, Len(result) - 3)
Else.......

listbox的名称是lstFactory,设计时,“多重选择”那里选择“简单”。当打印按钮被按下时,就执行上面的语句。

上面语句中 If lstFactory.ItemsSelected.Count > 0 用来判断是否在列表框中作了选择(如果没有任何选择那么其值为0),如果有选择的话,那么:
For Each temp In lstFactory.ItemsSelected 即是对每个选择了的项目依次循环,然后组成一个sql语句的where部分保存到result中。例如选择了id为3和5的工厂,那么最后result中的结果就是 "(ID=3) OR (ID=5) OR"
Left(result, Len(result) - 3)的运算结果就变成"(ID=3) OR (ID=5)",这个就是我们要送到报表去打印的。

再看报表的open事件,如果有参数传入,例如"(ID=3) OR (ID=5)",那么就决定报表的数据源为

SELECT * FROM factory WHERE (ID=3) OR (ID=5)

这样解释是否明白?
22#
发表于 2003-12-4 00:56:00 | 只看该作者
demo2的程序并不象看上去的那么复杂,现在我来解释一下:

窗体打开时,我们用一个recordSet来组成要给listbox显示的值列表。(当然,两个listbox的数据来源都要设成值列表)
Private Sub Form_Open(Cancel As Integer)
Set rst = CurrentProject.Connection.Execute("SELECT id, fname FROM factory ORDER BY fname")
lstSource = ""
While Not rst.EOF
    lstSource = lstSource & rst(0) & ";" & rst(1) & ","    ‘///rst(0) 即rst("id"), rst(1)即rst("fname")
    rst.MoveNext
Wend
lstSource = Left(lstSource, Len(lstSource) - 1) '///把最后的一个逗号去掉
'///lstSource的最后结果是 "1;某某厂,2;某某厂,3;某某厂。。。。"
lstFactory.RowSource = lstSource
End Sub
之所以将rst和lstSource变量声名放在模块顶部,是因为全选的两个按钮要用到。

几个按钮:单选的两个按钮都是调用有关listbox的双击事件,全选的两个按钮就是把一个listbox置空、另一个放满,没什么好说。现在就剩下两个listbox的双击事件需要解释了。

两段程序是“对称”的,所以只需解释一个。

Private Sub lstFactory_DblClick(Cancel As Integer)
With lstFactory  
    If .ItemsSelected.Count > 0 Then
        lstPrint.AddItem (.Column(0, .ItemsSelected(0)) & ";" & .Column(1, .ItemsSelected(0)))
        .RemoveItem (.ItemsSelected(0))
    End If
End With
End Sub

将with...end with块去掉,可以看清楚些
Private Sub lstFactory_DblClick(Cancel As Integer)
If lstFactory.ItemsSelected.Count > 0 Then
        lstPrint.AddItem (lstFactory.Column(0, lstFactory.ItemsSelected(0)) & ";" & .Column(1, lstFactory.ItemsSelected(0)))
        lstFactory.RemoveItem (lstFactory.ItemsSelected(0))
    End If
End Sub
重要的是If块里面的两句,解释如下
第一句 lstPrint.AddItem (lstFactory.Column(0, lstFactory.ItemsSelected) & ";" & .Column(1, lstFactory.ItemsSelected)):将lstFactory选择的项目添加到lstPrint中。
第二句 lstFactory.RemoveItem (lstFactory.ItemsSelected(0)):将lstFactory选择的项目删除。
lstFactory.ItemsSelected(0)表示第一个选择的项目,其值是那个项目的行号(行号从0开始)。例如选择了第三行,那么这个值就是2。listbox里面某条的具体内容(如工厂id和工厂名称),用法是
listbox.Column(列号,行号)。列号和行号都是从0开始。所以,假定选择了第三行,那么lstFactory的第一列(现为隐藏列)(lstFactory.Column(0, lstFactory.ItemsSelected(0)) 即lstFactory.Column(0,2),第三行的第二列(现为工厂名称)就是lstFactory.Column(1,2)
现在将工厂id和工厂名称组合成 "id; fname"这样的形式添加到lstPrint的末尾,这就是第一句的全部含义了。
要深入了解listbox(以及combobox)的一些属性方法,建议查看帮助文档及其示例。
23#
发表于 2003-12-4 00:57:00 | 只看该作者
以下是引用阿罗在2003-12-3 15:50:33的发言:
将docmd.openReport中acViewPreview改为acPreview,虽然我没有acc2000。仔细一点的话查下帮助文档。


DoCmd.OpenReport "rptFactory", acPreview, , , , Left(result, Len(result) - 3)

提示出错:“错误的参数或无效的属性赋值(红字部份)”,
24#
发表于 2003-12-4 01:04:00 | 只看该作者
我想你可以利用access中智能代码输入的功能,从docmd开始按照提示重新写一下这行。这行原本的意思是,将Left(result, Len(result) - 3)作为openArgs去打开rptFactory这个报表。或者参考一下帮助文档吧。我实在是找不到access2000.
25#
发表于 2003-12-4 01:17:00 | 只看该作者
以下是引用LYP6160在2003-12-3 16:56:56的发言:
[quote]以下是引用阿罗在2003-12-3 15:50:33的发言:
将docmd.openReport中acViewPreview改为acPreview,虽然我没有acc2000。仔细一点的话查下帮助文档。


DoCmd.OpenReport "rptFactory", acPreview, , , , Left(result, Len(result) - 3)

提示出错:“错误的参数或无效的属性赋值(红字部份)”,
[/quote]

改为这样OK
DoCmd.OpenReport "rptFactory", acViewNormal, Left(result, Len(result) - 3)
26#
发表于 2003-12-4 19:18:00 | 只看该作者
英文版的看起来头哦,在主窗体给子窗体的控件赋值方法如下

Forms![ADDEDIT]![Manufacturer Information]![alia] = Me.Combo10.Column(3)

我也是问来的
http://www.office-cn.net/bbs/dispbbs.asp?boardid=3&ID=12716&replyID=66149&skin=2


这个我只作了一个,其余类似

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
27#
发表于 2003-12-4 19:25:00 | 只看该作者
emilyfu,你的窗体里的记录选定器等可以去掉,这样更“英文版”一点,界面也一致
28#
 楼主| 发表于 2003-12-4 20:30:00 | 只看该作者

谢谢你的回复

谢谢你答复,其实我想在ADDEDIT这个界面上实现的功能主要就是添加新的产品,有的时候在添加产品的时候,其实这个产品已经存在了,你添加的可能是这个产品的另外一个分支,或是另一个厂家做的。为了节省时间和避免出错,在添加之前,先要看Product 有没有你将要添加的产品,有的话就选择一个Product ,那下面就灰出现对应的的product Detail.  比如我在Product 这一栏里选择Cable,那么下面的Product Detail里就会出现network cable 和 crossover cable. 并且希望在选择Cable和crossover cable 的时候,Cable和crossover  同时也会出现在字窗体中。然后就只需要填上其他的产品的信息。在选择这个产品的生产厂家的时候也一样,如果这个厂家已经存在,那么就直接把信息填上就可以。没有的话再自己填上去。在信息全部填完之后,再通过一个按钮来把所有的信息存到表格中去。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
29#
 楼主| 发表于 2003-12-4 20:32:00 | 只看该作者
我正在为能实现这些功能而头疼,你帮看看,因为对你来说也许是个很容易的事情
30#
发表于 2003-12-4 20:33:00 | 只看该作者
28贴的字体把眼看花了


[此贴子已经被作者于2003-12-4 12:37:54编辑过]

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-9-23 04:21 , Processed in 0.094168 second(s), 32 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表