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
解析,这会给你一个错误。
你的方法有很多错误:
- DoCmd.RunSQL 仅用于操作查询(插入、更新、删除)。
- 您不能像您尝试的那样 return 来自 DoCmd.RunSQL 的值并将其推送到变量中。
- 您对 where 子句的连接不正确。
- 正如 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 为特殊性起见,类型为货币。朵.
我的数据库有三个 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
解析,这会给你一个错误。
你的方法有很多错误:
- DoCmd.RunSQL 仅用于操作查询(插入、更新、删除)。
- 您不能像您尝试的那样 return 来自 DoCmd.RunSQL 的值并将其推送到变量中。
- 您对 where 子句的连接不正确。
- 正如 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 为特殊性起见,类型为货币。朵.