質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
RPG

RPG (Report Program Generator)とは、IBMの System i(AS/400)サーバ向けのプログラミング言語です。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

3466閲覧

ExcelのVBAからAS/400のCLプログラムを実行し、戻り値を取得したい。

DANGAN-X

総合スコア25

RPG

RPG (Report Program Generator)とは、IBMの System i(AS/400)サーバ向けのプログラミング言語です。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2022/02/27 02:23

前提・実現したいこと

ExcelのVBAからストアドプロシージャ経由でCLコマンドを実行し、結果を戻り値として取得したい。
パラメータを含めて実行すると、実行はされるのですが戻り値が返ってきません。

エラー無く動いてしまっている為、特定できず困っているのですが、戻り値を取得する場合に下記コードで不足している箇所はありますでしょうか。
INは出来ているので処理は動くのですが、結果件数が得られず困っております。
ご教示のほどよろしくお願いいたします。

VBA

1Dim con As ADODB.Connection 2Dim cmd As ADODB.Command 3Dim ReturnField As String 4 5Set con = New ADODB.Connection 6Set cmd = New ADODB.Command 7 8con.Open "Provider=IBMDA400; Data Source=xxx.xxx.xxx.xxx", "user", "pass" 9 10Set cmd.ActiveConnection = con 11 12With cmd 13 .CommandText = "CALL TESTLIB.TESTCL(?,?)" 14 .Prepared = True 15 .Parameters.Append cmd.CreateParameter("Parm1", adChar, adParamInput, 2) 16 .Parameters.Append cmd.CreateParameter("Parm2", adChar, adParamInputOutput, 2) 17End With 18 19With cmd 20 .Parameters(0).Value = "A1" 21 .Parameters(1).Value = "" 22End With 23 24'*-- IBM i 処理実行 --* 25cmd.Execute  ' Rcds, Parms, adCmdText 26       ' ↑参考URLに記載があったが、エラーが出るのでコメントアウト 27 28'*-- 戻り値の取得 --* 29ReturnField = cmd.Parameters(1).Value 30 31Cells(1, 1) = ReturnField 32 33'*-- connectionのクローズ、開放 --* 34cmd.ActiveConnection.Close 35Set con = Nothing 36 37End Sub

StoredProcedure

1CREATE PROCEDURE TSTLBS/TESTS1(IN P1 CHAR ( 2), INOUT P3 CHAR ( 2)) 2LANGUAGE CL NOT DETERMINISTIC MODIFIES SQL DATA EXTERNAL NAME 3TESTLIB/TESTCL PARAMETER STYLE GENERAL

CL

10001.00 PGM PARM(&IN1 &OUT1) 20002.00 DCL VAR(&IN1) TYPE(*CHAR) LEN(2) 30003.00 DCL VAR(&OUT1) TYPE(*CHAR) LEN(2) 40004.00 CHGVAR VAR(&OUT1) VALUE('11') 50005.00 ENDPGM 6

試した・確認したこと

・AS/400単体でCLを実行すると正常に戻り値が返ってくることを確認。
・追加仕様のCLに変えた所、ExcelからINするパラメータ値はDBに登録されていた。
・INOUT値なので値'10'をセットして実行すると、変更の無いまま'10'が表示される。
・ストアドプロシージャの記述に問題があるのかと、ストアド記述で一通り考えられる組み合わせを試してみたのですが上手く行くことはありませんでした。

参考:http://side-as400.seesaa.net/article/264485967.html

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ADO の Command オブジェクトに CommandType というプロパティがあります。
これに adCmdStoredProc を指定して試してもらえますか?
AS/400 は使ったことがありませんが、SQL Server であれば、下記の方法で Output 引数の値を取得できることを確認しました。

VBA

1With cmd 2 .CommandText = "SP_TEST" 3 .CommandType = adCmdStoredProc 4 .Prepared = True 5 .Parameters.Append cmd.CreateParameter("Parm1", adChar, adParamInput, 2) 6 .Parameters.Append cmd.CreateParameter("Parm2", adChar, adParamInputOutput, 2) 7End With

<参考>
■ ADO を使用してSQL Serverストアド プロシージャの値を取得する
https://docs.microsoft.com/ja-jp/troubleshoot/sql/connect/retrieve-values-stored-procedure

投稿2022/02/27 03:06

cx20

総合スコア4633

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DANGAN-X

2022/02/27 03:24

回答頂きありがとうございます。 早速試してみた所、実行時エラーが出てしまいました。 調べてみるとAS/400側のエラーみたいで、この方法では実行できないようです。 実行時エラー '-2147467259(80004005)': SQL0104: トークンTESTLIBは正しくない。有効なトークンは( INTO USINGです。
cx20

2022/02/27 03:40 編集

IBM のサポートページに以下のページを見つけました。こちらの情報が参考になるかもしれません。 ■ ADO Stored Procedure Calls with MSDASQL https://www.ibm.com/support/pages/ado-stored-procedure-calls-msdasql このページで紹介されている方法としては、DB ドライバに「IBMDA400」ではなく ODBC ドライバ「MSDASQL」を用いた方法のようです。
cx20

2022/02/27 03:42

以下、他のサンプルになります。DBドライバで「IBMDA400」を使用して adCmdStoredProc パラメータも使用しているようです。 ■ Need to Call RGP from ASP - RPG (Report Program Generator) - Tek-Tips https://www.tek-tips.com/viewthread.cfm?qid=1179429 > objConn.Open "Provider=IBMDA400;Data Source=My_AS400_IP;Default Collection=MYLIB ", "", "" > > Set objCmd.ActiveConnection = objConn > objCmd.CommandText = "MYSP" > objCmd.CommandType = adCmdStoredProc
cx20

2022/02/27 03:47

上記の例に倣うと、使用方法としては以下のような感じでしょうか? ------------------------------------------------------------ con.Open "Provider=IBMDA400; Data Source=xxx.xxx.xxx.xxx;Default Collection=TESTLIB", "user", "pass" With cmd  .CommandText = "TESTCL"  .CommandType = adCmdStoredProc   : End With ------------------------------------------------------------
DANGAN-X

2022/02/27 07:11

AS/400の経験が無いにも関わらず親身にアドバイスを頂きありがとうございます。 サンプルで挙げて頂いたサイトを見て試行錯誤した所、無事戻り値を得る事が出来ました。 INパラメータだけなら最初の仕様で動くのですが、OUTパラメータを指定する場合はCommandTextの{}が必須という事に気付きました。 結果凡ミスで大変お手数をお掛けして申し訳ございませんでした。 With cmd .CommandText = "{CALL TESTLIB.TESTCL(?,?)}" .Prepared = True .Parameters.Append cmd.CreateParameter("Parm1", adChar, adParamInput, 2) .Parameters.Append cmd.CreateParameter("Parm2", adChar, adParamInputOutput, 2) End With
cx20

2022/02/27 07:17

> {}が必須 なるほど。了解です。解決されたようで何よりです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問