2017-11-09 9 views
0

メインフレームからデータを取得する呼び出されたSPにパラメータを動的に渡す必要があります。DB2メインフレームを呼び出すexcel 2013からストアドプロシージャにパラメータを動的に渡そうとしています

私のExcelの接続文字列は次のとおりです。

DRIVER={IBM DB2 ODBC DRIVER};UID=k9751x1;PWD=********;MODE=SHARE;DBALIAS=RISCTEST; 

コマンドテキストは次のとおりです。LPARSSIDDBNAMETSNAME:私は最初の3つのパラメータを渡すためにしようとしています

call K9751DB.SP_GETRTSDB_BYDBTSNOPTLIKEDTTM('', '', '','2017-10-01 23:25:59.999999','2') 

Connection Properties, for reference

次のVBAコードを作成し、activeXボタンを割り当てました。コードは正常にデバッグするように見えます。しかし、ボタンをクリックすると、表示されるように見えます。

Private Sub CommandButton1_Click() 
Dim LPARSSID As String 'Declare LPARSSID as String 
Dim DBNAME As String 'Declare DBNAME As String 
Dim TSNAME As String 'Declare TSNAME As String 

LPARSSID = Sheets("RTSbyDBTSDTE").Range("B2").Value 'Pass value from cell B2 to LPARSSID variable 
DBNAME = Sheets("RTSbyDBTSDTE").Range("B3").Value 'Pass value from cell B3 to DBNAME variable 
TSNAME = Sheets("RTSbyDBTSDTE").Range("B4").Value 'Pass value from cell B4 to TSNAME variable` 

Pass the Parameters values to the Stored Procedure used in the Data Connection 
With ActiveWorkbook.Connections("RISCTEST - ParmPass").ODBCConnection 
.CommandText = "call K9751DB.SP_GETRTSDB_BYDBTSNOPTLIKEDTTM('" & LPARSSID & "', '" & DBNAME & "', '" & TSNAME & "','2017-10-01 23:25:59.999999','2')" 
ActiveWorkbook.Connections("RISCTEST - ParmPass").Refresh 

End With 
End Sub 

Private Sub CommandButton21_Click() 

End Sub 

ODBCConnectionが正しいかどうかわかりません。

ご迷惑をおかけして申し訳ございません。

TKU、 ジェフA

+0

私はSQL Serverストアドプロシージャを呼び出すためにコードを使ってみましたが(私はDB2をテスト用に利用できませんでした)、うまくいきました。 –

答えて

0

私は複雑なレポートを実行するために私たちの怖い古い簿記システムを使用し、大きなMicrosoft Accessデータベースを持っています。 iSeries v6、DB2 SQL、およびAS400を使用したAccess 2007です。私は最初にExcel 2007を使ってみましたが、それを処理できませんでした。しかし、とにかく刺すつもりです...

WithブロックとRefreshメソッドを使っているかどうかはわかりません。私は通常、プロパティまたはオブジェクトで使用されるブロックを参照してください。しかし、あなたのブロックを見れば、そこには何もありません。それは何も起こらない理由かもしれません。それはちょうど...

With <yourcommand>.Refresh 
    'nothing here 
End With 

を言う...それは何かをすることができるが、ブロックでは空であることから、それが返される可能性のあるデータで何もしません。私はSPが何をすべきか分からないので、私は言うことができません。そして、私が意味するところは、データを返すことになっていると仮定しています。そうでないとサーバー上に隠されているものがあるだけなので、おそらくアクティビティを検証するための他の手段があるからです。それ自体で

代わりにブロックで使用するのでは、そのブロックからRefreshコマンドを削除し、行にコマンドを置く:

... 
    Pass the Parameters values to the Stored Procedure used in the Data Connection 
    ActiveWorkbook.Connections("RISCTEST - ParmPass").ODBCConnection _ 
    .CommandText = "call K9751DB.SP_GETRTSDB_BYDBTSNOPTLIKEDTTM('" & LPARSSID _ 
    & "', '" & DBNAME & "', '" & TSNAME & "','2017-10-01 23:25:59.999999','2')" _ 
    ActiveWorkbook.Connections("RISCTEST - ParmPass").Refresh 
End Sub 
+0

'With'ブロックは空ではありません。これは、指定されたConnectionの 'ODBCConnection'プロパティを参照し、' .CommandText'をセットし、 'Refresh'を実行します。 'Refresh'はおそらく' With'ブロックの外にあると私は同意しますが、私のテストはそれがどちらの方法でも動作するはずであることを示唆しています。 (少なくともそれは私のためにした。) –

+0

Ahh..ok。行折り返しでは、どこに何があるかを伝えるのは難しいです。だから、 'ActiveWorkbook.Connections(" RISCTEST - ParmPass ")。リフレッシュは、Withブロック内に単独で行にあります。 – spinjector

+0

* "Withブロック内では一本の線になっていますか?" * - これが私の解釈です。 –

0

申し訳ありません。これは長いです。あなたの質問への2番目の答え、そして私の最初の答えの延長。私の目は最後に疲れていた。奇妙なタイプミスや一見不足している文章は許してください。あなたの目が途中で釉薬をかけると、最後には実際の作業コード(私が望む)があります。

牛、これは雄牛です。しかし、私は鞍を投げ、私は最初にOPに答えた昨日の朝からそれを乗っていました。私は問題はDB2の奇妙さではないと思うが(私がまだ理解できない限り、笑)、ExcelがODBC、SQL、およびクエリを実装する方法のせいである。

私はこれを学習の練習にすることにしました。私はAccess VBAで一日中仕事をしていましたが、時折Excelに入ろうとしましたが、以前はExcelのクエリに夢中になったことはありませんでした。私は、ノーヘルプファイル、VBAオブジェクトエクスプローラ、およびMSDNのオンラインドキュメントを見てきました。しかし、それはまだ記念碑的に混乱していました。 https://www.cimaware.com/expert-zone/creating-basic-data-reports-with-listobjects-and-querytables

複数のExcel UIブランキングがあり、関連付けられたコレクションのVBAオブジェクト階層が&のオブジェクトであることができるこのWebページが見つかりました。複数の、時には同時に短縮形&パラレルフォームを取る。これは、Excelがすべての場所で物事を投げる方法を少しクレイジーだ:>QueryTable/s

1)Excel>Workbook/s>Connections>WorkbookConnection>ODBCConnection

2)Excel>Workbook/s>Worksheet/s>ListObject/s

3)Excel >Workbook/s>Worksheet/s>QueryTable/s

4 )ListObject>QueryTable>WorkbookConnection

5)QueryTable>WorkbookConnection私はすべてのこれらの項目を説明します

  • ExcelWorkbooksは、WorkbookWorksheets、およびWorksheetは明白です。
  • Workbookには、WorksheetごとにConnectionsのコレクションが含まれています。
  • Connectionsは、それがTXTまたはXLSからファイルベースであるかどうか、任意のタイプの接続を持っているウェブベースのHTTP経由、または我々は密接にここを見ている1することができます:ODBC
  • 何らかの理由でMicrosoftが命名規則を破って、ConnectionではなくWorkbookConnectionと呼ばれていました。
  • 次に、ODBCConnectionに到着します。ODBCConnectionには、ODBC設定が大量に組み込まれています。
  • これらの項目全体で、ODBC接続文字列とSQLクエリ文字列がすべて繰り返されて混乱することがあります。また、ある項目/オブジェクトが1つの項目を別の項目にリンクさせるのは難しい場合もあります。
  • ListObject(LO)に含まれているか、またはワークシート上で独立してライブできる2つの場所でQueryTable(QT)を作成できます。
  • QTがLOに含まれている場合(Excel 2007で導入されたように)、これは私が言及したブリングのいくつかを示しています。具体的には、Table ToolsグループとDesignタブがリボンにあります。これは、列ヘッダー上の交互の行の色やドロップダウンボックスなど、すべてのファンシー設定&の形式です。
  • QTがLOと独立している場合、結果のクエリ結果&はシンプルで実用的です。実際、彼らはExcel 2003と同じように見えるし、機能します。>ODBCConnection

1)Excel>Workbook/s>Connections>WorkbookConnection

接続が格納されている場所です。これは、[データ]> [接続]のリボンから[ワークブック接続]ウィンドウに表示される接続と同じです。 >QueryTable/s

2)Excel>Workbook/s>Worksheet/s>ListObject/sこれはExcelのUIで最初からクエリを作成するときに、「外部データの取り込み」グループ内の項目のいずれかを使用することにより、得るものですその結果、SQLサーバーへのODBC接続が発生します。私の場合、すでにDB2用のDSNファイルのコレクションがあります。この実験では、すべて「既存の接続」ウィンドウにリストされているDSNファイルしか使用していませんでした。 >QueryTable/s

3)Excel>Workbook/s>Worksheet/sこれは、あなたがプログラムでスタンドアロンQueryTableListObjectに含まれていない作成するVBAを使用している場合、あなたが得るものです。これまで私はUIでこれを行う方法を見つけていませんでした。私は何が行われても、Excel 2007以降のUIを使用して作成されたクエリは、ListObject内に強制的に格納されていると考えています。 >WorkbookConnection

4)ListObject>QueryTable

オブジェクトのこのチェーンは、あなたがUIから得るものです。あらかじめConnectionsコレクションにWorkbookConnectionを明示的に作成する必要はないことがわかりました。 QueryTableが作成されるたびに、接続は常に一種の副産物として作成されます。

5)QueryTable>WorkbookConnection

これは結局、今

おそらく最高の古い方法として説明した最も単純な形式であり、およびExcel 2003のものと同様に、クエリの結果とコントロールを与え、2000年この研究では、あなたのコードで何が起きているのか、また何が異なるのかを理解していると思います。コアビットはここにある:

With ActiveWorkbook.Connections("RISCTEST - ParmPass").ODBCConnection 
.CommandText = "call K9751DB.SP_GETRTSDB_BYDBTSNOPTLIKEDTTM('" & LPARSSID & "', '" & DBNAME & "', '" & TSNAME & "','2017-10-01 23:25:59.999999','2')" 
ActiveWorkbook.Connections("RISCTEST - ParmPass").Refresh 

End With 

は(大規模な再分割の私のスタイルで)このように、おそらくクリーンアップ:今は見て

Dim wb   As Excel.Workbook 
Dim conns  As Excel.Connections 
Dim conn   As Excel.WorkbookConnection 
Dim odbc   As Excel.ODBCConnection 
Dim connName  As String 
Dim connCmdText As String 
Dim spName  As String 
Dim p1   As String 
Dim p2   As String 
Dim p3   As String 
Dim p4   As String 
Dim p5   As String 

'Set up the parameter strings for everything. 

connName = "RISCTEST - ParmPass" 
spName = "K9751DB.SP_GETRTSDB_BYDBTSNOPTLIKEDTTM" 
p1 = LPARSSID 
p2 = DBNAME 
p3 = TSNAME 
p4 = "2017-10-01 23:25:59.999999" 
p5 = "2" 

'I use this trick to make quoted-strings within quoted-strings more 
'readable. It's more lines of code, but easy to make with copy & 
'paste, and when your eyes get blurry and tired and crossed and those 
'double and single quotes start to look like triple single quotes 
'and you can't tell quadruple single-quotes from double double-quotes, 
'it can be a life saver. =-) 

'This is the actual command. 

connCmdText = "call spname('p1','p2','p3','p4','p5')" 

'Now replace all the parameter codes with the real data. Be careful when 
'choosing the names of the codes so they don't conflict with any correct 
'strings already in the command string, or mayhem will result. Use goofy 
'punctuation to make them more unique if necessary. 

connCmdText = VBA.Replace(connCmdText, "spname", spName, , , vbTextCompare) 
connCmdText = VBA.Replace(connCmdText, "p1", p1, , , vbTextCompare) 
connCmdText = VBA.Replace(connCmdText, "p2", p2, , , vbTextCompare) 
connCmdText = VBA.Replace(connCmdText, "p3", p3, , , vbTextCompare) 
connCmdText = VBA.Replace(connCmdText, "p4", p4, , , vbTextCompare) 
connCmdText = VBA.Replace(connCmdText, "p5", p5, , , vbTextCompare) 

'Now to the business. 

Set wb = Excel.ActiveWorkbook 
Set conns = wb.Connections 
Set conn = conns.Item(connName) 
Set odbc = conn.ODBCConnection 
odbc.CommandText = connCmdText 
conn.Refresh 

'The with block wasn't even needed. (I think.) 

、私はQTが表示されません。あなたのコードに、OPには含まれていないものがありますか?あなたが投稿したコードがすべてのものであれば、Excelにクエリ結果をどこに置くべきかは分かりません。しかし、何か著しく異なるものがなければ、あなたは、あなたが望むものを得るために、異なるコードのためのいくつかの仮定を可能にするのに十分なものを示しました。

この問題を理解するために私が今日試したDB2システムの実際の作業手順は次のとおりです。 Sheet1のA1に基本的なExcel 2003スタイルのクエリ結果を掲載します。私は、匿名性のためにサーバーのユーザー資格情報とIPだけを消し去りました。これは、Excel VBAでのクエリの最も基本的な実装です。独立QTです。

Sub TestQT() 

    Dim connStr  As String 
    Dim connCmdText As String 
    Dim destRangeAddr As String 
    Dim ws    As Excel.Worksheet 
    Dim qts   As Excel.QueryTables 
    Dim qt    As Excel.QueryTable 
    Dim destRangeRng As Excel.Range 

    'Set up the connection string and other variables for the query. 

    destRangeAddr = "A1" 
    connCmdText = "SELECT * FROM VIPDTAB.BEERXT" 
    connStr = _ 
     "ODBC;" & _ 
     "DRIVER={iSeries Access ODBC Driver};" & _ 
     "UID=********;" & _ 
     "PWD=********;" & _ 
     "SIGNON=1;" & _ 
     "QRYSTGLMT=-1;" & _ 
     "PKG=QGPL/DEFAULT(IBM),2,0,1,0,512;" & _ 
     "LANGUAGEID=ENU;" & _ 
     "DFTPKGLIB=QGPL;" & _ 
     "DBQ=VIPDTAB;" & _ 
     "SYSTEM=***.***.***.***;" & _ 
     "FILEDSN=NOTHING;" 
     'In experiments I found FILEDSN doesn't need to be anything, it can 
     'simply be FILEDSN=DUMMY, if you wish to use a DSN-less connections, 
     'as I do. Also, obviously the password is visible and as such is a 
     'security issue. 

    'Define the sheet. 

    Set ws = ActiveSheet 

    'Clean up the sheet. Useful if the query is run repeatedly, and to avoid the 
    'runtime error that says "overlapping pivot table". 

    ws.Cells.Clear 
    ws.Cells.ColumnWidth = 8 

    'Now to business. 

    Set destRangeRng = ws.Range(destRangeAddr) 'Range object to paste the data. 
    Set qts = ws.QueryTables        'The QT collection. 
    Set qt = qts.Add(connStr, destRangeRng, connCmdText) 'Create the query 

    'Now run it. 'False makes Excel lock up during long queries, so True is best. 

    qt.Refresh BackgroundQuery:=True 

End Sub 

ここで、これらのアイデアをまとめて問題を解決してください。最後の数行を除いて、すべてがほぼ同じです。もちろん私はあなたのシステムではないので、私はこれをテストする方法がありませんが、私はそれにデバッガを実行して、打ち明けのタイプミスをキャッチしました。だから、私はあなたがより多くの助けが必要な場合は、バック叫ぶ:

Sub TestQuery2() 

    Dim wb   As Excel.Workbook 
    Dim ws   As Excel.Worksheet 
    Dim qts   As Excel.QueryTables 
    Dim qt   As Excel.QueryTable 
    Dim conns  As Excel.Connections 
    Dim conn   As Excel.WorkbookConnection 
    Dim destRangeObj As Excel.Range 
    Dim destRangeTxt As String 
    Dim connName  As String 
    Dim connDesc  As String 
    Dim connStr  As String 
    Dim spName  As String 
    Dim connCmdText As String 
    Dim p1   As String 
    Dim p2   As String 
    Dim p3   As String 
    Dim p4   As String 
    Dim p5   As String 

    connName = "RISCTEST - ParmPass" 
    connDesc = "" 'set the description as/if desired 
    connStr = _ 
     "DRIVER={IBM DB2 ODBC DRIVER};" & _ 
     "UID=k9751x1;" & _ 
     "PWD=********;" & _ 
     "MODE=SHARE;" & _ 
     "DBALIAS=RISCTEST;" 
    destRangeTxt = "$A$1" 

    'Set up the procedure call by replacing the parameters. 
    'It's much more readable than quotes within quotes. 

    connCmdText = "call spname('p1','p2','p3','p4','p5')" 
    spName = "K9751DB.SP_GETRTSDB_BYDBTSNOPTLIKEDTTM" 
    p1 = Sheets("RTSbyDBTSDTE").Range("B2").Value 
    p2 = Sheets("RTSbyDBTSDTE").Range("B3").Value 
    p3 = Sheets("RTSbyDBTSDTE").Range("B4").Value 
    p4 = "2017-10-01 23:25:59.999999" 
    p5 = "2" 

    'Replace all the parameters. 

    connCmdText = VBA.Replace(connCmdText, "spname", spName, , , vbTextCompare) 
    connCmdText = VBA.Replace(connCmdText, "p1", p1, , , vbTextCompare) 
    connCmdText = VBA.Replace(connCmdText, "p2", p2, , , vbTextCompare) 
    connCmdText = VBA.Replace(connCmdText, "p3", p3, , , vbTextCompare) 
    connCmdText = VBA.Replace(connCmdText, "p4", p4, , , vbTextCompare) 
    connCmdText = VBA.Replace(connCmdText, "p5", p5, , , vbTextCompare) 

    'Define the worksheet and destination. 

    Set ws = ActiveSheet 
    Set destRangeObj = ws.Range(destRangeTxt) 

    'Clean up the sheet. Useful if query is run repeatedly. If used as 
    'such, the .Clear has to happen before the .Add method, or a runtime 
    'error will ocurr due to the old query blocking the new one. I didn't 
    'save the message, it was something about "pivot table overlap". 

    ws.Cells.Clear 'wipe all values, formatting, conections, and queries 
    ws.Cells.EntireColumn.ColumnWidth = 8 

    'Something I noticed that's different between an LO/QT and independent-QT, 
    'with an LO/QT, the connection is attached to the table, literally. So the .Clear 
    'may not delete the connection if it was created by an independent-QT. The following 
    'bit of code should take care of that, by looping through the connections and 
    'deleting any connection that already exists with the same name. 


    Set wb = ws.Parent 
    Set conns = wb.Connections 
    For Each conn In conns 
     If conn.Name = connName Then 
      conn.Delete 
      Exit For 
     End If 
    Next 


    'Now the business. 

    Set qts = ws.QueryTables 
    Set qt = qts.Add(connStr, destRangeObj, connCmdText) 

    'Now both the query and connection have been created. The connection name, which 
    'appears in the Workbook Connections window, needs to be set. When the QT is created 
    'in the .Add procedure above, the connection is also created, but there's no way to 
    'specify its name, so it just uses the name "Connection". But that can be changed 
    'after the fact, as can the connection description, if desired. 

    Set conn = qt.WorkbookConnection 
    conn.Name = connName 
    conn.Description = connDesc 

    'And finally, the fireworks: 

    qt.Refresh True 

End Sub 
+0

spinjector - 返信と参照のためにもう一度感謝します。確かに明確にするのに役立ちます。 最後に、週末にこれで「遊ぶ」チャンスを得ました。私はそれを実行したとき、私は、ランタイムエラーを取得する:フラグの付いたコードの1004.The行があります:Set QT = qts.Add(connStr、destRangeObj、connCmdText) TKU、 ジェフA([email protected]) 場合直接私に連絡したい、私はWBを共有することができます) – Jeff

0

spinjector - まずオフを、私はWOW言わせて...これは驚くべきものだと私は本当にあなたが掘り下げと共有する時間を割いて感謝しています。

第二に、(かなり正直なところ)あなたはこの分野のスキルが私のそれよりはるかに上です。 z/OS(私のDBA/SysProgとしてのBailiwick)からデータを引き出し、いくつかの(基本的な)マクロを書いたことが長年にわたってExcelを使っていましたが、 ... IMPRESSIVE。

私の接続を設定する方法は、データ、その他のソース、MSクエリから、データソースの選択、クエリ/ StoredProcの入力、およびデータのタグセットの割り当てです(下記参照)。正直控えめなExcel 101ですが、うまく動作し、実装がかなり簡単です。

しかし、言われているように、私はほとんどの技術者が好きで、勉強して学びたいと思っています。加えて、私はVBAに精通した方々を目指しており、現行のマネジメントで正式な(または非公式の)トレーニングをいくつか議論してきました。

もう一度、あなたの努力と共有の意欲は非常に高く評価されます。

TKU、 ジェフODBCを使用するようにExcelを設定するには

•オープンエクセル 選択データ• •選択のために(SQL Serverからの O他のソースからの外部データに •選択を取得します  を接続します。 を接続します。o Microsoft Query(DB2 LUW、z/OS、Oracleの場合) データソースを選択します。 サーバー名を入力してください(例:dbstatus:xxxxxxxx \ xxxx)。 は•コマンドテキストでプロパティ を選択したデータソース 名前を付け•接続 ドライバタイプ を選択します。オプションoを選択ビュータイプ/表示位置 oを選択データベース/テーブル oをサーバ名 を入力し、必要に応じて新しいものを作成します。ボックスに入力して o OK/OK to run

+0

ちょっと問題はない、それは興味深い遠征でした。 Btw、私は私のポストをスキミングしていて、#4と#5で2つの小さなビットを忘れてしまったことに気づいた。 ODBCConnectionは、WorkbookConnectionオブジェクトの子オブジェクトです(例: 'WorkbookConnection'>' ODBCConnection')。あなたが質問をしたら、私にぶつかるのをためらってください。 – spinjector

+0

spinjector - フォローアップと修正をありがとう。さらに、助けを借りて申し出ていただきありがとうございます。私は一週間以内に会議に出席し、次のほとんどのz/OS作業に縛られています...できるだけ早くこれに戻り、あなたの投稿を続けます。 – Jeff

+0

いつでもよろしく! – spinjector

関連する問題