2017-06-01 26 views
0

MS Accessデータベースに複数のクエリがあります。これらのパラメータのいくつかはパラメータを使用します。私は、これらのパラメータでクエリを提供するために、VBAで次のコードを使用しますSQL ServerへのパススルークエリでのVBAパラメータへのアクセス

VBA

Dim startDate As Date 
Dim endDate As Date 

Dim dbs As DAO.Database 
Dim qdf As DAO.QueryDef 
Dim rst As DAO.Recordset 

If IsNull(Me.dpFrom) Or IsNull(Me.dpTo) Then 
    MsgBox "Please select a date!" 
ElseIf (Me.dpFrom.Value > Me.dpTo.Value) Then 
    MsgBox "Start date is bigger than the end date!" 
Else 
    startDate = Me.dpFrom.Value 
    endDate = Me.dpTo.Value 

    Set dbs = CurrentDb 

    'Get the parameter query 
     Set qdf = dbs.QueryDefs("60 Dec") 

     'Supply the parameter value 
     qdf.Parameters("startDate") = startDate 
     qdf.Parameters("endDate") = endDate 

     'Open a Recordset based on the parameter query 
     Set rst = qdf.OpenRecordset() 

      'Check to see if the recordset actually contains rows 
     If Not (rst.EOF And rst.BOF) Then 
      rst.MoveFirst 'Unnecessary in this case, but still a good habit 
      Do Until rst.EOF = True 
       'Save contact name into a variable 
       Me.tbBUDdec.Value = rst!Som 
       rst.MoveNext 
       Me.tbLEYdec.Value = rst!Som 
       rst.MoveNext 
       Me.tbMDRdec.Value = rst!Som 
       rst.MoveNext 
       Me.tbODCdec.Value = rst!Som 
       rst.MoveNext 
      Loop 
     Else 
      MsgBox "There are no records in the recordset." 
     End If 
     rst.Close 'Close the recordset 
     Set rst = Nothing 'Clean up 

これが正常に動作している

PARAMETERS startDate DateTime, endDate DateTime; 
SELECT WarehouseCode, COUNT(DeliveryPoint) AS Som 
FROM [50 resultaat] 
WHERE EntryDate between [startDate] and [endDate] 
GROUP BY WarehouseCode; 

アクセスのクエリ。しかし、私は現在、同じコードを使用してSQL Serverにパススルークエリを呼び出そうとしています。このクエリは、パラメータを宣言し、設定する別の構文を使用します。

SQL Serverクエリ

DECLARE @InvLineEntryDateBegin AS date 
DECLARE @InvLineEntryDateEnd AS date 
SET @InvLineEntryDateBegin = '2017-01-01' 
SET @InvLineEntryDateEnd = '2017-05-31' 

Select WarehouseCode, Count(PickOrderNr) as Som 
FROM (bla bla bla ... 

私は私のVBAコードは異なるSQL構文で動作させることはできません。私はいくつかの選択肢を読んだが、具体的なものは見つけられなかった。誰もこのクエリ構造についての経験はありますか?

他の言葉:VBAでは、SQLサーバーでクエリを実行するストアドプロシージャにどのようにパラメータを挿入できますか?

+0

CurrentDb.QueryDefs("q_PTO_SubmitNewRequest")

.SQL = strSQL 

エンドに含めるでしたか?それは貧弱なアプローチのようです。 –

+0

このソリューションを参照してください:https://stackoverflow.com/questions/24248870/calling-stored-procedure-while-passing-parameters-from-access-module-in-vba –

答えて

0

パススルークエリで正しいことがわかったら、実行するエンジンに直接クエリ定義を渡しています。したがって、Access VBA構文の代わりにSQL Server構文をクエリに使用する必要があります。試してみてください。

また、同じことがストアドプロシージャにも適用されます。 SSMSで実行するような構文を使用します。

"exec sp_mysp var1 var2"などです。

2

SQL Serverに存在する名前付きストアドプロシージャを構築し、パラメータ化を必要とするため、現在のDAOメソッドではなくADOを使用してMS Accessがパラメータを渡すようにしてください。その後、レコードセットに結果をバインド:

SQL Serverの単純Accessでパスかかわらクエリを作成し、それを保存PROC

CREATE PROCEDURE myStoredProc 
    @InvLineEntryDateBegin DATE = '2017-01-01', 
    @InvLineEntryDateEnd DATE = '2017-05-31' 
AS 

BEGIN 
    SET NOCOUNT ON;  

    SELECT WarehouseCode, Count(PickOrderNr) as Som 
    FROM (bla bla bla ... ; 

END 

VBA

' SET REFERENCE TO Microsoft ActiveX Data Object #.# Library 
Dim conn As ADODB.Connection, cmd As ADODB.Command, rst As ADODB.Recordset 
Dim startDate As Date, endDate As Date 

If IsNull(Me.dpFrom) Or IsNull(Me.dpTo) Then 
    MsgBox "Please select a date!", vbCritical, "MISSING DATE" 
    Exit Sub 
End if  
If (Me.dpFrom.Value > Me.dpTo.Value) Then 
    MsgBox "Start date is bigger than the end date!", vbCritical, "INCORRECT RANGE" 
    Exit Sub 
End if 

startDate = Me.dpFrom.Value: endDate = Me.dpTo.Value 

' OPEN CONNECTION 
Set conn = New ADODB.Connection   
conn.Open "DRIVER={SQL Server};server=servername;database=databasename;UID=username;PWD=password;" 

' OPEN/DEFINE COMMAND OBJECT 
Set cmd = New ADODB.Command  
With cmd 
    .ActiveConnection = conn 
    .CommandText = "myStoredProc" 
    .CommandType = adCmdStoredProc 

    ' BIND PARAMETERS 
    .Parameters.Append .CreateParameter("@InvLineEntryDateBegin", adDate, adParamInput, 0, startDate) 
    .Parameters.Append .CreateParameter("@InvLineEntryDateEnd", adDate, adParamInput, 0, endDate) 
En With 

' BIND RESULTS TO RECORDSET 
Set rst = cmd.Execute 
... 
1

を保管していました。

PTクエリが機能していることを確認してください。それは、おそらく次のようになります。

ExecのMySpName「2017年1月1日」、「2017年5月31日」再び

:100%あなたがアクセスしてそれをクリックしたときに、クエリが動作することを確認してください。この時点では、VBAコードは書かれていません。

あなたは上記のクエリの作業を通過したら、その後、VBAでこれを行うことができます。

Dim strStartDate As String 
Dim strEndDate  As String 
Dim strSQL   As String 

strStartDate = "'" & Format(Me.dpFrom, "yyyy-mm-dd") & "'" 
strEndDate = "'" & Format(Me.dpTo, "yyyy-mm-dd") & "'" 


strSQL = "exec MyStoreProc " & strStartDate & "," & strEndDate 

With CurrentDb.QueryDefs("QryMyPass") 

    .SQL = strSQL 
    Set rst = .OpenRecordset 

End With 
0

アルバートKallalからの返信は、上のスポットでした。ありがとうアルバート。私はサインアップした後にコメントしようとしましたが...コメントするには十分なポイントがありませんでした...これが経由することを望んで....

私が変更さ唯一の事だった....

私はこれを掲示するために再びCurrentDb.QueryDefs("q_PTO_SubmitNewRequest").Execute

おかげで...とSet rst = .OpenRecordset を置き換えます。本当に大きな助けとなりました。私は何年も前に多くの複雑な.adpプロジェクトを持ち、同様の機能を必要とするクライアントと協力しています。パススルークエリを使用して.adp機能をミラーリングできるようです。あなたがを支援するクエリ以外のポストのすべてを非常にクールな:)

CurrentDb.QueryDefs("q_PTO_SubmitNewRequest").Execute 
関連する問題