ADOデータソースコントロールを使って、表コントロールとの連携環境を実行時に設定する方法について、以下の手順で説明します。
フォームにコントロールを配置します。
コントロールのプロパティを設定します。
コントロールの手続きを記述します。
ポイント
本節で作成するサンプルプログラムは、"ADODataSource\ADODataSource2.ppj"に格納されています。必要に応じて参照してください。
フォームにコントロールを配置する
以下のコントロールを図のようにフォームに配置します。
ADOデータソースコントロールを1つ(CmADODataSource1)
スタティックテキストコントロールを2つ(CmStatic1~CmStatic2)
テキストボックスコントロールを1つ(CmText1)
コマンドボタンコントロールを2つ(CmCommand1~CmCommand2)
表コントロールを1つ(CmTable1)
コントロールのプロパティを設定する
スタティックテキストコントロールおよび各コマンドボタンコントロールのプロパティ設定ダイアログボックス開き、次の図と同じになるよう[キャプション]を変更します。テキストボックスはTextプロパティには”TELEVISION”を設定します。
表コントロールでは、列スタイルにA~Dの4つの列を追加します。
ADOデータソースコントロールのプロパティは設定する必要はありません。
コントロールの手続きを記述する
[接続]ボタン(CmCommand1)がクリックされたら、ADOデータソースコントロールを使って、データベースのクエリの内容を表コントロールに表示させるための手続きが実行されます。
MainForm-REPOSITORY | NetCOBOLの*COMクラスおよび*COM-EXCEPTIONクラスを宣言します。 |
CmCommand1-Click | ADOデータソースコントロールを利用して、データベースに接続し、テキストボックスに設定されたTextプロパティの内容をコマンドパラメータとしてクエリ(コマンドテキスト)の結果を表コントロールに表示します。 |
CmCommand2-Click | フォームを終了します。 |
コマンドテキストに設定するSQL文は以下を使用します。
SELECT NAME AS 会社名,GNO AS 製品番号,GOODS AS 製品名,OOH AS 注文数 FROM STOCK,COMPANY,ORDERS WHERE GNO=GOODSNO AND CNO=COMPANYNO AND GOODS=?
MainForm-REPOSITORY
CLASS COM AS "*COM" CLASS EXCEP AS "*COM-EXCEPTION" CLASS ARRAY AS "*COM-ARRAY"
CmCommand1-Click
ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. 01 SRC PIC X(1024). 01 MSG PIC X(1024). 01 WK-CURLOC PIC S9(9) COMP-5 VALUE POW-ADODB-ADUSECLIENT. 01 CNNOBJ OBJECT REFERENCE COM. *> ADODB.Connectionオブジェクト 01 RSTOBJ OBJECT REFERENCE COM. *> ADODB.Recordsetオブジェクト 01 CMDOBJ OBJECT REFERENCE COM. *> ADODB.Commandオブジェクト 01 PRMARY OBJECT REFERENCE ARRAY. *> パラメタのための配列オブジェクト 01 WK-RSTOBJ OBJECT REFERENCE POW-COBJECT. *> PowerCOBOLに設定するためのRecordsetオブジェクト 01 PARAM-TYPE PIC S9(9) COMP-5 VALUE 12. *> 配列の型(VT_VARIANT) 01 ARRAY-DIM PIC S9(9) COMP-5 VALUE 1. *> 一次元配列 01 AXIS PIC S9(9) COMP-5 VALUE 1. *> 配列要素数 01 ELM-DATA PIC X(16). *> 配列要素データ 01 ELM-NO PIC S9(9) COMP-5. *> 配列要素インデックス 01 WK PIC X(512). *> 文字列一時格納域 01 WK-COLS PIC S9(9) COMP-5. *> テーブルのカラム数 01 WK-ROWS PIC S9(9) COMP-5. *> テーブルの行数 01 WK-DUMMY PIC S9(9) COMP-5. *> CommandのExecuteメソッドのためのダミー 01 I PIC S9(9) COMP-5. 01 J PIC S9(9) COMP-5. 01 K PIC S9(9) COMP-5. PROCEDURE DIVISION. * 例外処理 DECLARATIVES. ERR SECTION. * 例外を受け取ったらメッセージを表示します。 USE AFTER EXCEPTION EXCEP. INVOKE EXCEPTION-OBJECT "GET-SOURCE" RETURNING SRC INVOKE EXCEPTION-OBJECT "GET-DESCRIPTION" RETURNING MSG INVOKE POW-SELF "DisplayMessage" USING MSG SRC POW-DMICONERROR EXIT PROGRAM . END DECLARATIVES. MOVE POW-FALSE TO "Enabled" OF CmCommand1 * ADODB.Connectionオブジェクトをオープンします。 MOVE "ADODB.Connection" TO WK INVOKE COM "CREATE-OBJECT" USING WK RETURNING CNNOBJ * Connectionオブジェクトのプロパティを設定します。 INVOKE CNNOBJ "SET-CursorLocation" USING WK-CURLOC * SQL Server(ここでは、SQL Server Express)にアクセスして、 * "COBOLSample"というデータベースをオープンします。 MOVE "Provider=SQLOLEDB.1; - "Data Source=.\SQLEXPRESS; - "Integrated Security=SSPI; - "Persist Security Info=False; - "Initial Catalog=COBOLSample" TO WK INVOKE CNNOBJ "OPEN" USING WK * ADODB.Commandオブジェクトを作成します。 MOVE "ADODB.Command" TO WK INVOKE COM "CREATE-OBJECT" USING WK RETURNING CMDOBJ * ADODB.CommandオブジェクトにConnectionオブジェクトを関連づけます。 INVOKE CMDOBJ "SETREF-ActiveConnection" USING CNNOBJ * ADODB.Commandオブジェクトにクエリ文字列を設定します。 MOVE "SELECT NAME AS 会社名,GNO AS 製品番号,GOODS AS 製品名,OOH AS 注文数 - " FROM STOCK,COMPANY,ORDERS - " WHERE GNO=GOODSNO AND CNO=COMPANYNO AND GOODS=?" TO WK INVOKE CMDOBJ "SET-CommandText" USING WK * Commandに指定するパラメタを作成します。 INVOKE ARRAY "NEW" USING PARAM-TYPE ARRAY-DIM AXIS RETURNING PRMARY * テキストボックスから製品名を"GOODS"パラメタに設定する} MOVE "Text" OF CmText1 TO ELM-DATA MOVE 1 TO ELM-NO INVOKE PRMARY "SET-DATA" USING ELM-DATA ELM-NO * コマンドを実行しRecordsetオブジェクトを取得します。 MOVE 0 TO WK-DUMMY * SET PRMARY TO NULL INVOKE CMDOBJ "Execute" USING WK-DUMMY PRMARY RETURNING RSTOBJ * RecordsetオブジェクトをPowerCOBOLのオブジェクト形式に変換 CALL "POWERCONVFROMCOM" USING RSTOBJ RETURNING WK-RSTOBJ * Recordsetオブジェクトをデータソースコントロールに設定する INVOKE CmADODataSource1 "SETREF-Recordset" USING WK-RSTOBJ * テーブルの行数を設定 MOVE "RecordCount" OF "Recordset" OF CmADODataSource1 TO WK-ROWS IF WK-ROWS = -1 MOVE 0 TO WK-ROWS END-IF MOVE WK-ROWS TO "RowCount" OF CmTable1 * テーブルのカラム数を設定 MOVE "Count" OF "Fields" OF "Recordset" OF CmADODataSource1 TO WK-COLS MOVE WK-COLS TO "ColumnCount" OF CmTable1 * カラム名を設定する PERFORM VARYING I FROM 0 BY 1 UNTIL I >= WK-COLS ADD 1 TO I GIVING K MOVE "Name" OF "Item"(I) OF "Fields" OF "Recordset" OF CmADODataSource1 TO "Text" OF "TableCells"(0 K) OF CmTable1 END-PERFORM * レコードセットを先頭から読み込む INVOKE "Recordset" OF CmADODataSource1 "MoveFirst" MOVE 1 TO J PERFORM WITH NO LIMIT * レコードセットの最後に到達したら終了 IF "EOF" OF "Recordset" OF CmADODataSource1 NOT = POW-FALSE EXIT PERFORM END-IF * 行数の拡張 IF J > WK-ROWS ADD 1 TO "RowCount" OF CmTable1 END-IF * 読み込んだレコードの各フィールドをそれぞれのセルに表示する PERFORM VARYING I FROM 0 BY 1 UNTIL I >= WK-COLS ADD 1 TO I GIVING K MOVE "Value" OF "Item"(I) OF "Fields" OF "Recordset" OF CmADODataSource1 TO "Text" OF "TableCells"(J K) OF CmTable1 END-PERFORM * 次のレコードセットの読み込み INVOKE "Recordset" OF CmADODataSource1 "MoveNext" ADD 1 TO J END-PERFORM * Recordsetオブジェクトをクローズする INVOKE RSTOBJ "Close" * Connectionオブジェクトをクローズする INVOKE CNNOBJ "Close" INVOKE POW-SELF "ThruEvents" MOVE POW-TRUE TO "Enabled" OF CmCommand1
ポイント
この手続きでは、"SETREF-Source"メソッドを使って、RecordsetオブジェクトのSourceプロパティに値を設定しています。ここでは、プロパティのデータ型がCOMオブジェクトの場合に利用する、NetCOBOLのオブジェクト機能を利用しています。NetCOBOLの*COMクラスを使ったプログラミングについての詳細は、『NetCOBOL ユーザーズガイド』を参照してください。
この手続きでは、"SETREF-Recordset"メソッドを使って、ADOデータソースコントロールのRecordsetプロパティに値を設定しています。Recordsetプロパティは、PowerCOBOLで用意しているオブジェクトではなく、ADOが用意しているオブジェクトを示しています。プロパティの値がPowerCOBOLで用意したオブジェクト以外のものを示している場合、"POWERCONVFROMCOM"を使って、COMオブジェクトをPowerCOBOLで扱えるオブジェクトに変換し、"SETREF-プロパティ名"という形式でメソッドを呼び出すことにより、プロパティの値を設定できます。"POWERCONVFROMCOM"の記述形式については、「NetCOBOLの*COMクラスを利用してアクセスする」を参照してください。
注意
"SETREF-プロパティ名"メソッドを使って、PowerCOBOLのコントロールのプロパティに値を設定する場合、プロパティ名の大文字と小文字を区別して記述してください。
ADOデータソースコントロールのRecordsetプロパティなど、POW-COBJECTクラスのオブジェクト参照を示すプロパティには、以下のように、直接オブジェクトを設定することはできません。"SETREF-プロパティ名"メソッドを使って設定してください。
誤:MOVE WK-RSTOBJ TO "Recordset" OF CmADODataSource1 正:INVOKE CmADODataSource1 "SETREF-Recordset" USING WK-RSTOBJ