【问题标题】:Update using two tables in Ms access vba使用 Ms access vba 中的两个表进行更新
【发布时间】:2017-07-24 14:51:10
【问题描述】:

我想使用另一个表中的数字更新一个表,我想做以下表格

Y-X(1)-(A1+A2+A3)

X 来自 table1,而 Y,A1,A2,A3 来自 table2。新记录将在 X 列中更新,其中 ID 只有一条记录 = 0

表1

    ID   ||  X
    -------------
    1    ||  **0**
    1    ||  155
    2    ||  4
    3    ||  0
    3    ||  0
    3    ||  234
    4    ||  0
    4    ||  0

表2

ID   ||  Y   ||  A1   ||  A2   ||  A3
--------------------------------------
1    ||  228 ||  1    ||  3    ||  4
2    ||  112 ||  6    ||  7    ||  7    
3    ||   4  ||  22   ||  1    ||  0
4    ||  78  ||  76   ||  6    ||  2

从上面的示例表中,唯一与证书匹配的列是 ID=1,其中只有一个是 0,计数 = 2,所以列 X 其中 =0 将被更新 (X2= 228-155-(1+3+4))

更新表1

ID   ||  X
-------------
1    ||  **65**
1    ||  155
2    ||  4
3    ||  0
3    ||  0
3    ||  234
4    ||  0
4    ||  0

我的代码是

Private Sub GET_TWO_INJLINE_EST()

  DoCmd.SetWarnings False
  DoCmd.RunSQL "UPDATE table1 I, table2 P" _
                 & " SET I.X = IIf(I.X = 0, DLookup(""P.Y-I.X-(P.A1 + P.A2 + P.A3)"" , " _
                 & "                                ""table1"", ""[ID]="" & [ID] & "" AND I.X <> 0""), I.X)" _
                 & " WHERE I.[ID] IN (SELECT I.[ID] FROM table1 I" _
                 & "                  GROUP BY I.[ID] HAVING (Count(I.[ID]) = 2)" _
                 & "                  AND (Min(I.ID) <> Max(I.X))" _
                 & "                  AND (Min(I.X) = 0 OR Max(I.X) = 0))" _
                 & " AND I.ID=P.ID"
  DoCmd.SetWarnings True

End Sub

当我运行它时显示“未知”错误。

【问题讨论】:

    标签: sql vba ms-access


    【解决方案1】:

    当您尝试在字符串表达式中传递I.X 时,考虑一个UPDATE ... INNER JOIN 查询并协调您的DLookUp。此外,您的子查询的 Min() &lt;&gt; Max() 相等性不会与相同的 X 进行比较。

    最后,考虑将更新查询保存为存储的 Access 查询,而不连接到 VBA 字符串中,这样可以避免双引号并强制您在保存之前检查语法错误。此外,数据库引擎缓存和预编译以获得最佳执行计划。

    SQL (另存为 Access 存储查询;见大表达式中的 DMax)

    UPDATE table1 I
    INNER JOIN table2 P ON I.ID = P.ID   
    
    SET I.X = IIF(I.X=0, (P.Y - DMax("X", "table1", "ID=" & I.ID) - (P.A1+P.A2+P.A3)), I.X)    
    WHERE I.[ID] IN 
                 (SELECT sub.[ID] 
                  FROM table1 sub
                  GROUP BY sub.[ID] 
                  HAVING (Count(sub.[ID]) = 2)
                    AND (Min(sub.X) <> Max(sub.X))
                    AND (Min(sub.X) = 0 OR Max(sub.X) = 0))
    

    VBA

    Private Sub GET_TWO_INJLINE_EST()    
      DoCmd.SetWarnings True
      DoCmd.OpenQuery "mySavedUpdateQuery"
      DoCmd.SetWarnings True    
    End Sub
    

    【讨论】:

      【解决方案2】:

      尝试将第二个 table1 I 更改为 table1 J 并更新对第二个 table1

      的所有引用
      UPDATE table1 I, table2 P
      
          Set I.X = IIf(I.X = 0,
                        DLookup(""P.Y-I.X-(P.A1 + P.A2 + P.A3)"",
                                ""table1"",
                                ""[ID]="" & [ID] & "" AND I.X <> 0""
                               ),
                        I.X
                       )
      
           WHERE I.[ID] IN (
              SELECT J.[ID] FROM table1 J
              GROUP BY J.[ID]
              HAVING (Count(J.[ID]) = 2)
                 AND (Min(J.ID) <> Max(J.X))
                 AND (Min(J.X) = 0 OR Max(J.X) = 0))
                 AND J.ID=P.ID
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-22
        • 2018-06-14
        • 2021-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多