Access SQL中的RecordSource

时间:2014-06-17 17:34:26

标签: sql vba ms-access access-vba openargs

我有一个表单,允许用户查看LinkRef字段等于指定值的所有记录,以及清除申请或清除级别的特定值。

LinkRef是一个用户ID,使用上一个表单中的OpenArgs引入。我目前的form_load代码是:

Private Sub Form_Load()

    'MsgBox Me.OpenArgs

    Me.C_LinKRef = Me.OpenArgs
    Me.chbToggleEdit.Value = False

    'MsgBox Me.C_LinKRef

    Dim mySQL As String
    mySQL = _
    "Select * " & _
    "From TabClearDetail " & _
    "Where (C_LinKRef = " & Me.C_LinKRef & ") " & _
    "And ([Clearance Applying For] = 'BPSS' " & _
          "Or [Clearance Applying For] = 'BPSS (EDF)' " & _
          "Or [Clearance Applying For] = 'BPSS (Magn)' " & _
          "Or [Clearance Applying For] = 'BPSS (Sella)' " & _
          "Or [Clearance Applying For] = 'BPSS Equiv' " & _
          "Or C_ClearanceLevel = 'BPSS' " & _
          "Or C_ClearanceLevel = 'BPSS (EDF)' " & _
          "Or C_ClearanceLevel = 'BPSS (Magn)' " & _
          "Or C_ClearanceLevel = 'BPSS (Sella)' " & _
          "Or C_ClearanceLevel = 'BPSS Equiv' " & _
          "Or C_ClearanceLevel = 'DESTROYED' " & _
          "Or C_ClearanceLevel = 'Lapsed' " & _
          "Or C_ClearanceLevel = 'NOT_FLWDUP' " & _
          "Or C_ClearanceLevel = 'NOT_SPECIFIED' " & _
          "Or C_ClearanceLevel = 'Refused' " & _
          "Or C_ClearanceLevel = 'Withdrawn');"

    Me.RecordSource = mySQL

    'MsgBox Me.RecordsetClone.RecordCount

End Sub

当匹配记录时,mySQL似乎表现得如此。但有时候不会有任何记录,因为指定的人没有任何这些许可级别并且没有申请,所以我希望表格空白或留言似乎说没有匹配的记录。

目前,如果没有匹配的记录,表单将拉入LinkRef,但用完全不同的记录中的值填充所有其他文本框(它似乎是我查看的最后一条记录)。不确定如何解决这个问题,我试图使用RecordsetClone.RecordCount来说明它是否等于0然后是msgbox,但似乎要做到这一点,因为它似乎总是找到至少1个条目,即使有应为0,它已经使用来自另一个字段的数据填充了文本框,因此找到了1。

LinkRef文本框是从OpenArgs填充的。所有其他文本框都使用一个查询来填充,该查询在TabClearDetail表中查找并提取值。我开始认为我只是使用查询或仅使用代码更好,但我没有'确定如何在查询中使用OpenArgs,对于某些事情,它比查询更快地进行查询。

这是我在回复@Roland帖子时提到的保存对话框的代码。此代码在Form_Close()子中调用。

Private Sub SaveDialog()
Dim Msg, Style, Title As String
    Dim Response As Integer
    Msg = "Would you like to save your changes?"
    Style = vbYesNoCancel
    Title = "Save Changes"

    On Error GoTo Err_BackFromAddBPSSButton_Click
    Response = MsgBox(Msg, Style, Title)
    If Response = vbYes Then
        'DoCmd.Close
        DoCmd.OpenForm ("Basic Personal Information")
    Else
    If Response = vbNo Then
        Me.Undo
        'DoCmd.Close
        DoCmd.OpenForm ("Basic Personal Information")
    End If
    End If


Exit_BackFromAddBPSSButton_Click:
    Exit Sub

Err_BackFromAddBPSSButton_Click:
    MsgBox Err.Description
    Resume Exit_BackFromAddBPSSButton_Click
End Sub

对这个非常罗嗦的问题道歉,希望所有细节都是必要的,这是有道理的,任何建议都非常感激!

2 个答案:

答案 0 :(得分:1)

尝试更改事件的顺序:

不要先设置TextBox值。将OpenArgs传递给mySql字符串。使用mySql在VBA(OpenRecordset)中打开记录集并执行RecordCount。如果为零,则将Recordsource设置为SELECT * FROM TabClearDetail WHERE 1=2。否则将mySQl设置为Recordsource(或传递Recordset)。然后才设置TextBox和CheckBox。

Private Sub Form_Load()

    Dim i as Integer
    i = Me.OpenArgs

    Dim mySQL As String
    mySQL = _
    "Select * " & _
    "From TabClearDetail " & _
    "Where (C_LinKRef = " & Me.C_LinKRef & ") " & _
    "And ([Clearance Applying For] IN ('BPSS','BPSS (EDF)','BPSS (Magn)','BPSS Sella)','BPSS Equiv') " & _
          "Or C_ClearanceLevel IN ('BPSS','BPSS (EDF)','BPSS (Magn)','BPSS (Sella)','BPSS Equiv','DESTROYED','Lapsed','NOT_FLWDUP','NOT_SPECIFIED','Refused','Withdrawn'));"

   Dim rst as Recordset
   Set rst = CurrentDB.OpenRecordset(mySQL)
   rst.MoveLast
   rst.MoveFirst
   If rst.RecordCount = 0 then 
       Me.RecordSource = "SELECT * FROM TabClearDetail WHERE 1=2"
       Me.C_LinKRef = ""
       Me.chbToggleEdit.Value = False
   Else
       Me.RecordSource = mySQL
       Me.C_LinKRef = i
       Me.chbToggleEdit.Value = False
   End If

   rst.Close
   Set rst = Nothing

End Sub

抱歉,不能在这里测试,所以可能是一个小小的车。如果有任何问题我明天会检查

答案 1 :(得分:0)

使用查询并传递[Forms]![BPSS Clearance]。[OpenArgs]到它以及C_ClearanceLevel和Clearance Apply For的条件对我有用。不知道为什么代码不起作用,因为理论上它做同样的事情,但我有一个解决方案,所以我很开心。感谢所有建议

相关问题