访问VBA:如果值运行两个查询,如果不运行一个

时间:2019-03-14 14:51:55

标签: sql vba ms-access

我拥有并插入和更新查询。

我想创建一个同时运行插入查询或更新和插入查询的按钮。

在表单上:

如果cbx =值x,y或z,请运行插入并更新。

如果cbx不等于x,y或z值,则只运行插入操作。

到目前为止,我有:

IF (Cbx=X OR Cbx =Y or cbx =Z) Then

Currentdb.execute("updateQuery")

Currentdb.execute("inserQuery")

ELSEIF (Cbx<>X OR Cbx <>Y or cbx <>Z) THEN

CurrentDB.execute("insertQuery")

ElSE

end if

当我运行它时,表陷入了一个连续的写入/编辑循环。

SQL

 UPDATE
      tbsurveypersonnel
SET       tbsurveypersonnel.removedDate = DATE()
WHERE
      (
                (
                          (
                                    tbsurveypersonnel.[sr]
                          )
                          =[Forms]![fatbSurveyPersonnelSetRoles]![sr]
                )
                AND
                (
                          (
                                    tbsurveypersonnel.[role]
                          )
                          =[Forms]![fatbSurveyPersonnelSetRoles]![role]
                )
      )
;

INSERT INTO tbsurveypersonnel
      (
                sr
              , lfname
              , role
              , aDate
      )
      VALUES
      (
                (
                          (
                                    tbsurveypersonnel.[sr]
                          )
                          =[Forms]![fatbSurveyPersonnelSetRoles]![sr]
                )
              , ((tbsurveypersonnel.[lfname])=[Forms]![fatbSurveyPersonnelSetRoles]![lfname])
      )
    ,
       (
                (
                          tbsurveypersonnel.[role]
                )
                =[Forms]![fatbSurveyPersonnelSetRoles]![role]
      )
), DATE()

最终

Private Sub AssignRole_Click()

Dim strSql As String
Dim strlSQL2 As String

strSql = "UPDATE tbsurveypersonnel SET tbsurveypersonnel.removedDate = Now() " & vbCrLf & _
     "WHERE removedDate is Null and (((tbsurveypersonnel.[sr])=[Forms]![fatbSurveyPersonnelSetRoles]![sr]) AND ((tbsurveypersonnel.[role])=[Forms]![fatbSurveyPersonnelSetRoles]![role]));"

strSQL2 = "INSERT INTO tbsurveypersonnel ( sr, lfname, role, assigndate ) " & vbCrLf & _
      "SELECT [forms].[fatbSurveyPersonnelSetRoles].[sr] AS Expr1, [forms].[fatbSurveyPersonnelSetRoles].[lfName] AS Expr2, [forms].[fatbSurveyPersonnelSetRoles].[role] AS Expr3, Now() AS Expr4;"

If (Me.role = 1 Or Me.role = 2 Or Me.role = 3) Then

DoCmd.RunSQL strSql

DoCmd.RunSQL strSQL2

Else

DoCmd.RunSQL strSQL2

End If

DoCmd.RunCommand acCmdSaveRecord
DoCmd.Requery

End Sub

3 个答案:

答案 0 :(得分:1)

回答原始问题:

  

如果cbx =值x,y或z,请运行插入并更新。

所以你想要这个:

IF (Cbx=X OR Cbx=Y OR cbx=Z) Then
    Currentdb.execute("updateQuery")
    Currentdb.execute("inserQuery")
ELSE
    CurrentDB.execute("insertQuery")
end if

答案 1 :(得分:0)

您无需再问同样的问题。

If 'this criteria is met
Then

'Do some code

Else

'Do something else

End If

所以在实践中:

IF (Cbx<>X OR Cbx <>Y or cbx <>Z) Then

Currentdb.execute("updateQuery")
Currentdb.execute("inserQuery")

ELSE 

CurrentDB.execute("insertQuery")

END IF

答案 2 :(得分:0)

每次创建数据库副本(通常是实例,而不是引用!)(通常是DbEngine(0)(0))时,避免多次调用CurrentDb,这通常是不需要的,并且会引起错误。 / p>

更好地将实例存储在变量中或扩展其范围。

With CurrentDb
  If (Cbx=X Or Cbx=Y Or Cbx=Z) Then
    .Execute("updateQuery", dbFailOnError)
  End If
  .Execute("insertQuery", dbFailOnError)
End With

由于insertQuery始终执行,因此只需检查是否需要执行updateQuery