【问题标题】:Update Table base on Another Table基于另一个表更新表
【发布时间】:2013-06-12 10:52:24
【问题描述】:

这涉及我们的 Access 2007 中的两个表。

“Station Master”表由工作站记录组成

“Move-Add-Change” 表包含移动、添加、更改具体步骤的记录项目 ID

我创建了一个查询以从“Move-Add-Change”中提取与 Project Id 匹配的所有记录。 然后,我需要进行如下处理:

遍历"Pull MAC Records by Project # Qry" 查询中的每一行(有一个序列字段 也从 1 开始编号)

如果行中的 Action 字段为 Move:

  • 如果同一行的“To Loc”不是以TSS开头(用于Inventory Loc),则更新“Station Master”中的记录Loc Name 等于 "Pull MAC Records by Project # Qry" 查询中同一行的 "From Loc" 字段,将其值更改为 "Pull MAC Records by Project # Qry" 查询中同一行的 To Loc 字段

  • 如果同一行的“To Loc”以TSS开头,则删除“Station Master”中Loc Name匹配“来自"Pull MAC Records by Project # Qry"查询中同一行的Loc”。

如果行中的Action字段是Add

  • “Station Master”中创建一条新记录,Loc Name 是该行的“To Loc”字段

如果行中的Action字段是Change:

  • 执行与 Move 相同的操作,并使用 "Pull MAC Records by Project # Qry" 查询中同一行的 Notes 字段中的信息更新 “Station Master” 的描述

代码必须在"Pull MAC Records by Project # Qry" 中逐行执行,因为我们可能会将另一个站点移动到刚刚移开的位置。

查询的部分结果示例:

Project Id   Seq   Action   From Loc   To Loc       Notes 
A123456      1     Move     WFC1234    TSSRepair    For OEM service
A123456      2     Move     WFC9999    WFC1234      Test station
...

如果我调用查询来进行更新,它似乎不会逐行遍历并会提示违规(我认为它试图将 WFC9999 更改为 WFC1234 当原来的WFC1234记录还在,造成重复)。

这是我的查询的 SQL:

UPDATE [Station Master], [Pull MAC Records by Project # Qry] 
SET [Station Master].[Loc Name] = [Pull MAC Records by Project # Qry]![To Loc], 
    [Station Master].[Loc Function] = Left([Pull MAC Records by Project # Qry]![To Loc],3), [Station Master].[Loc #] = Right([Pull MAC Records by Project # Qry]![To Loc],Len([Pull MAC Records by Project # Qry]![To Loc])-3)
WHERE 
    ((([Station Master].[Loc Name]) = [Pull MAC Records by Project # Qry]![From Loc]));

我做错了什么?我可以在 VBA 代码中拥有所有这些过程吗(我不擅长)?

【问题讨论】:

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


    【解决方案1】:

    根据您是否想要一个实际的循环,您可以使用 VBA 来执行此操作:

    'Set your variables
    
    Dim myR as Recordset
    Dim myR2 as Recordset
    
    'Then set your recordsets to the two tables you want to work with
    
    Set myR = db.OpenRecordset("Station Master", dbOpenDynaset)
    Set myR2 = db.OpenRecordset("Move-Add-Change", dbOpenDynaset)
    
    'Now select the table you wish to work with until the end of file(EOF)
    
    while Not myR.EOF
        If myR![Action] = "Move" Then
    
            'Code goes here if true
    
        Else
    
            'Code goes here if false
    
        End If
    
        'Move to the next record and loop if not end of file(EOF)
    
        myR.MoveNext
    Loop
    
    'Make sure to set close your recordsets when done
    
    Set myR = Nothing
    Set myR2 = Nothing
    

    还可以查看herehere 了解更多关于循环的示例。

    【讨论】:

    • 我会尝试这个想法。我可能不得不为每个动作编写一个循环来逐行执行。这很重要,因为一个站点可能会被移动到另一个位置,然后另一个站点将被移动到它以前的空间并使用它以前的 Loc 名称。随着查询的进行,它只是出现故障并抱怨重复索引。谢谢。如果我迷路了,我会回来寻求更多指导。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    相关资源
    最近更新 更多