使用存储在另一个表中的公式更新MS Access表

时间:2017-03-08 21:41:39

标签: vba access-vba access

我有一个名为PayerFormulas的表,其中包含每个付款人的不同公式。另一个表是PayerData,它有付款人和我们收到的数据。我想使用存储在PayerFormulas中的适当公式填充PayerData.CheckNum。下表中的CheckNum数据是我想要的结果。

在伪代码中,感觉这就是我正在寻找的东西。

Update PayerData PD
inner join PayerFormulas PF on PD.Payer = PF.Payer
set PD.Check = PF.Formula

我在常规的Access查询中尝试了以上操作但它不起作用。尝试以下代码只会将公式文本放在表中,而不是结果。我已经看过以某种方式使用Eval(),但由于我的结果通常会包含文本,所以它看起来不像是下去的路线..

Sub testFormula()

Dim SQLString As String
Dim ActiveQuery As QueryDef

SQLString = "Update PayerData PD inner join PayerFormulas PF on PD.Payer = PF.Payer set PD.CheckNum = PF.Formula"

Set ActiveQuery = CurrentDb.CreateQueryDef("", SQLString)
ActiveQuery.Execute dbFailOnError

End Sub

PayerFormulas表

Payer      | Formula
-----------|--------
Visa       | mid([PayerData].[Data],3,2)
Mastercard | left([PayerData].[Data],2)
Amex       | right([PayerData].[Data],2)

PayerData表

Payer      |  Data  | CheckNum
-----------|--------|---------
Visa       | 123456 | 34
Visa       | ABCDEF | CD
Visa       | qwerty | er
Mastercard | 123456 | 12
Mastercard | ABCDEF | AB
Mastercard | qwerty | qw
Amex       | 123456 | 56
Amex       | ABCDEF | EF
Amex       | qwerty | ty

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

只有3个公式?在VBA中使用条件代码。将卡标识符作为参数发送到过程:

Sub testFormulat(strC As String)
Dim result As String

Select Case strC
    Case "Visa"
        result = Mid(Me.Data, 3, 2)
    Case "Mastercard"
        result = Left(Me.Data, 2)
    Case "AMEX"
        result = Right(Me.Data, 2)
End Select

CurrentDb.Execute "Update PayerData set CheckNum = '" & result & "' WHERE ID = " & Me.ID

End Sub

数据值来自何处?表格背后是代码吗?是否需要将表格绑定到表格中?如果是这样,则不需要SQL,只需: 我!PayerData =结果

答案 1 :(得分:0)

好的,继续使用3个公式的原始示例。您使用Eval()的想法是有效的,但必须连接[Data]字段提供的变量。修改公式表以将函数部分分解为单独的字段。

Payer      | Func   | Arg1 | Arg2
-----------|---------------------
Visa       | mid    |  3   | 2
Mastercard | left   |  2   |
Amex       | right  |  2   |

然后在连接表的查询中:

CheckNum:Eval([Func]&“('”& [Data]&“',& [Arg1]&”,“& [Arg2]&”)“)

注意[数据]周围的撇号分隔符。

或者args可以在一个字段中输入为CSV:3,2

然后:

CheckNum:Eval([Func]&“('”& [Data]&“',& [Args]&”)“)

BTW,不需要将结果保存到表中,需要时进行计算。