【问题标题】:Reference table and form text box MS Access VBA参考表和表单文本框 MS Access VBA
【发布时间】:2020-07-05 22:14:53
【问题描述】:

请原谅下面的代码。我是 VBA 新手。我希望在单击表单按钮时通知客户,如果他们选择的项目已签出,他们必须进行另一个库选择。如果“1Transaction”表中最近日期的“签入日期”为 NULL,我确定已签出某些内容。请注意,每次签入和签出时,都会在 1Transaction 表中创建一条新记录,并且每条记录(无论是签入还是签出)都将包含签出日期信息。所以逻辑上,取租约(书)号的最近日期,如果没有归还日期,那么它仍然被签出。下面的代码旨在进行引用并在 VBA 中返回一个消息框,但我被卡住了。我从逻辑上理解我的要求,但我知道我的 VBA 语法非常不正确。谢谢。

Private Sub Check_Out()

 If [1Transactions].[Asset].Value = Me.Lease_Num
  And DMax([Tables]![1Transactions].[Check Out Date])
  And [Tables]![1Transactions].[Check In Date] = NULL
 Then MsgBox "The requested documents are currently checked out"
 End If
 DoCmd.OpenForm "Check In"

End Sub

注意:

  • 1Transactions = 包含所有签入/签出数据的表
  • Me.Lease_Num = 从组合框中提取的值,用户填写该值以提供他们有兴趣签出的“租约号”(图书代码)。

【问题讨论】:

    标签: vba ms-access ms-access-2010


    【解决方案1】:

    好的 - 与其尝试修改代码的每一行,我认为最好使用参数查询来简单地检查项目是否现在

    首先使用您的事务表创建一个查询 - 将 SQL 修改为以下 并将其保存为“qdfLease

    PARAMETERS [What Lease Num] Text ( 255 ); SELECT TOP 1
    [1Transactions].Asset, [1Transactions].[Check Out Date],
    [1Transactions].[Check In Date] FROM 1Transactions WHERE
    ([1Transactions].Asset = [What Lease Num]) And ([1Transactions].[Check
    In Date] Is Null) ORDER BY [1Transactions].[Check Out Date] DESC;
    

    将你的sub中的代码修改为:

    Dim qdf             As DAO.QueryDef
    Dim rs              As DAO.Recordset
    Dim strLeaseNum     As String
    
    strLeaseNum = nz(Me.Lease_Num,"")
    Set qdfLease = CurrentDb.QueryDefs("qdfLease")
    qdfLease.Parameters("What Lease Num") = strLeaseNum
    Set rs = qdfLease.OpenRecordset(dbOpenDynaset, dbReadOnly)
    If rs.EOF Then
        ' Item is Checked In
    Else
        ' Item is Checked Out
    End If
    rs.Close
    Set rs = Nothing
    

    【讨论】:

    • 谢谢。这是有道理的!
    【解决方案2】:

    你有[1Transactions].[Check Out Date].Value = Me.Lease_Num

    这就是你想要比较的 lease_num 吗?听起来它应该是 [1Transactions] 中的不同字段名称

    我会改变这个

    [Tables]![1Transactions].[Check In Date] = NULL

    到这里

    IsNull([Tables]![1Transactions].[Check In Date])

    你想在这里比较什么

    DMax([Tables]![1Transactions].[Check Out Date])

    【讨论】:

    • [1Transactions].[Check Out Date].Value = Me.Lease_Num 在这里,我试图对 1Transactions 表进行子集化,其中租约数等于客户在组合框中选择的值 (Me.lease_num) - DMax([Tables]![1Transactions].[Check Out Date]) 我在这里试图提取组合框中选择的租约号的最大日期 (Lease_Num) - 谢谢
    • 我的意思是...... 1Transactions 必须有一个 LeaseNum 字段不是吗?您为什么不使用它来与您的 Lease_Num 组合框进行比较?现在您正在将其与 [1Transactions].[Check Out Date].Value 进行比较 - 我假设它是日期而不是图书馆编号
    • 我明白你在说什么。道歉。漫长的一天。我实际上引用了 [1Transactions] 中的 Assets 字段。我的错别字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多