【问题标题】:MS Access VBA issueMS Access VBA 问题
【发布时间】:2016-03-11 22:06:13
【问题描述】:

我正在 MS Access 中制作报告 - 我在这里要做的基本上是将查询附加到我已经创建的表中 - 我选择第一个值,更改它并更新表。我遇到的问题是 - 此报告将由 VB6 应用程序使用。所以用户根本不会看到 Access。

我的追加查询需要USER ID 才能运行(4 位数字)。通常,当我在 Access 中运行报告时,我会将参数传递给 Access 中的表单 - 并使用它们来运行查询。但是,在这种情况下,我需要用户在附加查询时输入一个值,此外,在 VBA 中附加一个查询时,它首先会说 "You are about to append a query, are you sure" (或类似的东西),所以有没有办法自动化它好吧,所以当我附加它时,什么都没有发生?

这是我在tempTable 中添加和选择日期的代码:

CurrentDb.Execute "DELETE from [tempCompanyMgmt-NOW];"
DoCmd.OpenQuery "qryCompanyMgmt-SUE" - i made this append!
Set rs1 = CurrentDb.OpenRecordset("Select * from [tempCompanyMgmt-NOW]", , dbOpenDynamic)

所以只要我按 OK,当我收到 APPEND 进程的通知并输入 USER ID 的参数时按 YES - 一切正常。

【问题讨论】:

    标签: vba ms-access parameters append


    【解决方案1】:

    看起来你的markdown中有一个错字,第二行应该是:

    DoCmd.OpenQuery "qryCompanyMgmt-SUE - i made this append!"
    

    您需要删除qryCompanyMgmt-SUE - i made this append! 查询中对表单的引用,并将其替换为参数名称。您可以使用 Access 接口向查询显式添加参数子句,然后使用 VB6 中的 ADO(或 DAO),在打开/执行查询之前设置参数值。

    "You are about to append a query, are you sure" 消息是 Access 功能(可以禁用),因此如果您希望 VB6 应用程序提供此类警告,则需要使用 MsgBox 自己创建它。

    【讨论】:

    • 它不应该说“我做了这个附加”
    【解决方案2】:

    一种选择是将附加查询放入代码中并以这种方式填写参数。

    我不知道你的确切情况,但类似:

    If not isValidUserID(me.UserID) Then
        msgbox "Please enter a a valid user id"
        exit sub
    End If
    
    
    
    Dim strSQL As String
    strSQL = "DELETE * from [tempCompanyMgmt-NOW];"
    CurrentDb.Execute strSQL, dbFailOnError
    
    
    strSQL = "INSERT INTO tempCompanyMgmt-NOW ( FieldName1, FieldName2, FieldName3 ) " & _
            "SELECT FieldName1, FieldName2, FieldName3 FROM tempCompanyMgmt WHERE UseriD=" & Me.UserID
    
    CurrentDb.Execute strSQL, dbFailOnError
    

    要验证用户 ID,您可以执行以下操作:

    If (Len(me.UserID) = 4 And IsNumeric(me.UserID)) Then
    

    Public Function isValidUserID(varUserID As Variant) As Boolean
    Dim blnRet As Boolean
    
    If Len(varUserID) = 4 And IsNumeric(varUserID) Then
        blnRet = True
    End If
    
    isValidUserID = blnRet
    End Function
    

    【讨论】:

    • 这看起来像是等待发生的 SQL 注入攻击。使用用户输入的字符串构建 SQL 是一个坏主意。访问是沙盒的,但这仍然不是一个好的做法,因为您最终可能会得到不一致的数据。想象一下,如果 strEmpName 是 "' OR Is Null OR Like '*"
    • 我进行了编辑以更准确地反映用户 ID 场景。 SQL 注入攻击没有问题,因为只接受 4 位数字数据。
    • 我不需要验证它。我需要在 Access 中引用最初传递值的表单。我将它传递给 frmInfo 用户 ID
    【解决方案3】:

    为了摆脱 MsgBox 告诉我我即将附加一个查询,我在打开附加查询之前将其包含在我的模块中..

    DoCmd.SetWarnings False
    

    我意识到,一旦我将值传递给表单 (userID),当我的查询被附加时,该值就会作为参数传递。所以一切就绪。感谢大家的帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多