Sql 迭代表并更新匹配的记录集-Access-Vba 问题

Sql 迭代表并更新匹配的记录集-Access-Vba 问题,sql,ms-access,vba,ms-access-2003,Sql,Ms Access,Vba,Ms Access 2003,我构建了一个跟踪系统,其中包含来自其他表的唯一workID和Ids。我有一个名为“乘数”的列,如果满足某些条件,我想更改它。我想更改每个记录的乘数列,其中:日期是星期日,前面是星期六(意味着星期六的日期需要在表中),并且具有与星期六相同的ID 基本上这是一个奖金制度,如果一个跑步者在周六和周日工作,那么在那个周日他会得到2倍的乘数。我打开桌上每个星期天和星期六的记录集,并尝试匹配它们。但是它跳过了一些东西,因为星期六之后不一定是星期天 代码 我的代码可以做到这一点,只要周六之后是周日。只要一个星

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

基本上这是一个奖金制度,如果一个跑步者在周六和周日工作,那么在那个周日他会得到2倍的乘数。我打开桌上每个星期天和星期六的记录集,并尝试匹配它们。但是它跳过了一些东西,因为星期六之后不一定是星期天

代码 我的代码可以做到这一点,只要周六之后是周日。只要一个星期六之后没有一个星期天,那么光标就处于不同的级别,有时是一个。我不介意在SQL Update或其他任何程序中执行此操作,只要它在access中工作

注意:下面的示例不是真实的示例。评论部分显示的是一周中的哪一天

样本表tblA 在tblA上运行代码后的最终输出:
从表中可以看出,之前的星期日。

取决于您要访问的记录数量,我认为这应该适用于您:

第一个功能是循环浏览
fwsat
记录集中的所有星期日。对于每个星期天,它将调用
precingSaturday
函数,并检查该ID是否有一个星期六在该星期天的一天之内

公共函数CheckSunday()
sqlFindSat=“从tblA中选择工作ID、日期、任务、ID、乘数,其中(工作日([Date])=7)按日期、ID、工作ID排序”
sqlFindSun=“从tblA中选择工作ID、日期、任务、ID、乘数,其中(工作日([Date])=1)按日期、ID、工作ID排序”
Set fwSun=db.OpenRecordset(sqlFindSun)
Set fwsat=db.OpenRecordset(sqlFindSat)
“所有的星期天
不要在fwSun.EOF时执行此操作
“如果这个星期天有前一个星期六。
如果在星期六之前(星期六,星期日,星期日),那么
'将本周日的乘数更新为2
编辑
太阳啊!乘数=2
fwSun.Update
如果结束
fwSun.MoveNext
环
端函数
此函数只接受包含所有星期六的
记录集
,并在其中进行搜索,查看是否有任何记录集位于所述星期日之前。如果是,则返回true

Public函数predingSaturday(fwsat作为记录集,intID作为整数,dte作为日期)作为布尔值
Dim Bln将星期六作为布尔值
BLNPreceidingSaturday=假
“所有星期六,而前一个星期六尚未找到
不执行fwsat.EOF和blnPrecedingSaturday=假
如果周六和周日的身份证匹配
如果fwsat!id=intID然后
“如果周六和周日发生在1天之内
如果DateDiff(“d”,fwsat!Date,dte)=1,则
“这是前一个星期六
blnPrecedingSaturday=正确
如果结束
如果结束
fwsat.MoveNext
环
星期六前=星期六前
端函数

这是一段粗略的代码,因为我没有适当测试它的表结构。虽然我认为它应该适合你所寻找的

VBA不需要这样做;您还可以使用自连接运行SQL查询,并直接执行更新

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

语法应为:

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语句


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

为什么不同的道琼斯指数有相同的日期?周六之后是周日,您的排序是什么?@b如我所述。上表中的日期只是为了显示我的结果预期结果。事实是,这是一个系统,跑步者可以随时输入每周跑步记录。一个月后,一年后等等。所以数据没有排序。基本上你需要知道,哪些星期日记录在上一个日期有相似的记录-只需在调整后的日期字段中使用join then。为什么你要在一个表中进行两次查询?也许你可以只选择SAT&Suns和group by ID。我仍然很困惑,当你把重复的日期标记为不同的日期时,你怎么知道道琼斯指数是多少。例如,8/10/12既是Sat又是Sun。
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    
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
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