-1
SELECT Orders.PO_No, Orders.Order_No
FROM DBase.dbo.Orders Orders
Where Orders.PO_No = (Select Top 1 Orders.PO_No From Orders Where Order_No = ?)

特に使用する場合

SELECT Orders.PO_No, Orders.Order_No
FROM DBase.dbo.Orders Orders
Where Orders.PO_No = (Select Top 1 Orders.PO_No From Orders Where Order_No = '555555')

値を返します。Sheet1のセル$A$ 1にユーザーが入力した値を使用して、このクエリをどのように記述できますか?[定義中のコマンドテキスト]と[SQLステートメント]ボックスの下のMSQuery内の両方にあります。

コマンドテキストフィールドと?を使用する場合 Parameter1と呼ばれる新しいパラメーターを取得しますが、Parameter1の値を=セルに設定すると、次のエラーが発生します。

[Microsoft] [ODBCSQLServerドライバー]構文エラーまたはアクセス違反

[Microsoft] [ODBCSQLServerドライバー]無効な記述子インデックス

セルの値が555555であることを確認しましたが

4

3 に答える 3

0

申し訳ありませんが、これをテストするためのSQLServerが手元にありませんが、Jeffがコメントしたように、文字列が予期されているときにLongを渡していると思います。これを試して

Where Orders.PO_No = (Select Top 1 Orders.PO_No From Orders Where Order_No = "'" & ? & "'")

その構文が正しいかどうかはわかりませんが、基本的に疑問符を引用符で囲む必要があります。Excelは疑問符があるSQLステートメントに値を入れているだけなので、セルの書式設定は機能しません。セルの値は評価されず、文字列の引用符や日付のハッシュなどが含まれます。セルの値が(数値のように見える文字列ではなく)文字であったとしても、一重引用符がないため、SQLは機能しません。

おもう。

于 2013-03-06T15:37:46.403 に答える
0

私は、超高速で変更が簡単な次のVBAを思いつきました。

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$A$1" Then
        With Range("Table_Query_from_DBase_1[[#Headers],[PO_No]]").ListObject.QueryTable
        .CommandText = Array( _
        "SELECT Orders.PO_No, Orders.Order_No" & Chr(13) & "" & Chr(10) & "FROM DBase.dbo.Orders Orders" & Chr(13) & "" & Chr(10) & "Where Orders.PO_No =(Select Top 1 Orders.PO_No From Orders Where Order_No = '" & Range("A1").Value & "')" _
                   )
        End With
    End If
End Sub

セルA1に新しい値が入力されると、コードはCommandText(Selectステートメント)を自動的に変更します。

また、Withコマンドを使用すると、パラメータを変更して自動的に更新するなど、さらに多くの機能を含めることができます。

.Refresh BackgroundQuery:=False 

EndWithの前。

CommandTextが変更されたときに変更するには、これをボタンに割り当てられたマクロに配置するか、ワークシートの更新またはほぼ無限の量の変数に配置します。

于 2013-03-06T17:09:44.163 に答える
0

user2140261のソリューションと同様に、worksheet_changeイベントを使用して変更をトリガーします。

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$A$1" Then
        With ActiveSheet.Range("Table_Name").ListObject.QueryTable
            .CommandText = ChangeParameter(.CommandText, "ParameterFlag", Range(Target.Address))
        End With
        ActiveWorkbook.RefreshAll
    End If
End Sub

上記では、$ A $ 1は動的情報(日付など)の場所であり、SQLテーブルはTable_Nameであり、ParameterFlagは置換するSQLコード内のパラメーターです(以下を参照)。これは、SQLコードを変更するために使用されるChangeParameter関数です。

Function ChangeParameter(src As String, parameter As String, newValue As String)
    'Replace src text surrounded by startParameter and endParameter with newValue

    Dim startPosn As Long, endPosn As Long
    Dim startParameter As String, endParameter As String

    startParameter = "/*<" & parameter & ">*/"
    endParameter = "/*</" & parameter & ">*/"
    startPosn = 0
    Do
        startPosn = InStr(startPosn + 1, src, startParameter)
        If startPosn Then
            endPosn = InStr(startPosn + Len(startParameter), src, endParameter)
            If endPosn Then
                src = Left(src, startPosn + Len(startParameter) - 1) & newValue & Mid(src, endPosn)
            Else
                Exit Do
            End If
        End If
    Loop While startPosn
    ChangeParameter = src
End Function

目的のSQLコードが次の場合、たとえば次のようになります。

SELECT * FROM mytable WHERE startDate > '7/1/2015'

次に、これをコマンドテキストボックスで編集して次のようにします。

SELECT * FROM mytable WHERE /*<StartDate>*/'7/1/2015'/*</StartDate>*/

そして、呼び出し線は次のようになります。

.CommandText = ChangeParameter(.CommandText, "StartDate", "'" & Range(Target.Address) & "'")

(日付は定数としてコードに格納されるため、スプレッドシートの値を一重引用符で囲む必要があります)。/* */行の途中にある場合でも、囲まれたコメントは無視されるため、これはすべて機能します。通常、コーディング方法は不十分ですが、ここでは役立ちます。

/*<StartDate>*/パラメータフラグ(この場合は)で囲まれた元のSQLコード内のすべての場所は/*</StartDate>*/、新しい値(この場合は "'"&Range(Target.Address)& "'")に置き換えられます。次にターゲットセル$A$ 1が変更されると、呼び出しが再度実行され、以前の値が何であったかを知る必要なしにパラメーターが再度変更されます。

ChangeParameterの複数の呼び出しは、変更するパラメーターごと、および変更するパラメーターを含むSQLベースのテーブルごとに使用できます。

もちろん、パラメータの置換が複雑なコードで機能する場合は、これは必要ありません...

于 2016-05-31T23:06:52.193 に答える