Sql 如何使用DAO.Recordset使用不可更新的查询更新表

Sql 如何使用DAO.Recordset使用不可更新的查询更新表,sql,vba,ms-access,Sql,Vba,Ms Access,我有一个相当小的表tblFunding,有20条记录。我想使用不可更新查询的结果更新其字段付款,即: “选择用户名、金额([Payment])作为tblFundingMain的付款,其中(((DateDiff('m',[PaymentDate],DateSerial(Year(Date()),1,1)))介于-7和4之间)按用户名分组”) 我知道存储这种类型的数据是一种不好的做法,但用户希望不时查看数据,因为为了方便起见,表被绑定到表单。 我们提出了一种使用DAO的方法,该方法可以工作,但它为更

我有一个相当小的表
tblFunding
,有20条记录。我想使用不可更新查询的结果更新其字段
付款
,即:

“选择用户名、金额([Payment])作为tblFundingMain的付款,其中(((DateDiff('m',[PaymentDate],DateSerial(Year(Date()),1,1)))介于-7和4之间)按用户名分组”)
我知道存储这种类型的数据是一种不好的做法,但用户希望不时查看数据,因为为了方便起见,表被绑定到表单。 我们提出了一种使用
DAO
的方法,该方法可以工作,但它为更新表中
UserName
字段不存在的记录保留空值,即
tblFunding
。如果字段不匹配,我们希望值为
0
。代码在窗体打开之前运行,这意味着在启动窗体之前更新表。有没有办法礼貌地完成这项任务?请查看下面的代码,并尽可能提供建议。谢谢大家!

Private Sub btnGlance_Click()

Dim rs1 As DAO.Recordset
Dim rs 2 As DAO.Recordset

Set rs1 = CurrentDb.OpenRecordset("SELECT UserName, Sum([Payment]) As Payment FROM tblFundingMain WHERE (((DateDiff('m',[PaymentDate],DateSerial(Year(Date()),1,1))) Between -7 And 4)) GROUP BY UserName")
Set rs2 = CurrentDb.OpenRecordset("SELECT * FROM tblFunding")

rs1.MoveFirst
  Do Until rs1.EOF
  rs2.MoveFirst
  Do Until rs2.EOF
  If rs1.Fields("UserName") = rs2.Fields("UserName") Then
  rs2.Edit
  rs2.Fields("Payment").Value = rs1.Fields("Payment").Value
  rs2.Update
  End If      
  rs2.MoveNext
  Loop
rs1.MoveNext
Loop

rs1.Close
rs2.Close
Set rs1 = Nothing
Set rs2 = Nothing

Docmd.OpenForm "frmUserGlance"

End Sub

无法运行更新操作以将所有Null更改为0

CurrentDb.Execute“更新TBLFundation SET Payment=0,其中付款为空”

或考虑替代代码:

rs2.MoveFirst
Do Until rs2.EOF
  rs1.MoveFirst
  rs1.FindFirst "UserName = '" & rs2!UserName & "'"
  rs2.Edit
  If Not rs1.NoMatch Then
     rs2!Payment =  rs1!Payment
  Else
     rs2!Payment = 0
  End If
  rs2.Update
  rs2.MoveNext
Loop
在表单上显示此摘要数据的替代方法可以使用域聚合函数。构建一个进行求和的查询对象,然后使用DLookup提取特定值。或者直接在源表上使用DSum()


如果只是将过滤求和查询加入到所有用户名的数据集,就可以避免所有这些代码。

我很困惑。付款汇总的来源与要更新的表相同?@June更新了代码
TblFindingMain
用于更新
TblFinding
如果您刚刚执行了一个将筛选的求和查询加入到所有用户名的数据集的查询,则可以避免所有这些代码。@June7该家伙将
TblFinding
作为表单的记录源。表单上绑定了文本框。唯一禁用编辑的绑定文本框是文本框,该文本框包含
Payment
字段,因为它是
ControlSource
,使其按需只读。我想不出比这更好的了。好吧,正如我在回答中所说的,域聚合函数是一种选择,尽管我已经看到在具有大型数据集的表单上性能很慢。如果您对VBA解决方案满意,很高兴我能提供帮助。我不敢相信我没有考虑在循环后更新表。你后面的方法非常有效。我将更新我的代码到更晚的版本。我认为这可能比先循环记录集,然后再更新记录集要快?非常感谢。非常感谢。