ushidayの日記

主に「IBMi」のメモに・・・

SQL-RPGをチョット勉強 その2

前回の続きで、SQL-RPGで、1行ずつFetchして、社員名を表示する例

  • DDSの例
     A*****************************************************************
     A*   MSA00F   社員マスター             09/07/08  CSC         *
     A*****************************************************************
     A                                      UNIQUE
     A          R MSA00FR                   TEXT('社員マスター')
     A            MSA001         3S 0       COLHDG('社員コード')
     A*
     A            MSA002        32O         COLHDG('社員フリガナ')
     A            MSA003        16O         COLHDG('社員名')
     A            MSA004         8S 0       COLHDG('入社年月日')
     A            MSA005         1A         COLHDG('職務コード')
     A            MSA900         8S 0       COLHDG('作成日')
     A            MSA901         6S 0       COLHDG('作成時間')
     A            MSA902         8S 0       COLHDG('変更日')
     A            MSA903         6S 0       COLHDG('変更時間')
     A*KEY
     A          K MSA001                                               
     H DATEDIT(*YMD)
     H COPYRIGHT('(C) CHUBU SYSTEM CO,.LTD 1996 - ')
      /IF DEFINED(*CRTBNDRPG)
     H DFTACTGRP(*NO) ACTGRP(*CALLER)
      /ENDIF
     D*-----<<メインプロシージャ・プロトタイプ定義>>-----*
     D*-----<<サブプロシージャ・プロトタイプ>>-----*
     D OPEN_CURSOR     PR              N
     D FETCH_CURSOR    PR              N
     D CLOSE_CURSOR    PR              N
     D*-----<<変数>>-----*
     D******************************************************************
     D*
     C*-------------------------------------------------------------------*
     C*----------<<  FREE FORMAT                                 >>-------*
     C*-------------------------------------------------------------------*
      /FREE

           // 1行ずつのFETCH (NEXT:順読み)
           IF NOT OPEN_CURSOR() ;
              // OPEN ERROR DEFINED
           ELSE ;
               DOW FETCH_CURSOR() ;
               ENDDO ;
               CLOSE_CURSOR() ;
           ENDIF ;

           *INLR = *ON ;
           RETURN      ;

      /END-FREE

     P****************************************************************
     P** < OPEN_CURSOR  > :カーソルオープン処理                   **
     P**------------------------------------------------------------**
     P**          RETURN  : *ON=正常オープン,*OFF=エラー          **
     P**------------------------------------------------------------**
     P****************************************************************
     P OPEN_CURSOR     B
     D OPEN_CURSOR     PI              N
     D*<変数>
     D RETURN_VAR      S               N
      /FREE

              //カーソル定義
              EXEC SQL        DECLARE C1 CURSOR FOR
                              SELECT *
                              FROM MSA00F
                              ORDER BY MSA001 ;

              //カーソルオープン
              EXEC SQL        OPEN C1           ;
              IF SQLSTT = '00000' ;   // 00000:操作正常終了
                   RETURN_VAR = *ON ;
              ELSE  ;
                   RETURN_VAR = *OFF;
              ENDIF ;

              RETURN RETURN_VAR ;

      /END-FREE
     P                 E
     P****************************************************************
     P** < FETCH_CURSOR > :カーソル読取処理                       **
     P**------------------------------------------------------------**
     P**          RETURN  : *ON=正常読取,*OFF=EOF又はエラー  **
     P**------------------------------------------------------------**
     P****************************************************************
     P FETCH_CURSOR    B
     D FETCH_CURSOR    PI              N
     D*<変数>
     D RETURN_VAR      S               N
     D ROW           E DS                  EXTNAME(MSA00F)
     D                                     QUALIFIED
      /FREE

              //カーソル読み込み
              //単一行の取り出し
              EXEC SQL        FETCH NEXT FROM C1 INTO :ROW ;
              SELECT ;
              WHEN SQLSTT = '00000' ;   // 00000:操作正常終了
                  DSPLY (ROW.MSA003) ;
                  RETURN_VAR = *ON  ;
              WHEN SQLSTT = '02000' ;   // 02000:EOF
                  RETURN_VAR = *OFF ;
              OTHER ;                           //
                  RETURN_VAR = *OFF ;
              ENDSL ;

              RETURN RETURN_VAR ;

      /END-FREE
     P                 E
     P****************************************************************
     P** < CLOSE_CURSOR > :カーソルクローズ処理                   **
     P**------------------------------------------------------------**
     P**          RETURN  : *ON=正常クローズ.*OFF=エラー        **
     P**------------------------------------------------------------**
     P****************************************************************
     P CLOSE_CURSOR    B
     D CLOSE_CURSOR    PI              N
     D*<変数>
     D RETURN_VAR      S               N
      /FREE
              //カーソルクローズ
              EXEC SQL        CLOSE C1          ;
              SELECT ;
              WHEN SQLSTT = '00000' ;   // 00000:操作正常終了
                  RETURN_VAR = *ON  ;
              OTHER ;                           //
                  RETURN_VAR = *OFF ;
              ENDSL ;

              RETURN RETURN_VAR ;

      /END-FREE
     P                 E                                             

動的SQLの記述も出来る様ですが、まだ解説を見ておりません。

初めてのHudson

Antタスクのスケジュール用に、会社のWindows PCにこちらを参考に、Hudsonを入れてみましたので、忘れないように(小ハマリもあったので)メモしときます。
本来は、SVNなどのリポジトリに変更があった場合や別のビルドと連動して、ビルドしたりするケースなど、色々なビルドトリガが、使えて便利なようです。確かにスケジュールだけなら、cronやWindows Taskで十分ですから。でもせっかくなんで、Hudson入れてみます。

導入〜起動

導入から起動までの手順です。

  1. Hudsonのサイトから、ダウンロード(右のDownload)
  2. ダウンロードした、hudson.warを適当なフォルダに配置
  3. コマンドプロンプトで、配置したフォルダをカレントにフォルダにして、「java -jar hudosn.war」を実行
  4. http://localhost:8080/」でHudson画面を表示

いきなり日本語なのが、凄くウレシイです。
java -jar hudosn.war --help」でオプションが表示されます。ポートを変えたりするオプション"--httpPort"などを確認出来ます。「java -jar hudosn.war --httpPort=8081」で8081ポートで実行。

フリースタイルプロジェクトのビルド

とりあえずAntタスクの定期実行を試すだけなので、まずは、「フリースタイルプロジェクトのビルド」を実行してみます。

  1. Antの設定をする。「Hudsonの管理」→「システム設定」→「Ant」で、自動インストールのチェックを外して、インストール済みAntを”ANT_HOME”に指定(Ant単体でインストールしてなかったのでとりあえず、Eclipseのantを使いました)”保存”ボタンで設定完了。
  2. ジョブの作成。「新規ジョブ作成」で”ジョブ名”と”フリースタイル・プロジェクトのビルド”を選んで、”OK”ボタンで次へ
  3. ジョブの設定。
    • ”説明”欄に説明を記入
    • ”ビルドトリガ”の指定は、”定期的に実行”を選択
    • ”使用するAnt”は、「1」で設定したAntを選択
    • ”ビルドファイル”に”build.xml”等の存在するパスを指定
    • ”保存”ボタンで設定完了
  4. 「3」で作成したジョブを選んで、「ビルド実行」で、正常にビルド出来るか確認。
ant.batの変更(Windowsで小ハマリ)

Windows環境で上記の様に、ジョブを実行すると、Antタスク自体は、実行されてJavaのクラスファイルは、作成されているのだが、下のようなエラーが出力される。Google先生に聞いてみたら、”%ANT_HOME%\bin\ant.bat”の「goto end」「:end」ラベルを「goto endant」「:endant」に変えればOKみたい。何でだろ?時間があったら調べてみます。

HudsonをWindowsサービスで実行

HudsonをWindowsサービスで実行させようと、思いやってみましたが、またまたハマッタのでメモしときます。
サービスのインストール自体は、非常に簡単です。

  1. Hudsonの管理を開く
  2. Windowsのサービスとしてインストールを選択
  3. サービスのインストール先を指定する
  4. 実行ボタンをクリックして、サービスを開始する

しかし、サービスの開始がされず、下の表示のまま変わらない...。

プロンプト画面を見ると、エラーが投げられていた。

それではと、手動でサービスを開始すると、「"ローカルコンピュータ上の テストサービス サービスは起動して停止しました。パフォーマンスログ、警告サービスなど、一部のサービスは作業がない場合に自動的に停止します"」と言われて開始できない。
もう一度インストールをと思い実行しても、既にサービスがあるから駄目みたい。
ならばと、プロンプトから「sc.exe delete hudson」でサービスを削除して、再度インストール&実行。でも結果は同じ...。
ふと、イベントビューアのアプリケーションログを見ると、古いログで一杯。
これを消去して、ついでに一杯になったら、上書きされるように設定変更。それから、サービスを開始したら、無事出来ました。
サービスで動くポート等は、インストール先フォルダの「hudson.xml」を変えれば良さそうです。port8080は他のアプリと、かち合う可能性が大なので、8086あたり「netstat -an | find "8086"」で、使ってないか調べて変更しときました。
新たにインストールした先には、前回せっかく作ったジョブがないので、「$USER_HOME/.hudson」の中身をコピペします。Hudson再起動でジョブが戻りました。