< 前へ | 次へ >

演習 6: サービス関数のコードの追加

EGL では、add および get などの I/O ステートメントは、ファイル・システムからデータベースのキューに至るまで、さまざまな種類の永続データ・ストレージにあるデータにアクセスします。コーディングは、どの場合にも同様です。

この演習では、リレーショナル・データベースの行にアクセスする関数を追加します。SQLService.egl ファイルで、最終行にある end ステートメントの前に関数を順番に追加します。

支払記録の追加

addPayment() 関数は、新規行をデータベースに追加します。

関数をコーディングするには、以下のステップを実行します。

  1. EGL エディターで、以下の行をコピーして SQLService.egl ファイルの end ステートメントの前に貼り付けます。
    	function addPayment(newPayment paymentRec inOut)
    		add newPayment;
    	end
  2. 続行する前に、paymentRec レコード・パーツへの参照を解決する必要があります。「インポートの編成」機能を使用して import ステートメントを自動的に作成することができます。エディター内のブランク領域を右クリックして、「インポートの編成」をクリックします。
    メニューには「インポートの編成」のオプションが含まれています。
    EGL は、以下のステートメントをファイルの先頭に追加します。
    import records.paymentRec;
    これで、参照は解決されました。この機能を使用する機会は多く、その際は、メニュー項目を選択するか Ctrl-Shift-O を押します。
  3. ファイルを保存し (Ctrl-S)、add ステートメントの任意の場所にカーソルを置きます。右クリックして、「SQL ステートメント」 > 「追加」と選択します。
    SQL ステートメント・オプション。
    この機能では、EGL の add ステートメントの基礎となる暗黙的な SQL を、変更可能な組み込みコードに変更しています。

    組み込み SQL コード

  4. paymentID フィールドは自動生成されるため、上書きしてはいけません。
    1. PAYMENT_ID および後続のコンマを、INSERT リストから削除します。
    2. :newPayment.paymentId および後続のコンマを、VALUES リストから削除します。
      注: SQL 用語に従い、SQL ステートメントで参照される各変数はホスト変数 と呼ばれます。ホスト という用語は、SQL ステートメントを組み込む言語 (この場合は EGL) を指します。例えば、:newPayment.paymentId の先頭にあるコロンは、ホスト変数を表します。
    変更された add ステートメントは、以下のイメージのようになります。
    変更された SQL コード
  5. ファイルを保存します。

すべてのデータベース・レコードの読み取り

getAllPayments 関数は、表からすべてのレコードを読み取り、それらを配列内に保管します。

関数をコーディングするには、以下のステップを実行します。

  1. EGL エディターで、以下の行をコピーして SQLService.egl ファイルの end ステートメントの前に貼り付けます。
    function getAllPayments() returns (paymentRec[])
       paymentArray paymentRec[];
       get paymentArray;
       return (paymentArray);
    end
    EGL の get ステートメントは、SQL SELECT ステートメントを生成して、結果セットを取得します。get ステートメントのターゲットがレコードの動的配列である場合、EGL は結果セットからすべての一致する行を取得し、連続する各行を次の配列要素に挿入します。
  2. ファイルを保存します。

レコードの置換

editPayment 関数は、データベース内の既存の行を、編集した行に置換します。この関数では、ユーザーが以前にこの行をデータベースから読み取っていることを前提にしています。

関数をコーディングするには、以下のステップを実行します。

  1. EGL エディターで、以下の行をコピーして SQLService.egl ファイルの end ステートメントの前に貼り付けます。
    function editPayment(chgPayment paymentRec inOut)
       replace chgPayment nocursor;
    end
    EGL の replace ステートメントは、SQL UPDATE ステートメントを生成します。
  2. ファイルを保存します。

レコードの削除

deletePayment 関数は、指定したレコードを表から削除します。

関数をコーディングするには、以下のステップを実行します。

  1. EGL エディターで、以下の行をコピーして SQLService.egl ファイルの end ステートメントの前に貼り付けます。
    function deletePayment(delPayment paymentRec inOut)
    
    try
       delete delPayment nocursor;
    
       onException(exception SQLException)
          if(SQLLib.sqlData.sqlState != "02000") // sqlState is of type CHAR(5)
             throw exception;
          end
       end
    end
    EGL の delete ステートメントは、SQL DELETE ステートメントを生成します。行が存在しない場合、DERBY データベースは SQLState 値「02000」を返し、EGL ランタイム・コードは、関数がキャッチ する (つまり、onException ロジックで処理する) 例外をスローします。

    関数が例外をキャッチしても無視する場合、処理は中断されずに続行します。この規則は、SQLState の値が「02000」の場合、先行するロジックに適用されます。 関数が throw ステートメントを使用して例外をスロー する場合、例外はアクティブのままになります。この規則も、SQLState の値が「02000」以外の場合、先行するロジックに適用されます。

    実行時に、サービスが例外を処理しない場合、サービス・リクエスターは ServiceInvocationException タイプの例外を受け取ります。サービスにアクセスできない場合、リクエスターは、エラーの詳細に応じて ServiceInvocationException タイプまたは ServiceBindingException タイプの例外を受け取ります。

  2. ファイルを保存します。

テスト・データの作成

createDefaultTable 関数は、完成したアプリケーションをテストするための一連のデータを作成します。

関数をコーディングするには、以下のステップを実行します。

  1. EGL エディターで、以下の行をコピーして SQLService.egl ファイルの end ステートメントの前に貼り付けます。
    function createDefaultTable() returns (paymentRec[])
    
       try
          execute #sql{
             delete from PAYMENT
          };
    
       onException(exception SQLException)
    
          if (SQLLib.sqlData.sqlState != "02000") // sqlState is of type CHAR(5)
             throw exception;
          end
       end;
    
       ispDate DATE = dateTimeLib.dateValueFromGregorian(20110405);
       addPayment(new paymentRec{category = 1, description = "Apartment",
          amount = 880, fixedPayment = YES});
    		 addPayment(new paymentRec{category = 2, description = "Groceries",
          amount = 450, fixedPayment = NO});
       addPayment(new paymentRec{category = 5, description = "ISP",
          amount = 19.99, fixedPayment = YES, dueDate = ispDate });
       return (getAllPayments());
    end
    このコードの処理内容は以下のとおりです。
    • EGL の execute ステートメントが、PAYMENT 表からすべての行を削除するリテラル SQL ステートメントを実行します。
    • ispDate 変数が、dateTimeLib.dateValueFromGregorian() システム関数から日付値を受け取ります。次に、変数の内容が、データベースの dueDate フィールドへの挿入に適したフォーマットになります。
    • addPayment 関数が繰り返し呼び出され、PAYMENT 表に新規行が追加されます。
    • getAllPayments 関数を呼び出すことにより、表から取得された行の配列が返されます。
  2. Ctrl-Shift-F を押して、コードのフォーマットを設定します。 赤色の X 記号が表示される場合、そのコードを演習 6 で完成した SQLService.egl のコードに記載されている完成コードと比較してください。
  3. ファイルを保存して閉じます。

演習のチェックポイント

以下のタスクの実行方法を学習しました。
  • 組み込み SQL コードをプログラムに追加し、そのコードを変更する
  • import ステートメントを自動的に作成し編成する

次の演習では、費用データの表を保持するためのウィジェットを作成します。

< 前へ | 次へ >

フィードバック