vba - 如果为真则更新,如果为假则添加新的,标准问题
问题描述
这就是我想要的:当我选择月份和年份然后单击 cmdbtn 时,我正在制作一个代码来自动为我生成发票数据;但如果存在具有所选日期 ([Forms]![F_Reports_Slct]![MnthSlct]) 和 (....![YrSlct]) 的 customerID,则更新值而不是创建新记录。
这里的一切都很好,除了在匹配条件时编辑记录..单击时我的数据正在重新创建。
我想我的标准有些问题。
请注意 rsM 和 rsY 是查询,并且表的记录集 ( rs ) 有一个带有自动编号 [CrId] 的主键字段。
Dim msg1 As Variant
Dim db As Database
Dim qdM As QueryDef
Dim qdY As QueryDef
Dim rs As Recordset
Dim rsM As Recordset
Dim rsY As Recordset
Dim lngID As Long
Dim Mcr As String
Dim Ycr As String
Dim strCriteria As String
If IsNull([Forms]![F_Reports_Slct]![YrSlct]) Or IsNull([Forms]![F_Reports_Slct]![MnthSlct]) Then
MsgBox "please enter data"
Cancel = True
Else
Set db = CurrentDb
Set qdM = db.QueryDefs("QC_MonthlyAm4CuID_Tr")
Set qdY = db.QueryDefs("QC_YrlyAm4CuID_Tr")
qdM.Parameters(0).Value = [Forms]![F_Reports_Slct]![YrSlct].Value
qdM.Parameters(1).Value = [Forms]![F_Reports_Slct]![MnthSlct].Value
qdY.Parameters(0).Value = [Forms]![F_Reports_Slct]![YrSlct].Value
qdY.Parameters(1).Value = [Forms]![F_Reports_Slct]![MnthSlct].Value
Mcr = qdM.Parameters(1).Value
Ycr = qdM.Parameters(0).Value
Set rs = db.OpenRecordset("T_CrofServices", dbOpenDynaset)
Set rsM = qdM.OpenRecordset(dbOpenDynaset)
Set rsY = qdY.OpenRecordset(dbOpenDynaset)
msg1 = MsgBox("sure?", vbYesNo + vbExclamation, "Are You Sure?")
If msg1 = vbNo Then
Cancel = True
ElseIf msg1 = vbYes Then
If Not rsM.BOF Then
rsM.MoveFirst
Do Until rsM.EOF
lngID = rsM!CuId & Mcr & Ycr
strCriteria = rs!TrDtCuID = " & lngID"
rs.FindFirst strCriteria
If rs.NoMatch Then
rs.AddNew
Else
rs.Edit
End If
rs![CuId] = rsM![CuId]
rs![CollectorID] = rsM![CollectorID]
rs![Amount] = rsM![MonthlyAm]
rs![DateofCr] = rsM![DateofCr]
rs![TrDtCuID] = rsM!CuId & Mcr & Ycr
rs![TrDt] = rsM![DtTr]
rs.Update
rsM.MoveNext
Loop
End If
If Not rsY.BOF Then
rsY.MoveFirst
Do Until rsY.EOF
lngID = rsY!CuId & Mcr & Ycr
strCriteria = "[TrDtCuID]=' & lngID'"
rs.FindFirst strCriteria
If rs.NoMatch Then
rs.AddNew
Else
rs.Edit
End If
rs![CuId] = rsY![CuId]
rs![CollectorID] = rsY![CollectorID]
rs![Amount] = rsY![YrlyAm1]
rs![DateofCr] = rsY![DateofCr]
rs![TrDtCuID] = rsY!CuId & Mcr & Ycr
rs![TrDt] = rsY![DtTr]
rs.Update
rsY.MoveNext
Loop
End If
rs.close
rsM.close
rsY.close
Set rs = Nothing
Set rsM = Nothing
Set rsY = Nothing
Set db = Nothing
Set qdM = Nothing
Set qdY = Nothing
MsgBox "Done.", vbInformation, "Succeed"
End If
End If
解决方案
我想我的标准有些问题。
是的。如果您想使用 Long 或 String,您必须下定决心。在这里,您在这些之间来回转换:
lngID = rsM!CuId & Mcr & Ycr
strCriteria = rs!TrDtCuID = " & lngID"
此外,它应该是:
strCriteria = "TrDtCuID = " & lngID & ""
或者,如果您将 ID 转换为字符串:
strCriteria = "TrDtCuID = '" & strID & "'"
推荐阅读
- ruby-on-rails - 无法在 ubuntu for windows (wls) 上下载 heroku
- python - 如何在 Alfred Workflows 中将参数传递给 Python 脚本
- ssh - 建议重新启动后无法通过 ssh 连接到计算引擎
- c++ - “无法开始调试。没有进程与此对象关联。” - 在 Visual Studio Code 中使用 GDB 和 openOCD 的 STM32F4
- awk - AWK,用引号括起来的逗号分隔字段
- java - JavaFX FXML 应用程序不会运行
- azure - 通过powershell意外删除了Azure Multi-factor Auth客户端服务主体,如何恢复?
- ruby-on-rails - rails bootstrap modal没有关闭
- java - 使用休眠的存储过程
- go - How to generate entropy by myself? - RSA Golang