0

我有一个表单,允许用户查看 LinkRef 字段等于指定值的所有记录,以及 Clearance Applying For 或 Clearance Level 某个值。

LinkRef 是使用 OpenArgs 从之前的表单中提取的用户 ID。我目前拥有的 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

为这个冗长的问题道歉,希望所有的细节都是必要的,而且是有道理的,任何建议都非常感谢!

4

2 回答 2

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

抱歉,这里无法测试,所以可能有点问题。如果有问题我明天检查

于 2014-06-17T20:09:24.220 回答
0

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

于 2014-06-18T09:07:47.167 回答