首页 > 解决方案 > 如果为真则更新,如果为假则添加新的,标准问题

问题描述

这就是我想要的:当我选择月份和年份然后单击 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

标签: vbams-access

解决方案


我想我的标准有些问题。

是的。如果您想使用 Long 或 String,您必须下定决心。在这里,您在这些之间来回转换:

    lngID = rsM!CuId & Mcr & Ycr
    strCriteria = rs!TrDtCuID = " & lngID"

此外,它应该是:

    strCriteria = "TrDtCuID = " & lngID & ""

或者,如果您将 ID 转换为字符串:

    strCriteria = "TrDtCuID = '" & strID & "'"

推荐阅读