繁体   English   中英

遍历表并更新匹配的记录集-Access-Vba

[英]Iterate over a table and update matching recordset - Access - Vba

问题

我构建了一个跟踪系统,该跟踪系统具有来自其他表的唯一的workIDId 我有一列称为乘数的列,如果满足某些条件,我想更改该列。 我想更改每个记录的乘数列,其中:日期是星期日,并且在星期六之前(意味着星期六的日期需要在表中),并且具有与星期六相同的ID。

基本上,这是一种奖金系统,如果跑步者在星期六和星期日工作,那么在那个星期日他得到2的乘数。我打开表中存在的每个星期日和星期六的记录集,并尝试匹配它们。 但是它跳过了一些内容,因为星期六并非总是紧随星期日之后。

sqlFindSat = "Select WorkID, Date, Task, ID, Multiplier from tblA where  (weekday([date]) = 7) order by date, id, workId"
sqlFindSun = "select WorkID, Date, Task,  ID, Multiplier from tblA where ( weekday([date]) = 1 ) order by date, id, workId"


Set fwSun = db.OpenRecordset(sqlFindSun)
Set fwSat = db.OpenRecordset(sqlFindSat)

Do While Not fwSat.EOF
    waitforsat = False
    debug.print " Curr Sat: " & fwSat!Date & " Curr Sun: " & fwSun!Date

    If WeekdayName(Weekday(fwSat!Date)) = "saturday" Then
       If ((DateAdd("d", 1, fwSat!Date) = fwSun!Date) And (fwSun!ID = fwSat!ID)) Then
            fwSun.Edit
            fwSun!multiplier = 2
            fwSun.Update
       End If

    End If

    If Not fwSun.EOF Then
        fwSun.MoveNext
    End If

    fwSat.MoveNext
Loop

只要周六之后是周日,我的代码就可以做到这一点。 一旦在一个星期六之后没有一个星期日,那么光标就会处于不同的级别,有时甚至会不同。 我不介意在SQL Update或其他任何方式中执行此操作,只要它在访问中有效即可。

注意:以下示例不是真实示例。 评论部分将显示星期几。

样本表tblA

Workid |    Date     | ID | Multiplier | comments 

  12     10-11-2012    2       1           sunday

  13     15-12-2012     4      1           Monday

  14     10-10-2012    3       1           Saturday

  25     11-10-2012    3       1           Sunday

  17     8-10-2012     2       1           sunday

  35     15-10-2012     4       1           Monday

  45     8-10-2012     3       1           Saturday

  50     9-10-2012     3       1           Sunday    

在tblA上运行代码后的最终输出:

Workid |    Date     | ID | Multiplier | comments 

  12     10-11-2012    2       1           Sunday

  13     15-12-2012     4      1           Monday

  14     10-10-2012    3       1           Saturday

  25     11-10-2012    3       2           Sunday

  17     8-10-2012     2       1           sunday

  35     15-10-2012     4       1           Monday

  45     8-10-2012     3       1           Saturday

  50     9-10-2012     3       2           Sunday

从表中可以看到,前面是星期日。

VBA不需要这样做。 您最好运行带有自联接的SQL查询并直接进行更新。

此查询会将所有具有相同ID的前一个星期六的记录的所有星期日行的乘数更改为2。

语法应为:

UPDATE tblA t1
INNER JOIN tblA t2 ON t1.ID = t2.ID AND t2.Date = DATEADD('d', -1, t1.date)
SET t1.Multiplier = 2
WHERE WEEKDAY(t1.date) = 1  -- assuming 1 is Sunday, might depend on regional setting

如果要在执行更新之前先查看会发生什么,只需将更新更改为select *并删除set语句即可。

或者在运行表之前对其进行备份:)

根据您将要访问的记录数,我认为这应该对您有用:

第一个功能只是循环遍历fwsat RecordSet中的所有星期日。 对于每个星期日,它将调用PrecedingSaturday函数,并检查该ID是否具有在该星期日的一天之内的星期六。

Public Function CheckSunday()

    sqlFindSat = "Select WorkID, Date, Task, ID, Multiplier from tblA where  (weekday([date]) = 7) order by date, id, workId"
    sqlFindSun = "select WorkID, Date, Task,  ID, Multiplier from tblA where ( weekday([date]) = 1 ) order by date, id, workId"


    Set fwSun = db.OpenRecordset(sqlFindSun)
    Set fwsat = db.OpenRecordset(sqlFindSat)

    'For all Sundays
    Do While Not fwSun.EOF

        'If this Sunday has a Preceding Saturday. 
        If PrecedingSaturday(fwsat, fwSun!id, fwSun!Date) Then

            'Update multiplier to 2 for this Sunday
            fwSun.Edit
            fwSun!multiplier = 2
            fwSun.Update

        End If

        fwSun.MoveNext
    Loop

End Function

该函数仅接受包含所有星期六的RecordSet ,并在它们之间进行搜索以查看是否有任何星期日在相关的星期日之前。 如果这样做,则返回true。

Public Function PrecedingSaturday(fwsat As Recordset, intID As Integer, dte As Date) As Boolean

    Dim blnPrecedingSaturday As Boolean

    blnPrecedingSaturday = False

    'For all Saturdays while a preceding Saturday hasn't already been found
    Do While Not fwsat.EOF And blnPrecedingSaturday = False

        'If Saturday's ID and Sunday's id match
        If fwsat!id = intID Then
            'If the Saturday and Sunday happened within 1 day
            If DateDiff("d", fwsat!Date, dte) = 1 Then
                'This is a preceding Saturday
                blnPrecedingSaturday = True
            End If
        End If

        fwsat.MoveNext
    Loop

    PrecedingSaturday= blnPrecedingSaturday

End Function

这是粗糙的代码,因为我没有正确测试它的表结构。 虽然我认为它应该可以满足您的需求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM