SQL VBA 函数中的 SUM 语句

SQL SUM statement in VBA function

我的数据库有三个 table,Holder、Product(这是一个帐户)和 Transaction。我已经设置了一个来自 Holder table 的表单,该表单具有来自 Product table 的子表单,并且 Product 子表单具有 Transaction table 作为子表单。在表格的持有人部分,我放置了一个未绑定文本字段,该字段应显示交易 table 中尚未支付的交易总额和税款字段(由交易 [= 上的复选框指示) 22=]).我已将未绑定文本框的控件源设置为 =calcOutstanding() 并为窗体编写了以下函数。

Public 函数 calcOutstanding()

Dim db As Database
Dim strSQL As String

Set db = CurrentDb

strSQL = "SELECT SUM(tblTransaction.TxAmount + tblTransaction.TxTax) As Outstanding" _
    & "FROM tblTransaction" _
    & "INNER JOIN tblProduct ON tblTransaction.fkProductID = tblProduct.ProductID" _
    & "INNER JOIN tblHolder ON tblProduct.fkHolderID = tblHolder.HolderID" _
    & "WHERE tblTransaction.TxPaid = False" _
    & "AND tlbHolder.HolderID = Me.HolderID;"

DoCmd.RunSQL strSQL

calcOutstanding = Outstanding

结束函数

该字段现在只显示#Error。我做错了什么?

我怀疑您是否需要外部函数来执行此操作。 MS Access 允许您简单地通过 Me.Subform!FieldName.Value

来引用子表单中的字段

这意味着,您可以简单地访问与您当前记录相关的子表单字段。甚至在该字段上执行 IIF(condition, truevalue, falsevalue)

在此处阅读有关访问表单和子表单的更多信息:http://access.mvps.org/access/forms/frm0031.htm

编辑: 在您的第三个子表单 (tbl_transaction) 中,创建一个名为 (txt_outstanding) 的新未绑定 TextBox 并分配此表达式

=IIF([txPaid]=false, sum(txAMount +TxTax),0)

现在您可以在父表单中访问此字段,类似于此:

me.txt_someTextbox.value = nz(me.tbltransactionsubform!txt_outstanding.value,"")

马上,我发现你发布的代码有问题:

strSQL = "SELECT SUM(tblTransaction.TxAmount + tblTransaction.TxTax) As Outstanding" _
& "FROM tblTransaction" _
& "INNER JOIN tblProduct ON tblTransaction.fkProductID = tblProduct.ProductID" _
& "INNER JOIN tblHolder ON tblProduct.fkHolderID = tblHolder.HolderID" _
& "WHERE tblTransaction.TxPaid = False" _
& "AND tlbHolder.HolderID = Me.HolderID;"

在每一行的末尾 Outstanding " _ 或每行的开头都应该有一个 space ,例如 " FROM tblTransaction 否则你的字符串将显示为 OutstandingFROM tblTransaction解析,这会给你一个错误。

你的方法有很多错误:

  1. DoCmd.RunSQL 仅用于操作查询(插入、更新、删除)。
  2. 您不能像您尝试的那样 return 来自 DoCmd.RunSQL 的值并将其推送到变量中。
  3. 您对 where 子句的连接不正确。
  4. 正如 HansUp 所提到的,Access 在其 SQL 中对 JOIN 中的括号非常挑剔。

假设 SQL 是正确的,此代码存在于父表单中,并且您不会在查询中返回多行,也许这样的事情会起作用:

Public Function calcOutstanding() As Currency

    Dim db As DAO.Database
    Dim rst As DAO.Recordset
    Dim strSQL As String

    Set db = CurrentDb

    strSQL = "SELECT SUM(tblTransaction.TxAmount + tblTransaction.TxTax) As Outstanding " _
        & "FROM (tblTransaction " _
        & "INNER JOIN tblProduct ON tblTransaction.fkProductID = tblProduct.ProductID) " _
        & "INNER JOIN tblHolder ON tblProduct.fkHolderID = tblHolder.HolderID " _
        & "WHERE tblTransaction.TxPaid = False " _
        & "AND tlbHolder.HolderID = " & Me.HolderID

    Set rst = db.OpenRecordset(strSQL, dbForwardOnly)

    calcOutstanding = rst![Outstanding]

    Set rst = Nothing
    set db = Nothing

End Function

注意 WHERE 子句中的串联以从表单的数据源获取值(否则 SQL 无法在 SQL 本身的范围内协调 Me.HolderID) .此外,我们将 returning 数据集推送到记录集中并从中读取。我认为,按照这些思路应该可以。 (现在Access前面没有,如有非编译语句请见谅。)

编辑:添加了函数 return 类型作为整数为了特殊性。 编辑 2:添加了函数 return 为特殊性起见,类型为货币。朵.