Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

求一段VBA程序语言,实现循环参数查询

供药老道  发表于:2010-11-21 20:30:33  
复制

背景:  我有一个“员工信息”表,其中有一个字段为“姓名”,里面分别是“张、王、李、赵”等等。

        另外,还有3个追加查询,名字假设为“查询A”、“查询B”、“查询C”,都是以“查询参数”为参数的。

        每次运行这3个查询都需要输入“查询参数”,查询结果都添加到一个叫“汇总查询结果表”的表内。

 

目的:  我想实现一个循环查询功能。可以自动按“姓名”字段内的所有记录,分别运行3各追加查询,并把结果都汇总到“汇总查询结果表”表内。

程序结构是:

        1。I=1

        2。读取“员工信息”表“姓名”字段的第I条记录。

        3。定义“查询参数”为上述记录。

        4。分别运行“查询A”、“查询B”、“查询C”。

        5。I=I+1 回到第2条。

 

恳求老师帮我写段程序,急用!先拜谢了!

 

Top
供药老道 发表于:2010-11-21 23:35:43

老师,我自己乱写了一段,运行不了,恳请改正:


Public Sub MonthCollect()
'查询上个月部门所有员工的工作情况

        Dim stSql As String
        Dim j As Integer
        Public 查询参数 As String
        Dim xingming(1 To 4) As String
       
        xingming(1) = "张"
        xingming(2) = "王"
        xingming(3) = "李"
        xingming(4) ="赵"
                     
        '先删除原有的记录
        stSql = "delete * from [汇总查询结果表]"
                 
        j = 1
      
        While j < 5

            Query1.ParamByName('查询参数').AsString:= xingming(j)
            'Parameters.ParamByName( '查询参数 ').Value:=xingming(j)      这两句都不行,红色了.
           
            DoCmd.OpenQuery "查询A"
            DoCmd.OpenQuery "查询B"
            DoCmd.OpenQuery "查询C"
                       
            j = j + 1
        Wend

End Sub



供药老道 发表于:2010-11-22 09:01:10

感谢好朋友帮忙,目前只差最关键一步: 就是如何给查询用到的参数用VBA语句赋值的问题没解决了?

那么问题得到简化,如下:

 

背景:  我有一个数组nn(),定义为“张、王、李、赵”,将作为“查询参数”的赋值。

        另外,还有3个追加查询,名字假设为“查询A”、“查询B”、“查询C”,都是以“查询参数”为参数的。

     在一个循环语句中,每次运行这3个查询都需要输入“查询参数”。
 

目的:  我想实现在循环中,按照I值自动给“查询参数”赋值。

程序结构是:

        1。I=1

        2。定义“查询参数”=nn(I)。

        3。分别运行“查询A”、“查询B”、“查询C”。

        4。I=I+1 回到第2条。

 

问题1:红色部分不知道如何写语句.

    2:结构2,和结构3是否应互换顺序? 因为是打开"查询A"后才提示输入"查询参数".

 

谢谢!



煮江品茶 发表于:2010-11-22 11:19:32

dim i as long

for i=1 to dcount("*","员工信息")

    循环体

next



供药老道 发表于:2010-11-22 11:23:56

谢谢总版主指教, 现在卡在给"查询A"用到的"查询参数"赋值了.以下是循环体:

 

 

            DoCmd.OpenQuery "查询A"
            Set db = CurrentDb()
            Set qdfParmQry = db.QueryDefs("查询A")
            qdfParmQry("查询参数") = "员工信息"

 

 

请指教以上的语言需要怎么修改呢?
           



煮江品茶 发表于:2010-11-22 15:35:44

这个用法我不太懂:

qdfParmQry("查询参数") = "员工信息"

好像你的问题不必用修改查询来折腾,用ADO数据集解决或者用列表框来解决会很方便。

可以上传实例,以免打哑谜,说得不懂,听得不明白。



供药老道 发表于:2010-11-22 16:16:59

我现在用笨办法把查询复制了N份,分别指定了查询参数,逐一运行,也算达到目的.

 

ADO数据集,我暂时还没概念,今后一定学习.

 

知识没学到位,只有付出更多的体力了.哈哈.

 

还是多谢版主指明方向.

 

另外,我现在的数据库上传到附件,除了笨到家的重复运行查询外,基本实现了我的目标.  恳请优化.先拜谢了.

点击下载此附件

煮江品茶 发表于:2010-11-22 17:14:55
还得麻烦你把实例降低为2003版。

供药老道 发表于:2010-11-22 18:59:57

版主您好,我选择保存并发布,另存为2003格式时提示: 不用能旧版本的格式保存此数据库,因为此数据库使用的某些功能需要使用当前的文件格式.

这些功能包括附件、多值字段、脱机数据、数据宏、计算结果列、到不支持的外部文件的连接、更新的顺序、更新的加密类型及导航控件。

 



供药老道 发表于:2010-11-22 19:17:58

运行“部门工作量查询”时,原打算弄个人员姓名的参数,然后循环运行,取值从“人员信息表”内“姓名”字段自动取。查询结果都累加到一个“查询结果表”内。

现在尝试了一些语句都有问题,所以采用笨办法:即复制了9份“部门工作量查询”,然后把其中的参数固定为某个姓名,分别执行之。

 

由于没办法转换成03格式,所以复制出窗体上执行按钮对应的[事件过程],不知道能否说明问题。

版主费心了!

 

关键的地方是窗体上执行按钮对应的[事件过程]如下:(窗体上有三个参数:开始日期、结束日期、当月奖金)

 

Private Sub 查询_Click()
    If IsNull([开始日期]) Or IsNull([结束日期]) Then
        MsgBox "您必须输入开始日期和结束日期。"
        DoCmd.GoToControl "开始日期"
    Else
        If [开始日期] > [结束日期] Then
            MsgBox "结束日期必须大于开始日期。"
            DoCmd.GoToControl "开始日期"
        Else
           
            If IsNull(当月奖金) Then
            MsgBox "您必须输入当月奖金总额"
            DoCmd.GoToControl "当月奖金"
           
            Else
                 
            DoCmd.SetWarnings False

           '以下查询都还有另外3个参数:开始日期、结束日期、当月奖金,现在是使用窗体控件返回值定义的。

            DoCmd.OpenQuery "部门工作量查询-马小兵"         '以“马小兵”替换姓名参数的新建表查询   
            DoCmd.OpenQuery "部门工作量查询-倪志红"         '以“倪志红”替换姓名参数的追加查询
            DoCmd.OpenQuery "部门工作量查询-王磊"           '以“王磊”替换姓名参数的追加查询
            DoCmd.OpenQuery "部门工作量查询-林凌"           '以“林凌”替换姓名参数的追加查询
            DoCmd.OpenQuery "部门工作量查询-袁沈"           '以“袁沈”替换姓名参数的追加查询
            DoCmd.OpenQuery "部门工作量查询-董名盛"         '以“董名盛”替换姓名参数的追加查询
            DoCmd.OpenQuery "部门工作量查询-唐佳赟"         '以“唐佳赟”替换姓名参数的追加查询
            DoCmd.OpenQuery "部门工作量查询-王志宇"         '以“王志宇”替换姓名参数的追加查询
            DoCmd.OpenQuery "部门工作量查询-李龙庆"         '以“李龙庆”替换姓名参数的追加查询
                      
            DoCmd.OpenQuery "部门基本奖查询"
            DoCmd.OpenQuery "部门管理奖查询"
            DoCmd.OpenQuery "部门主设人管理奖查询"
            DoCmd.OpenQuery "部门其它奖查询"
            DoCmd.OpenReport "部门奖金查询交叉表", acViewPreview, , , acWindowNormal
           
            Me.Visible = False
            End If
        End If
    End If
End Sub



煮江品茶 发表于:2010-11-22 19:21:06
只需要数据表即可,可另外建一个数据库,将数据表导入到这个数据库中,然后存成2003版即可。

煮江品茶 发表于:2010-11-22 20:01:13
Dim rs As New ADODB.Recordset
Dim i As Long
rs.Open "员工信息", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
for i=1 to rs.Recordcount
    msgbox rs("姓名").value  'rs("姓名").value可以循环得到员工信息表中的姓名字段值
    rs.movenext
next
rs.close

供药老道 发表于:2010-11-23 10:02:40

接着问品茶版主, 如果得到这个姓名值了,如何把这个值指定为我做的那个部门工作量查询中的查询参数呢?

试过一些赋值语句,都是执行查询时仍然弹出输入框,要求输入那个查询参数.

 

拜谢!



煮江品茶 发表于:2010-11-23 10:10:43
不知道你的sql语句是怎么写的,你贴上来看看。

供药老道 发表于:2010-11-23 14:13:40

查询是使用查询设计界面完成的,没有sql语句,

执行时就是这个命令: DoCmd.OpenQuery "部门工作量查询"



煮江品茶 发表于:2010-11-23 15:14:02
"部门工作量查询"在SQL设计视图下就可以看见sql语句了



供药老道 发表于:2010-11-23 19:37:52
SELECT 工程卷册信息总表.编号, "生产奖" AS 工程检索号, 工程卷册信息总表.工程名称, 工程卷册信息总表.设计阶段, 工程卷册信息总表.卷册号, 工程卷册信息总表.卷册名称, 工程卷册信息总表.总工日, 工程卷册信息总表.单价, IIf([工程卷册信息总表]![设计人]=[查询参数],"设计",IIf([工程卷册信息总表]![校核人]=[查询参数],"校核",IIf([工程卷册信息总表]![审核人]=[查询参数],"审核"))) AS 担当职责, IIf([工程卷册信息总表]![设计人]=[查询参数],[工程卷册信息总表]![总工日]*0.8,IIf([工程卷册信息总表]![校核人]=[查询参数],[工程卷册信息总表]![总工日]*0.1,IIf([工程卷册信息总表]![审核人]=[查询参数],[工程卷册信息总表]![总工日]*0.075))) AS 分配工日, IIf([工程卷册信息总表]![设计人]=[查询参数],[工程卷册信息总表]![总工日]*0.8*[工程卷册信息总表]![单价],IIf([工程卷册信息总表]![校核人]=[查询参数],[工程卷册信息总表]![总工日]*0.1*[工程卷册信息总表]![单价],IIf([工程卷册信息总表]![审核人]=[查询参数],[工程卷册信息总表]![总工日]*0.075*[工程卷册信息总表]![单价]))) AS 奖金, 工程卷册信息总表.设计人, 工程卷册信息总表.校核人, 工程卷册信息总表.审核人, 工程卷册信息总表.计划日期, 工程卷册信息总表.批准日期, [查询参数] AS 姓名 INTO 部门奖金查询结果
FROM 工程卷册信息总表
WHERE (((工程卷册信息总表.设计人)=[查询参数]) AND ((工程卷册信息总表.批准日期) Between [Starttime] And [Endtime])) OR (((工程卷册信息总表.校核人)=[查询参数]) AND ((工程卷册信息总表.批准日期) Between [Starttime] And [Endtime])) OR (((工程卷册信息总表.审核人)=[查询参数]) AND ((工程卷册信息总表.批准日期) Between [Starttime] And [Endtime]))
ORDER BY IIf([工程卷册信息总表]![设计人]=[查询参数],"设计",IIf([工程卷册信息总表]![校核人]=[查询参数],"校核",IIf([工程卷册信息总表]![审核人]=[查询参数],"审核")));


供药老道 发表于:2010-11-23 19:42:40

其中有3个参数:[查询参数]、[Starttime]、[Endtime]。

[查询参数]需要通过循环利用“员工信息”表“姓名”字段逐个赋值。

[Starttime]、[Endtime]在窗口上有2个控件取值。

 



煮江品茶 发表于:2010-11-23 19:57:15
眼睛骨折了。

供药老道 发表于:2010-11-23 20:18:32

是啊,放到VBA程序框内都红了,尽管我用t代替了一部分“工程卷册信息总表”,也用stSql叠加语句分段,但还是有2行报红。

其实最长的是几个IIf的嵌套循环。

 

我实在太外行了,只求解决问题,恳请版主大人多费心阿!



总记录:19篇  页次:1/1 9 1 :