每个表单记录问题的VBA / Access RecordSet

时间:2009-09-25 21:19:38

标签: sql ms-access vba ms-access-2007 recordset

我是VBA和Access的新手并且遇到了这个问题,同时尝试使用我提出的另一个问题提出的备用实现(DLookup in Access not running until textBox clicked on in Form

下面的代码运行,问题是Me.Key对于表单中显示的每个记录都不同,并且以打开事件的形式运行它意味着它只抓取从第一个记录分配给Me.Key的第一个值。如何进行此运行以使Me.Key对于每个显示的记录/行都不同?

Dim rs As DAO.Recordset
Dim db As Database
Dim qdf As QueryDef
Dim prm As Parameter

Set db = CurrentDb
Set qdf = db.QueryDefs("[MF INCOME - STREAM MONTHLY]")
For Each prm In qdf.Parameters
    prm.Value = Eval(prm.Name)
Next prm

Set rs = qdf.OpenRecordset(dbOpenDynaset)
rs.FindFirst "[MyMonth]=10 AND [Org_Type]='" & Me.Key & "'"
Me.Oct = rs!SumVal
'...other month assignments

3 个答案:

答案 0 :(得分:0)

您可以尝试表单的当前事件,如前所述:)

答案 1 :(得分:0)

我猜Me.Key是指位于表单详细信息部分的控件。在这种情况下,为了列出控件采用的所有值,您需要浏览所有记录。其中一种方法可以是:

Dim m_position as Long
for m_position = 1 to Me.recordset.recordcount
   me.seltop = m_position
   debug.print me.key
next m_position

不幸的是,在浏览所有线条时,您会看到屏幕上的blincker。你当然可以在网上找到一些'screenFreezer'实用工具(有一个名为LockWindowUpdate,只要我记得)。

另一种解决方案是浏览基础记录集的克隆(浏览记录集将引发与之前相同的屏幕行为)。假设Me.Key控件绑定到记录集的“Key”列,代码可以是:

Dim rsClone as DAO.recordset
set rsClone = Me.recordsetclone
if rsClone.EOF and rsClone.BOF then
Else
    rsClone.moveFirst
    Do while not rsClone.EOF
        debug.print rsCLone.fields("Key")
        rsClone.moveNext
    Loop
Endif
set rsClone = nothing

我最喜欢的是第一个,添加了“冻结”选项。您的代码可以管理表单的seltop和selheight值。这意味着您可以专门浏览用户选择的记录和/或浏览完所有记录后返回原始记录选择。

编辑:

关注@ Ben的评论,我将补充一点,如果您的“myControl”控件位于详细信息部分并且未绑定,那么您将无法管理每行一个值。当表单显示为“连续”时,控件将对所有行具有相同的值。

如果“myControl”控件绑定到记录集的“myField”字段,则以下任何代码都会同时增加“myControl”控件值和“myField”字段值。您将能够在每一行上拥有不同的值:

解决方案1:

Dim m_position as Long
for m_position = 1 to Me.recordset.recordcount
   me.seltop = m_position
   me.controls("myControl") = m_position
next m_position

解决方案2:

Dim rsClone as DAO.recordset, _
    i as long

set rsClone = Me.recordsetclone
if rsClone.EOF and rsClone.BOF then
Else
    rsClone.moveFirst
    i = 1
    Do while not rsClone.EOF
        rsClone.fields("myField") = i
        rsClone.update
        rsClone.moveNext
        i = i+1
    Loop
Endif
set rsClone = nothing

答案 2 :(得分:0)

根本不清楚您在该查询中需要什么参数。我建议你只是构建一个没有任何参数的查询,其中包含你需要的所有列。

然后根据此查询构建小表单。然后,您可以将此小表单放入现有表单中,并根据键值设置显示多个数据字段。 (只需确保为子表单设置链接主设置和子设置)。这是表格的样子:

alt text http://www.members.shaw.ca/AlbertKallal/Articles/invoice2.gif

因此,在上面的账单中,根据客户ID显示客户信息,并且是发票中的相关表格。

换句话说,要根据另一个表中的键值显示多个数据字段,您不需要编写一行代码。因此,您的整个过程和目标都可以通过鼠标拖放来完成。我经常有发票或采购订单等东西,我只有客户ID。通过使用子表单,我可以显示整个地址和几个数据字段而无需编写任何代码。当您从一个记录移动到另一个记录时,这整个字段集将更新并始终显示正确的相关数据。