Arraywörterverzeichnis in der Konsolenbenutzerschnittstelle verwenden

In Informix 4GL wurde ein Anzeigearray verwendet, um Spalten mit Daten innerhalb des Konsolenfensters anzuzeigen. EGL stellt eine entsprechende Funktion bereit, die Sie verwenden können, um einen 'ArrayDictionary'-Abschnitt in Ihrer openUI-Anweisung anzugeben.

Nehmen Sie beispielsweise an, Sie entwerfen eine Anwendung für ein Point-of-Sale-Terminal (POS-Terminal) in einem Kaufhaus. Die Spalten in der Anzeige können z. B. für jeden gescannten Artikel die Menge, die Beschreibung, den Stückpreis und den Gesamtpreis enthalten:
QTY  DESC                      PRICE       EXT
  1  DOG BOWL - STAINLESS       7.95      7.95
  2  FRENCHIES MUSTARD 12OZ     2.95      5.90
Jede Zeile in der Anzeige stellt eine Folge von Name/Wert-Paaren dar, z. B. QTY=1, DESC="DOG BOWL - STAINLESS". In EGL sind solche Name/Wert-Paare in einem Wörterverzeichnis enthalten und ein Array dieser Wörterverzeichnisse wird als 'ArrayDictionary' bezeichnet.

Im Code wird die Tabelle als Gruppe von Konsolenfeldarrays definiert, eines pro Spalte. So ist die Spalte mit der Beschreibung z. B. ein Array von n Feldern mit einem Zeichenfolgedatentyp, die Spalte mit dem Preis ein Array von n Feldern mit einem Betragstyp usw.

Das folgende Beispiel veranschaulicht eine einfache Implementierung für dieses Terminal. Das Beispielprogramm multipliziert den Gesamtpreis für jedes Produkt und zeigt eine laufende Summe an, wenn der Benutzer die Tastenkombination Strg+X drückt.
package com.companyb.retail;

// Bindung jeder Arrayzeile an eines der folgenden Elemente
Record ItemRecord type BasicRecord
   itemQty INT;
   itemDesc STRING;
   itemPrice DECIMAL(9,2);
   itemExt DECIMAL(9,2);
end

// Formular zur Anzeige am Point-of-Sale-Terminal
Record RegisterConsole type ConsoleForm {
   formSize = [10,78], 
   showBrackets = yes }

   // Header für die Spalten
   *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;   // Index für Datensatzarray
      total DECIMAL(9,2) = 0;  // laufende Summe
      myRegister RegisterConsole {
         name = "myRegister"};
      myItems ItemRecord[20];

      displayFormByName( "myRegister");  // Eingangsanzeige anzeigen
      openUI myRegister.registerArray
         bind myItems   // Benutzereintrag hier gespeichert
         onEvent(AFTER_FIELD:"PRICE")
            i = currentArrayDataLine();
            // Gesamtpreis berechnen
            myItems[i].itemExt = 
               myItems[i].itemPrice * myItems[i].itemQty;
         onEvent(AFTER_FIELD:"EXT")
            i = currentArrayDataLine();
            // Laufende Summe speichern
            total = total + myItems[i].itemExt;
         onEvent(ON_KEY:"CTRL_X")
            // Gesamtsumme anzeigen
            displayAtLine( "Total: " + total, 9);
      end
   end
end

Das Layout im Konsolenformular bestimmt die Anzahl der Zeilen, die in der Eingangsanzeige der Konsole enthalten sind. Da das Array myItems mehr Elemente (20) enthält als die Anzeige (4), wird der Arrayabschnitt der Anzeige nach oben bzw. unten verschoben, um die gewünschten Datensätze anzuzeigen.


Feedback