0

我正在精简我的数据库,尽可能消除重复的报告并创建更好的代码。我有一个涉及我们的焊工和工头的数据库。在这段代码中,我可以为单个工头打印一份报告,该报告通过 openargs 发送字符串“strActive”。报告查看 strActive 和 OpenForm 操作,根据字符串为活动、非活动或所有焊工设置过滤器通过的值。

它在时间码上完美地适用于单页。在那里,用户从列表中选择一个领班或输入领班的时钟号码。报告所基于的查询使用全局字符串“ForemanCLK”来仅获取该焊工的结果。

以前,我有三份报告;一份用于所有焊工,一份用于活跃焊工,一份用于非活跃焊工。

以前,我会根据 strActive 设置一个变量,并使用代码中的另一个变量代替报告名称打开相应的报告。循环运行良好并打开报告 39 次,每次都使用新的工头姓名和数据。

我很困惑为什么现在用 openarg 打开报告不起作用。我只得到第一个工头的名字,39次。我已经通过注释掉 docmd 行和 debug.print(ing) 表单所需的各种值来验证我得到了不同工头的 foremanCLK 变量。该报告根本无法正确加载。

Set rec = CurrentDb.OpenRecordset(sql)

    rec.MoveFirst

    For ctr = 0 To rec.RecordCount - 1
        ForemanCLK = rec(0).Value
        DoCmd.OpenReport "rptForeman", acViewNormal, , , , strActive
        'DoCmd.OpenReport "rptForeman", acViewNormal
    rec.MoveNext

    Next

上面的代码让我得到了由 strActive 过滤的同一个工头报告的许多副本

    For ctr = 0 To rec.RecordCount - 1
        ForemanCLK = rec(0).Value
        'DoCmd.OpenReport "rptForeman", acViewNormal, , , , strActive
        DoCmd.OpenReport "rptForeman", acViewNormal
    rec.MoveNext

但这让我得到了所有不同的工头,除了它没有被过滤。

我试过传入 Where 子句。

acViewNormal, ,"[active]=" & True

acViewNormal, ,"[active]=" & False

acViewNormal, ,"[active]=" & True & " OR [active]=" & False

我对单个报告进行了相同的验证,它正确过滤,但在循环中,它根本不过滤。但是,它确实给了我不同的工头。

这里最大的问题是......

为什么?access 在报告之间是否没有足够的时间来关闭它,因此它不会对打开的事件执行操作?

还有其他想法吗?

4

2 回答 2

1

您必须在循环内明确关闭报告:DoCmd.Close acReport, "rptForeman". 如果在已打开的报表上再次调用 OpenReport,则该对象将获得访问焦点,但它不会重新运行 Open 事件。

于 2014-06-25T20:08:31.463 回答
0

好吧,我必须羞愧地低下头。

我错误地检查了上面的代码,使用strActive 之外的每个变量。

当我将它添加到我的 debug.print 行时,它什么也没想到。 这个怎么可能!?!!??

我只是忘记在 sub 的开头设置它,就像我对打开单个报告的其他操作所做的那样。strActive一个全局变量,但在此之前没有在代码中的任何其他位置设置。

一旦将其添加到子的开头,一切正常。

于 2014-06-26T14:09:54.807 回答