【问题标题】:Pass-through query with user input as filter criteria - MS Access以用户输入作为过滤条件的直通查询 - MS Access
【发布时间】:2014-04-23 12:05:27
【问题描述】:

我目前在 Access 中有一个用户界面(一个表单),其中有两个组合框,指的是一个季度的特定日期。表单值是从 SQL SERVER 2008 的直通查询中查询的。

有什么方法可以编写一个传递查询,该查询将在 where 条件下使用表单值。

例如: 插入 TBL.ABC SELECT * FROM TBL.DEF where [Date]=Formvalue

经过所有的研究,我什至已经解决了 Stackoverflow 中发布的几个问题,但找不到答案。这甚至可能吗??

这样做的主要动机是根据输入作为“FormValue”的形式将数据分成两个不同的表,然后根据日期执行不同的操作。

如果您需要更多信息,请告诉我。非常感谢任何帮助!

Private Sub Command13_Click()
Dim St001, St002 As String
Dim conn As ADODB.Connection
Dim strPath As String
Dim strDate As String
Set conn = CurrentProject.Connection

strPath = "ServerName"
'conn.Open = "ODBC;DRIVER=SQL Server;SERVER=" & strpath & ";
'             DATABASE=DB;UID=ABC;PWD=DEF;Trusted_Connection=No;"

'DoCmd.OpenQuery "003a Drop Curr_Qtr"
strDate = curQtr & ""
StrDate2 = prevQtr & ""

       ' If combo box is empty?
If strDate = "" Then
        MsgBox "The Curr Qtr Date value is Empty, Please select the date"
ElseIf StrDate2 = "" Then
        MsgBox "The Date Prev Qtr Date value is Empty, Please select the date"
Else
    ' Append values

DoCmd.OpenQuery "003a Drop Curr_Qtr"

'On Error Resume Next
St002 = "SELECT COLUMNS into TblB from TblA where ColA='" & strDate & "'
DoCmd.RunSQL St002

作为 scuh,我在代码中引用的所有表都是链接表。我尝试按照其中一种形式的建议使用以下格式的代码,但始终弹出相同的错误:

    Dim St001, St002 As String
    Dim conn As ADODB.Connection
    Dim strPath As String
    Dim strDate As String
    Set conn = CurrentProject.Connection

    strPath = "ServerName"
    'conn.Open = "ODBC;DRIVER=SQL Server;SERVER=" & strpath & ";DATABASE=DBName;
    '       UID=Username;PWD=password;Trusted_Connection=No;"

    'DoCmd.OpenQuery "003a Drop table"
    strDate = curQtr & ""
    StrDate2 = prevQtr & ""


       ' If combo box is empty?
    If strDate = "" Then
            MsgBox "The Curr Date value is Empty, Please select the date"
    ElseIf StrDate2 = "" Then
            MsgBox "The Prev  Date value is Empty, Please select the date"
    Else
        ' Append values

    DoCmd.OpenQuery "003a truncate table"

    'conn.Open = "ODBC;DRIVER=SQL Server;SERVER=" & strPath & ";DATABASE=009;
    '       UID=GM_SA;PWD=gmsa;Trusted_Connection=No;"

    'On Error Resume Next

 St002 = "Insert Into [Tabl B] ([Tabl B].[ColA]" & _
 "Select [Tabl A].[Col A] from [tabl A].[Col A] where [Tabl A].[Col z]='" & strDate & "'"

 strCon = "ODBC;DRIVER=SQL Server;SERVER=" & strPath & ";DATABASE=DBName;UID=UserName;" _
    & "PWD=Password;Trusted_Connection=No"
    Set wksp = DBEngine(0)
    Set dabs = wksp.opendatabase("", False, False, strCon)
    dabs.Execute St002, dbSQLpassThrough

    End If
    End Sub

【问题讨论】:

    标签: sql sql-server-2008 ms-access vba pass-through


    【解决方案1】:

    在确保您引用 Microsoft ActiveX Data Objects 2.8 Library 后,尝试以下操作

    Dim adoConn As ADODB.Connection
    ...
    St002 = "Insert Into [Tabl B] ([ColA]) Select [Tabl A].[Col A] from [tabl A].[Col A] where [Tabl A].[Col z]='" & FORMAT(strDate,"yyyy-mm-dd") & "'"
    strCon = "ODBC;DRIVER=SQL Server;SERVER=" & strPath  & ";DATABASE=DBName;UID=UserName;PWD=Password;Trusted_Connection=No"
    adoConn.Open(strCon)
    adoConn.Execute St002
    

    在将查询直接传递到服务器时,使用 ADO 而不是 DAO 通常是更好的选择,它应该完全绕过类似于“RUNTIME ERROR 3024 - 找不到文件'H:\TableName.Mdb”的任何错误可能性

    此外,如果您需要来自绑定列以外的组合列的值,请使用Me.DateCombo.Column(1) 或类似名称。 Access 使用从 0 开始的索引,因此Me.DateCombo.Column(1) 指的是第二列。

    【讨论】:

    • 这是否适用于直通查询??当我尝试使用建议的查询时,vba 无法识别数据库(我的假设),因为返回错误“RUNTIME ERROR 3024 - 找不到文件'H:\TableName.Mdb”。我不确定原因
    • 请发布您正在使用的代码。您似乎打算使用直通查询,但 Access 认为您正在尝试查询 it,而不是 SQL Server。
    • 是的,同意 Monty Wild 的观点,即需要更多信息。建议您编辑上面的帖子以包含有效的查询版本。然后我们可以建议根据用户输入生成它的方法。
    • 请按照建议找到附加的代码!我一直在尝试各种方法来解决这个问题,但似乎没有任何效果
    • 我还上传了我在某个论坛中遇到的 chaged 代码,但它似乎也不起作用.. @MontyWild:我很抱歉延迟上传代码跨度>
    猜你喜欢
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    相关资源
    最近更新 更多