ページの先頭行へ戻る
NetCOBOL V12.0 PowerCOBOL ユーザーズガイド
FUJITSU Software

9.8.2 表コントロールとの連携環境を実行時に設定する

ADOデータソースコントロールを使って、表コントロールとの連携環境を実行時に設定する方法について、以下の手順で説明します。

  1. フォームにコントロールを配置します。

  2. コントロールのプロパティを設定します。

  3. コントロールの手続きを記述します。

ポイント

本節で作成するサンプルプログラムは、"ADODataSource\ADODataSource2.ppj"に格納されています。必要に応じて参照してください。

フォームにコントロールを配置する

以下のコントロールを図のようにフォームに配置します。

コントロールのプロパティを設定する

スタティックテキストコントロールおよび各コマンドボタンコントロールのプロパティ設定ダイアログボックス開き、次の図と同じになるよう[キャプション]を変更します。テキストボックスは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