コンソール UI における配列辞書の使用

Informix® 4GL は、画面配列 を使用して、コンソール・ウィンドウ内にデータの列を表示していました。 EGL では、openUI 文で ArrayDictionary パーツを指定可能にすることで、同等の機能を提供します。

例えば、デパートでの POS 端末用のアプリケーションを設計しているものと仮定します。 ディスプレイの列には、スキャンした各アイテムの数量 (QTY)、説明 (DESC)、価格 (PRICE)、および拡張 (EXT) を表示しています。
QTY  DESC                      PRICE       EXT
  1  DOG BOWL - STAINLESS       7.95      7.95
  2  FRENCHIES MUSTARD 12OZ     2.95      5.90
ディスプレイの各行は、QTY=1、DESC="DOG BOWL - STAINLESS" のように、名前と値のペアの連続になります。 EGL では、辞書はそのような名前値ペアを保持するパーツであり、また、こうした辞書の配列は ArrayDictionary です。

コードの観点から見ると、テーブルは、列あたり 1 つのコンソール・フィールド配列の集合として定義されます。 例えば、「説明 (DESC)」列は n ストリング・タイプ・フィールドの配列に、「価格 (PRICE)」列は n マネー・タイプ・フィールドの配列に、というようになります。

以下の例はこの端末の単純な実装を示しています。 サンプル・プログラムでは、各製品の拡張を乗算し、ユーザーが Ctrl+X を押すと現在高を表示します。
package com.companyb.retail;

// 配列からの各行は、以下のいずれかにバインドされます
Record ItemRecord type BasicRecord
   itemQty INT;
   itemDesc STRING;
   itemPrice DECIMAL(9,2);
   itemExt DECIMAL(9,2);
end

// POS 端末装置上に表示されるように形成します
Record RegisterConsole type ConsoleForm {
   formSize = [10,78], 
   showBrackets = yes }

   // 列のヘッダー
   *ConsoleField {position = [1,2], value = "QTY" };
   *ConsoleField {position = [1,8], value = "DESCRIPTION" };
   *ConsoleField {position = [1,36], value = "PRICE" };
   *ConsoleField {position = [1,48], value = "EXT" };


   QTY ConsoleField[4] { 
      name="QTY",
      datatype = "INT",
      fieldlen = 3,
      align = right,
      position = [2, 2]
      };

   DESC ConsoleField[4] { 
      name="DESC",
      datatype = "STRING",
      fieldlen = 25,
      align = left,
      position = [2, 8]
      };

   PRICE ConsoleField[4] { 
      name="PRICE",
      datatype = "NUMBER",
      fieldlen = 9,
      align = right,
      position = [2, 36]
      };

   EXT ConsoleField[4] { 
      name="EXT",
      datatype = "NUMBER",
      fieldlen = 9,
      align = right,
      position = [2, 48]
      };

   registerArray ArrayDictionary {
      col1 = QTY,
      col2 = DESC,
      col3 = PRICE,
      col4 = EXT
      };
end

program pos_terminal

   function main ()
      i INT;	// レコード配列の索引
      total DECIMAL(9,2) = 0;  // 現在高
      myRegister RegisterConsole {
         name = "myRegister"};
      myItems ItemRecord[20];

      displayFormByName( "myRegister");  // 初期画面を表示します
      openUI myRegister.registerArray
         bind myItems   // ユーザー・エントリーはここに保存されます
         onEvent(AFTER_FIELD:"PRICE")
            i = currentArrayDataLine();
            // 拡張の量の外観
            myItems[i].itemExt = 
               myItems[i].itemPrice * myItems[i].itemQty;
         onEvent(AFTER_FIELD:"EXT")
            i = currentArrayDataLine();
            // 現在高の保持
            total = total + myItems[i].itemExt;
         onEvent(ON_KEY:"CTRL_X")
            // 合計表示
            displayAtLine( "Total: " + total, 9);
      end
   end
end

コンソール書式におけるレイアウトは、初期のコンソール画面に表示される行数を決定します。 myItems 配列に含まれる要素 (20) が表示される要素 (4) より多いため、画面の配列部分を上または下へスクロールして要求されたレコードを表示します。


フィードバック