3.2 Definition der COBOL-Programme
Um nun zu dieser definierten Oberfläche ein COBOL-Programm schreiben zu können, muss man folgendes wissen:
- Wie werden Dialog-Datentypen auf COBOL-Datentypen abgebildet.
- Welche wichtigen Datenstrukturen gibt es im Dialog Manager, die zur Kommunikation zwischen dem COBOL-Programm und dem Dialog Manager dienen.
- Wie sieht ein Hauptprogramm aus, wenn die Anwendung mit Dialog Manager geschrieben werden soll.
- Wie sehen vom Dialog Manager aus aufgerufene COBOL-Unterprogramme aus.
Diese einzelnen Punkte werden in den folgenden Kapiteln erläutert.
3.2.1 Abbildung der Dialogdatentypen
Ausgehend von der Beschreibung des Dialogs können die dort verwendeten Datentypen auf in COBOL benutzbare Datentypen abgebildet werden. Diese Abbildung vom Dialog nach COBOL ist eindeutig und kann der nachfolgenden unvollständigen Tabelle entnommen werden.
Dialogdatentyp |
COBOL-Datentyp |
---|---|
object |
PIC 9(9) binary. |
integer |
PIC 9(9) binary. |
string[??] |
PIC X(??). |
boolean |
PIC 9(4) binary. |
3.2.2 Zentrale Datenstrukturen
Im COBOL-Interface des Dialog Managers gibt es zwei zentrale Datenstrukturen, über die die Kommunikation zwischen Anwendung und Dialog Manager erfolgt.
Die wichtigste Datenstruktur ist eine Struktur mit Namen DM-StdArgs, die von der Anwendung an jede im COBOL-Interface aufgerufene Funktion mit übergeben werden muss. In dieser Struktur teilt der Dialog Manager der Anwendung mit, ob Fehler bei dem Funktionsaufruf aufgetreten sind. Zusätzlich kann die Anwendung dem Dialog Manager Optionen mitteilen, die bei der Ausführung einzelner Funktionen beachtet werden sollen. Die Felder für die Stringbehandlung DM-truncspaces, DM-getsep und DM-setsep sollten nur vor dem Aufruf der Initialisierungsfunktion gesetzt und damit global eingestellt werden, und nicht im Ablauf des Programms verändert werden. Siehe hierzu Kapitel „Behandlung von String-Parametern“.
Damit hat diese DM-StdArgs-Struktur folgendes Aussehen:
02 DM-StdArgs. 03 DM-version-type pic X value "A". 03 DM-major-version pic 9(4) binary value 6. 03 DM-minor-version pic 9(4) binary value 3. 03 DM-patch-level pic 9(4) binary value 2. 03 DM-patch-sublevel pic 9(4) binary value 0. 03 DM-version-string pic X(12) value "A.06.03.b". 03 DM-version pic 9(4) binary value 603. 03 DM-protocol-version pic 9(4) binary value 1. 03 DM-status pic 9(9) binary value 0. 03 DM-options pic 9(9) binary value 0. 03 DM-rescode pic 9(9) binary value 0. 03 DM-setsep-S. 04 DM-setsep pic X value "@". 04 filler pic X value low-value. 03 DM-getsep-S. 04 DM-getsep pic X value space. 04 filler pic X value low-value. 03 DM-truncspaces pic 9(4) binary value 1. 03 DM-usercodepage-S. 04 DM-usercodepage pic X(32) value spaces. 04 filler pic X(32) value low-values.
Die zweite wichtige Struktur ist die DM-Value-Struktur, denn in ihr werden die Werte vom COBOL-Programm an den Dialog Manager übergeben. Diese Struktur beinhaltet das Objekt, das Attribut und die Werte, die ein Attribut annehmen kann. In dem Beispiel wird diese Struktur zum Füllen des Tablefields benötigt und wird erst dort beschrieben.
3.2.3 Das Hauptprogramm
Bei Programmen, die mit dem Dialog Manager arbeiten sollen, sind spezielle Hauptprogramme notwendig, die vom Prinzip immer gleich sind und daher aus den mitgelieferten Beispielen kopiert werden können.
Beim Aufbau des Hauptprogramms muss man allerdings unterscheiden, ob man eine lokale Anwendung oder einen Server in einer verteilten Umgebung entwickelt. Bei einer lokalen Anwendung muss eine Funktion mit Namen COBOLMAIN, bei einer verteilten Anwendung müssen zwei Funktionen mit Namen COBOLAPPINIT und COBOLAPPFINISH bereitgestellt werden.
Diese Hauptprogramme müssen in ihrer WORKING-STORAGE-Section die vom Dialog Manager bereitgestellte COPY-Strecke "IDMcobws.cob" verwenden, damit auf die Definitionen des Dialog Manager zugegriffen werden kann.
3.2.3.1 Lokale Anwendungen
Der Aufbau der Funktion COBOLMAIN sieht dabei wie folgt aus:
- Zunächst muss die Funktion DMcob_Initialize zum Initialisieren des Dialog Managers aufgerufen werden. Diese muss unbedingt die erste Funktion im Dialog Manager sein, die aufgerufen wird. Alle anderen Funktionen führen zu Fehlern.
- Nach der Initialisierung des Dialog Managers kann der zu der Anwendung gehörende Dialog mit Hilfe der Funktion DMcob_LoadDialog geladen werden.
- Wenn der Dialog erfolgreich geladen wurde, müssen die im Dialog enthaltenen Funktionen vom COBOL-Programm an den Dialog Manager übergeben werden. Dieses erfolgt über den Aufruf der mit Hilfe des Simulationsprogramms generierten C-Funktion CobRecMInit<Name des Dialogs oder Moduls> für Funktionen, die einen Record als Parameter haben, und durch Aufruf der Funktion BindFuncs für Funktionen, die keine Records als Parameter haben. Diese Funktion BindFuncs kann über das Programm gencobfx generiert werden. Bei dem Micro Focus COBOL-Compiler auf UNIX-Systemen und bei Micro Focus Visual COBOL können die Funktionen auch dynamisch über das Laufzeitsystem angezogen und aufgerufen werden. Damit dieses auch bei Aufrufen vom Dialog Manager an die Anwendung genutzt werden kann, muss hierzu die Funktion DMufcob_BindThruLoader bzw. DMmfviscob_BindThruLoader bei Micro Focus Visual COBOL aufgerufen werden. Dadurch werden intern alle noch nicht mit Funktionspointer versehenen COBOL-Funktionen dynamisch über das COBOL-Laufzeitsystem aufgerufen.
- Nach der Anbindung der Funktionen an den Dialog sollten anwendungsspezifische Initialisierungen durchgeführt werden.
- Nach dem Laden des Dialogs und der Anbindung der Funktionen an den Dialog muss der Dialog für den Anwender mit Hilfe der Funktion DMcob_StartDialog gestartet werden. Beim Aufruf dieser Funktion wird die Startregel im Dialog "on dialog start" ausgeführt und alle im Dialog als sichtbar definierten Fenster sichtbar gemacht.
- Danach wird die Kontrolle an den Dialog Manager übergeben, indem die Funktion DMcob_EventLoop aufgerufen wird. Diese Funktion kehrt normalerweise erst beim Programmende zurück, so dass Anweisungen nach dem Aufruf dieser Funktion erst beim Beenden der Anwendung ausgeführt werden.
Beispiel
identification division.
program-id. COBOLMAIN.
data division.
working-storage section.
*Das ist die Copy-Strecke, die dafür sorgt, dass auf die
*vom Dialog Manager definierten Werte zugegriffen werden
*kann
copy "IDMcobws.cob".
*Definition einer Variablen zum Speichern der Dialog ID.
77 DM-dialogid pic 9(9) binary value 0.
* Variable zum Zwischenspeichern der aktuellen Funktion
* Dadurch wird die Fehlerausgabe erleichtert.
77 func-name pic X(30) value spaces.
linkage section.
* Definition der Parameter, die an das Hauptprogramm
* übergeben werden.
01 exit-status pic 9(4) binary.
procedure division using exit-status.
startup section.
* Initialisierung des Dialog Managers
initialize-IDM.
* Hier kann noch der Separator gesetzt werden, mit
* dem die Strings in COBOL beendet werden sollen
move "@" to DM-setsep.
call "DMcob_Initialize" using DM-StdArgs
DM-Common-Data.
perform error-check.
* Laden des Dialogs, der zu der Anwendung gehört
load-dialog.
call "DMcob_LoadDialog" using DM-StdArgs DM-dialogid
by content "table.dlg@"
perform error-check.
* Anbinden der Funktionen mit Records als Parameter
bind-records.
call "CobRecMInitCobolBeispiel" using DM-dialogid
by content 0
DM-StdArgs.
* Anbindung der Funktionen ohne Records als Parameter
call "BindFuncs" using DM-dialogID DM-StdArgs.
* Starten des Dialogs
start-dialog.
call "DMcob_StartDialog" using DM-StdArgs DM-dialogid.
perform error-check.
* Starten der Verarbeitung in dem Dialog
event-loop.
call "DMcob_EventLoop" using DM-StdArgs.
perform error-check.
* Beenden der Anwendung
dialog-done.
display "Application finishes successfully.".
goback.
* Abfragen auf Fehler
error-check.
if DM-ErrorOccurred
display "Error occurred in " func-name upon sysout
display "Application terminates due to error."
move 1 to exit-status
goback.
3.2.3.2 Verteilte Anwendungen
Bei verteilten Anwendungen müssen zwei COBOL-Funktionen in der Anwendung bereitgestellt werden, die die Anwendung initialisieren bzw. beenden können. Die Initialisierungsfunktion heißt CobolAppInit, die Endefunktion CobolAppFinish.
Der Aufbau der Funktion CobolAppInit sieht dabei wie folgt aus:
- Zunächst muss die Funktion DMcob_Initialize zum Initialisieren des Dialog Managers aufgerufen werden. Dies ist ein gravierender Unterschied zu in C realisierten verteilten Anwendungen, denn dort darf DM_Initialize nicht aufgerufen werden. Mit dem Aufruf von DMcob_Initialize werden aber wichtige Einstellungen im COBOL-Interface vorgenommen, so dass bei COBOL-Server-Anwendungen auf diesen Aufruf nicht verzichtet werden kann.
- Nach der Initialisierung des COBOL-Interfaces müssen die im Dialog enthaltenen Funktionen vom COBOL-Programm an den Dialog Manager übergeben werden. Dieses erfolgt über den Aufruf der mit Hilfe des Simulationsprogramms generierten C-Funktion CobRecMInit<Name des Dialogs oder Moduls> für Funktionen, die einen Record als Parameter haben, und durch Aufruf der Funktion BindFuncs für Funktionen, die keine Records als Parameter haben. Diese Funktion BindFuncs kann über das Programm gencobfx generiert werden. Bei dem Micro Focus COBOL-Compiler auf UNIX-Systemen und bei Micro Focus Visual COBOL können die Funktionen auch dynamisch über das Laufzeitsystem angezogen und aufgerufen werden. Damit dieses auch bei Aufrufen vom Dialog Manager an die Anwendung genutzt werden kann, muss hierzu die Funktion DMufcob_BindThruLoader bzw. DMmfviscob_BindThruLoader bei Micro Focus Visual COBOL aufgerufen werden. Dadurch werden intern alle noch nicht mit Funktionspointer versehenen COBOL-Funktionen dynamisch über das COBOL-Laufzeitsystem aufgerufen. Im Gegensatz zu der nicht verteilten Variante muss hier immer die ApplikationsID als Parameter übergeben werden, zu der die Funktionen gehören.
- Nach der Anbindung der Funktionen an die Applikation sollten anwendungsspezifische Initialisierungen durchgeführt werden.
In der Funktion CobolAppInit müssen dann die Aktionen durchgeführt werden, die ein kontrolliertes Beenden der Anwendung ausführen. Aufrufe an den Dialog Manager sind hierbei nicht notwendig, die Server-Anwendung wird automatisch nach der Rückkehr der Funktion beendet.
Beispiel
identification division.
program-id. COBOLAPPINIT.
data division.
working-storage section.
* Verwenden der vom Dialog Manager bereitgestellten
* Copy Strecke.
copy "IDMcobws.cob".
linkage section.
* Deklaration der Parameter der Funktion
* Im Exit-Status wird das Ergebnis zurückgeliefert,
* in DM-appl-id wird die ApplikationsID und in
* DM-dialogID wird die Dialog ID übergeben.
01 exit-status pic 9(4) binary.
77 DM-appl-id pic 9(9) binary.
77 DM-dialogid pic 9(9) binary.
procedure division using exit-status dm-appl-id
DM-dialog-id.
startup section.
* Initialisierung des COBOL-Interfaces
initialize-IDM.
call "DMcob_Initialize" using DM-StdArgs
DM-Common-Data.
PERFORM ERROR-CHECK.
* Dynamische Anbindung der COBOL-Funktionen, nachdem die
* Recordfunktionen angebunden worden sind.
BIND-FUNCTIONS.
call "CobRecMInitCobolBeispiel" using
DM-appl-id
by content 0
DM-StdArgs.
call "DMufcob_BindThruLoader" using DM-StdArgs
DM-appl-id.
* Setzen des Rückgabewertes.
MOVE DM-SUCCESS TO EXIT-STATUS.
GOBACK.
3.2.4 Hilfsmittel für die COBOL-Programmierung
Damit die im Dialog getroffenen Definitionen für Parameter der COBOL-Funktionen nicht zweimal eingegeben werden müssen, kann der Simulator des Dialog Managers aus einer Dialogdatei die für das COBOL-Programm notwendige Copy-Strecke generieren. Dieses erfolgt durch die Startoption
Dabei wird mit Basis-Name der Name einer Datei angegeben, an die die Endungen ".c", ".cob" und ".cpy" angehängt werden, um die für den Aufruf der COBOL-Funktionen notwendigen Dateien zu generieren.
Für das Beispiel sieht die Kommandozeile wie folgt aus:
pidm +writetrampolin tablec table.dlg
Durch diesen Aufruf entstehen die Dateien
- tablec.c
- tablec.cpy
- table_.cob
Die generierten C und COBOL-Dateien müssen mit übersetzt und zu der Anwendung hinzu gelinkt werden. Die CPY-Datei sollte benutzt werden, um auf die im Dialog getroffenen Definitionen der Übergabestruktur zugreifen zu können.
Diese Datei hat für das Beispiel folgendes Aussehen:
01 RecAddress.
05 NName pic X(25).
05 FirstName pic X(15).
05 City pic X(25).
05 Street pic X(30).
Hinweis
Bei Micro Focus Visual COBOL können Texte auch in Unicode (National Character) formatiert sein. Um eine entsprechende Copy-Strecke zu erzeugen, muss folgende Kommandozeile verwendet werden:
pidm -mfviscob-u +writetrampolin tablec table.dlg
3.2.5 Die Funktionen für das Tablefield
Funktionen, die den Inhalt von Objekten mit Listencharakter füllen oder abfragen, sind in Bezug auf das Schichtenmodell eine Ausnahme, denn diese Funktionen können nur mit sehr weitreichenden Kenntnissen über den Dialog geschrieben werden. Dies ist notwendig, damit diese Funktionen performant ablaufen können. Das Füllen eines Tablefields muss mit Hilfe von sogenannten temporären Bereichen erfolgen. Diese temporären Bereiche werden im Dialog Manager angelegt, dann von der Anwendung gefüllt und anschließend einem Objekt zugewiesen. Durch diese Vorgehensweise wird bei lokalen Anwendungen das ständige Flackern des Tablefields beim Füllen verhindert und bei verteilten Anwendungen zusätzlich eine sehr hohe Performancesteigerung gegenüber der Einzelzuweisung erreicht. Im einzelnen sieht die Vorgehensweise wie folgt aus:
- Zunächst muss dem Dialog Manager mitgeteilt werden, dass ein temporärer Bereich angelegt werden soll. Dieses erfolgt mit Hilfe der Funktion DMcob_InitVector. Wenn möglich, sollte man hier die gewünschte Größe des Bereiches angeben, also wie viele Elemente man in diesen Bereich stellen möchte. Diese Größe ist aber nur ein Hilfswert für den Dialog Manager, bei Zuweisungen auf höhere Elemente wird der Bereich entsprechend vergrößert. Zusätzlich muss man auch noch den Datentyp angeben, der in dem anzulegenden Bereich gespeichert werden soll. Dabei können die vom Dialog Manager definierten Datentypen wie DT-string, DT-integer oder DT-boolean verwendet werden. Der Datentyp DT-void hat dabei die besondere Bedeutung, dass hier ein Bereich angelegt werden soll, der die Attribute AT-content, AT-userdata, AT-active und AT-sensitive aufnehmen kann. Dieser Bereich kann dann einem Tablefield oder einer Listbox zugewiesen werden. Diese Funktion liefert als Ergebnis eine ID des von ihr angelegten temporären Bereiches zurück. Diese ID muss an alle nachfolgenden Funktionen übergeben werden, wenn diese auf diesen Bereich zugreifen wollen.
- Nach dem Anlegen eines temporären Bereiches kann dieser Bereich mit Hilfe der Funktion DMcob_SetVectorValue gefüllt werden. Dazu muss in der DM-Value Struktur das Feld DM-Index die Nummer des Elementes enthalten sein, das gerade gesetzt werden soll. In den DM-Value-Teilen der Struktur wird der eigentliche Wert übergeben. In DM-Datatype muss zur Sicherheit der Datentyp des Wertes angegeben werden. Wurde der Bereich mit dem Datentyp DT-void angelegt, so muss zusätzlich noch in DM-Attribute das Attribut hinterlegt werden, das gefüllt werden soll.
- Nach dem Füllen des Bereiches kann der Bereich mit Hilfe der Funktion DMcob_SetVector einem Objekt zugewiesen werden. Dabei kann über Parameter gesteuert werden, ob in dem Objekt der neue Inhalt hinten angefügt oder alten Inhalt überschreiben soll.
- Wird der temporäre Bereich nicht mehr benötigt, so muss dieser Bereich unbedingt über die Funktion DMcob_FreeVector freigegeben werden.
Das Auslesen von Werten läuft analog zum Füllen des Objektes:
- Abholen der Werte aus dem Objekt mit Hilfe der Funktion DMcob_GetVector
- Auslesen der einzelnen Werte mit der Funktion DMcob_GetVectorValue.
- Freigeben des temporären Bereiches über die Funktion DMcob_FreeVector.
3.2.5.1 Funktion FILLTAB
Diese Funktion übernimmt das initiale Füllen des Tablefields. Dazu wird dieser Funktion die ID des Tablefields und die Anzahl der zu füllenden Elemente übergeben.
Zunächst erfolgt in üblicherweise die Definition des Moduls (sollte genauso heißen wie die Funktion im Dialog).
*SET OSVS
IDENTIFICATION DIVISION.
PROGRAM-ID. FILLTAB.
AUTHOR. "ISA-DEMO".
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
DATA DIVISION.
FILE SECTION.
WORKING-STORAGE SECTION.
01 STR-TAB.
05 STRFIELD PIC X OCCURS 80.
01 INT-TAB.
05 INTFIELD PIC 9 OCCURS 5.
77 COUNTER PIC 9(4) VALUE 0.
77 BASE PIC 9(4) VALUE 0.
77 DM-POINTER PIC 9(4) BINARY VALUE 0.
77 ICOUNT PIC 9(4) BINARY VALUE 0.
77 IDUMMY PIC 9(4) VALUE 0.
77 I PIC 99 VALUE ZERO.
77 J PIC 99 VALUE ZERO.
77 KL PIC 9(4) VALUE ZERO.
77 DLG-NAME PIC X(80) value "Name ".
77 DLG-VORNAME PIC X(80) value "Vorname ".
77 DLG-WOHNORT PIC X(80) value "Ort ".
In der Linkage-Section wird ein Copy auf die vom Dialog Manager bereitgestellte Datei IDMcobls.cob durchgeführt, damit auf diese Definitionen im COBOL-Programm zugegriffen werden kann.
LINKAGE SECTION.
*Über diese Copy-Strecke werden die Definitionen im
* Dialog Manager
*in diesem COBOL Modul verfügbar.
COPY "IDMcobls.cob".
*In diesem Parameter wird die Anzahl der Zeilen
*Übergeben, die
*initial gefüllt werden sollen.
77 DLG-CNT PIC 9(9) binary.
*In dieser Variablen wird die Tabelle übergeben
*die gefüllt werden soll.
77 DLG-OBJECT PIC 9(9) binary.
Bei der Definition der Procedure Division muss man beachten, dass diese einen Parameter mehr als im Dialog definiert hat. Der erste Parameter einer vom Dialog Manager aufgerufenen COBOL-Funktion ist immer die DM-Common-Data und diese wird im Dialog nicht definiert.
*Diese COBOL-Funktion legt einen temporaeren Speicherbereich
* im Dialog Manager an und weist diesen dann einem
* Tablefield zu.
PROCEDURE DIVISION USING DM-COMMON-DATA
DLG-OBJECT DLG-CNT.
ORGANIZE-IN SECTION.
MOVE 0 TO BASE.
MOVE DLG-CNT TO ICOUNT.
*Initialisierung eines Speicherplatzes im DM
In dieser Funktion wird dann ein temporärer Bereich angelegt, gefüllt und dann dem Tablefield zugewiesen.
CALL "DMcob_InitVector" USING DM-StdArgs DM-POINTER
DT-String
ICOUNT.
*Initialisierung der DM-Value Struktur
MOVE DT-STRING TO DM-DATATYPE.
*Auffüllen des temporären Bereichs, der dann in der
*Tabelle angezeigt werden soll.
PREPARE-DATA SECTION.
*Setzen der einzelnen Inhalte
MOVE 0 TO COUNTER.
MOVE 0 TO KL.
PERFORM VARYING COUNTER FROM 1 BY 1
UNTIL COUNTER > ICOUNT
ADD 1 TO KL
MOVE KL TO DM-INDEX
MOVE DLG-NAME TO STR-TAB
*Zunächst wird der Name gesetzt.
COMPUTE IDUMMY = COUNTER + BASE
MOVE IDUMMY TO INT-TAB
MOVE 5 TO J
MOVE SPACE TO STRFIELD(J)
ADD 1 TO J
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5
MOVE INTFIELD(I) TO STRFIELD(J)
ADD 1 TO J
END-PERFORM
MOVE STR-TAB TO DM-VALUE-STRING
CALL "DMcob_SetVectorValue" USING DM-STDARGS
DM-VALUE
DM-POINTER
*Danach wird der Vorname gesetzt.
ADD 1 TO KL
MOVE KL TO DM-INDEX
MOVE DLG-VORNAME TO STR-TAB
*Aufbereiten eines veraenderten Strings fuer die Anzeige
COMPUTE IDUMMY = COUNTER + BASE
MOVE IDUMMY TO INT-TAB
MOVE 8 TO J
MOVE SPACE TO STRFIELD(J)
ADD 1 TO J
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5
MOVE INTFIELD(I) TO STRFIELD(J)
ADD 1 TO J
END-PERFORM
*Zuletzt wir der Wohnort gesetzt.
MOVE STR-TAB TO DM-VALUE-STRING
CALL "DMcob_SetVectorValue" USING DM-STDARGS
DM-VALUE
DM-POINTER
ADD 1 TO KL
MOVE KL TO DM-INDEX
MOVE DLG-WOHNORT TO STR-TAB
*Aufbereiten eines veraenderten Strings fuer die Anzeige
COMPUTE IDUMMY = COUNTER + BASE
MOVE IDUMMY TO INT-TAB
MOVE 4 TO J
MOVE SPACE TO STRFIELD(J)
ADD 1 TO J
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5
MOVE INTFIELD(I) TO STRFIELD(J)
ADD 1 TO J
END-PERFORM
MOVE STR-TAB TO DM-VALUE-STRING
CALL "DMcob_SetVectorValue" USING DM-STDARGS
DM-VALUE
DM-POINTER
*Ende der Schleife zum Aufbereiten der Daten.
END-PERFORM.
*Uebergeben der gespeicherten Werte an die Anzeige
MOVE DLG-OBJECT TO DM-OBJECT.
MOVE AT-FIELD TO DM-ATTRIBUTE.
MOVE 2 TO DM-INDEXCOUNT.
MOVE 1 TO DM-index.
MOVE 1 TO DM-second.
* Es soll der gesamte Inhalt der Tabelle durch den
* Inhalt des temporären Bereichs ersetzt werden.
* Daher die letzten drei Parameter mit dem Wert 0.
CALL "DMcob_SetVector" USING DM-StdArgs DM-Value
DM-POINTER
by content 0
by content 0
by content 0.
Abschließend wird dieser Bereich wieder im Dialog Manager freigegeben.
*Freigeben des Speicherbereiches
CALL "DMcob_FreeVector" USING DM-StdArgs DM-POINTER.
GOBACK.
3.2.5.2 Funktion TABFUNC
Mit Hilfe dieser Funktion soll das Nachladen des Tablefields erreicht werden. Immer wenn der Benutzer in einen Bereich scrollt, der noch nicht gefüllt ist, wird vom Dialog Manager diese Funktion aufgerufen.
Die Parameter sind fest vom Dialog Manager definiert und können daher nicht geändert werden. Diese Nachladefunktionen erhalten eine Struktur DM-Content-Data als Parameter, in der die notwendigen Informationen gespeichert sind.
01 DM-Content-Data
02 DM-CO-OBJECT pic 9(9) binary.
02 DM-CO-REASON pic 9(4) binary.
02 DM-CO-VISFIRST pic 9(4) binary.
02 DM-CO-VISLAST pic 9(4) binary.
02 DM-CO-LOADFIRST pic 9(4) binary.
02 DM-CO-LOADLAST pic 9(4) binary.
02 DM-CO-COUNT pic 9(4) binary.
02 DM-CO-HEADER pic 9(4) binary.
In DM-Co-Object wird die ID des Tablefields übergeben. Die Felder DM-Co-Visfirst und DM-Co-Vislast enthalten die erste und letzte sichtbare Zeile, die Felder DM-Co-Loadfirst und DM-Co-Loadlast die erste und letzte zu ladende Zeile. Dieses sind jedoch nur die Minimalwerte, die Anwendung darf jederzeit mehr als die angegebenen Zeilen laden.
IDENTIFICATION DIVISION.
PROGRAM-ID. TABFUNC.
AUTHOR. "ISA-DEMO".
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
DATA DIVISION.
FILE SECTION.
WORKING-STORAGE SECTION.
01 STR-TAB.
05 STRFIELD PIC X OCCURS 80.
01 INT-TAB.
05 INTFIELD PIC 9 OCCURS 5.
77 COUNTER PIC 9(4) VALUE 0.
77 BASE PIC 9(4) VALUE 0.
77 DM-POINTER PIC 9(4) BINARY VALUE 0.
77 ICOUNT PIC 9(4) BINARY VALUE 0.
77 IROW PIC 9(4) BINARY VALUE 0.
77 ICOL PIC 9(4) BINARY VALUE 3.
77 IDUMMY PIC 9(4) VALUE 0.
77 I PIC 99 VALUE ZERO.
77 J PIC 99 VALUE ZERO.
77 KL PIC 9(4) VALUE ZERO.
77 DLG-NAME PIC X(80) value "Name ".
77 DLG-VORNAME PIC X(80) value "Vorname ".
77 DLG-WOHNORT PIC X(80) value "Ort ".
77 DLG-COUNT PIC 9(9) BINARY value 0.
Damit auf die DM-Content-Data Struktur zugegriffen werden kann, muss zusätzlich die Datei IDMcoboc.cob per COPY angezogen werden. Ansonsten läuft diese Funktion wie die Funktion FILLTAB ab.
LINKAGE SECTION.
COPY "IDMcobls.cob".
COPY "IDMcoboc.cob".
* Diese COBOL-Funktion legt einen temporaeren Speicher
* bereich im Dialog Manager an und weist diesen dann
* einem Tablefield zu.
PROCEDURE DIVISION USING DM-COMMON-DATA DM-Content-Data.
ORGANIZE-IN SECTION.
COMPUTE ICOUNT = DM-co-loadlast - DM-co-loadfirst.
COMPUTE ICOUNT = ICOUNT + 1.
COMPUTE ICOUNT = ICOUNT* 3.
COMPUTE BASE = DM-co-loadfirst* 3.
MOVE ICOUNT TO DLG-COUNT.
MOVE DM-CO-OBJECT TO DM-OBJECT.
MOVE DT-string TO DM-DATATYPE.
MOVE DM-co-loadfirst TO BASE.
*Initialisierung eines Speicherplatzes im DM
CALL "DMcob_InitVector" USING DM-StdArgs DM-POINTER
DT-String
ICOUNT.
*Initialisierung der DM-Value Struktur
MOVE DT-STRING TO DM-DATATYPE.
PERFORM FILLDATA.
*Uebergeben der gespeicherten Werte an die Anzeige
MOVE DM-CO-OBJECT TO DM-OBJECT.
MOVE AT-FIELD TO DM-ATTRIBUTE.
MOVE 2 TO DM-INDEXCOUNT.
COMPUTE DM-INDEX = DM-co-loadfirst - 1.
MOVE 1 TO DM-second.
CALL "DMcob_SetVector" USING DM-StdArgs DM-Value
DM-POINTER by content 0
by reference DM-co-loadlast ICOL.
*Freigeben des Speicherbereiches
CALL "DMcob_FreeVector" USING DM-StdArgs DM-POINTER.
GOBACK.
FILLDATA.
*Setzen der einzelnen Inhalte
MOVE 0 TO COUNTER.
MOVE 0 TO KL.
MOVE 256 TO DM-INDEXCOUNT.
PERFORM VARYING COUNTER FROM 1 BY 1
UNTIL KL > ICOUNT
ADD 1 TO KL
MOVE KL TO DM-INDEX
MOVE DLG-NAME TO STR-TAB
*Aufbereiten eines veraenderten Strings fuer die Anzeige
COMPUTE IDUMMY = COUNTER + BASE
MOVE IDUMMY TO INT-TAB
MOVE 5 TO J
MOVE SPACE TO STRFIELD(J)
ADD 1 TO J
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5
MOVE INTFIELD(I) TO STRFIELD(J)
ADD 1 TO J
END-PERFORM
MOVE STR-TAB TO DM-VALUE-STRING
CALL "DMcob_SetVectorValue" USING DM-STDARGS
DM-VALUE DM-POINTER
ADD 1 TO KL
MOVE KL TO DM-INDEX
MOVE DLG-VORNAME TO STR-TAB
*Aufbereiten eines veraenderten Strings fuer die Anzeige
COMPUTE IDUMMY = COUNTER + BASE
MOVE IDUMMY TO INT-TAB
MOVE 8 TO J
MOVE SPACE TO STRFIELD(J)
ADD 1 TO J
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5
MOVE INTFIELD(I) TO STRFIELD(J)
ADD 1 TO J
END-PERFORM
MOVE STR-TAB TO DM-VALUE-STRING
CALL "DMcob_SetVectorValue" USING DM-STDARGS
DM-VALUE DM-POINTER
ADD 1 TO KL
MOVE KL TO DM-INDEX
MOVE DLG-WOHNORT TO STR-TAB
*Aufbereiten eines veraenderten Strings fuer die Anzeige
COMPUTE IDUMMY = COUNTER + BASE
MOVE IDUMMY TO INT-TAB
MOVE 4 TO J
MOVE SPACE TO STRFIELD(J)
ADD 1 TO J
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5
MOVE INTFIELD(I) TO STRFIELD(J)
ADD 1 TO J
END-PERFORM
MOVE STR-TAB TO DM-VALUE-STRING
CALL "DMcob_SetVectorValue" USING DM-STDARGS
DM-VALUE DM-POINTER
END-PERFORM.
3.2.6 Funktionen mit Records als Parameter
Im Gegensatz zu den Funktionen für das Tablefield können die nachfolgenden Funktionen ohne Wissen über den Dialog auskommen und sollten das auch. Diese Funktionen werden daher ohne jeglichen Aufruf an den Dialog Manager in Standard-COBOL geschrieben. Lediglich die Copy-Strecken zeigen, dass es sich um Funktionen handelt, die vom Dialog Manager aufgerufen werden.
3.2.6.1 Funktion GETADDR
Diese Funktion soll zu einem gegebenen Namen den restlichen Datensatz an die Oberfläche liefern. Damit auf die Definitionen des Dialog zugegriffen werden kann, wird ein Copy auf die vom Dialog Manager generierte Datei tablec.cpy eingefügt.
IDENTIFICATION DIVISION.
PROGRAM-ID. GETADDR.
AUTHOR. "ISA-DEMO".
DATA DIVISION.
WORKING-STORAGE SECTION.
LINKAGE SECTION.
COPY "IDMcobls.cob".
*Das nachfolgende Copy gehört zu dieser Anwendung. Es
*wurde vom DM aus dem Dialog generiert und sollte in den
*COBOL-Modulen da verwendet werden, wo auf die entsprechenden
*Strukturen zugegriffen werden soll.
COPY "tablec.cpy".
PROCEDURE DIVISION USING DM-COMMON-DATA RECADDRESS.
SEC-RECADDRESS SECTION.
*Hier müssten jetzt die Werte für die einzelnen Einträge
*aus der Datenbank geholt werden.
*Das entfällt hier. Stattdessen werden hier Dummy-Werte
*in die entsprechenden Strukurelemente zugewiesen.
MOVE "NAME" TO NNAME.
MOVE "VORNAME" TO FIRSTNAME.
MOVE "STRASSE" TO STREET.
MOVE 3 TO COUNTRY.
GOBACK.
3.2.6.2 Funktion PUTADDR
Diese Funktion soll die vom Benutzer geänderten Daten wieder abspeichern. Damit auf die Definitionen des Dialogs zugegriffen werden kann, wird ein Copy auf die vom Dialog Manager generierte Datei tablec.cpy eingefügt.
IDENTIFICATION DIVISION.
PROGRAM-ID. PUTADDR.
AUTHOR. "ISA-DEMO".
DATA DIVISION.
WORKING-STORAGE SECTION.
LINKAGE SECTION.
COPY "IDMcobls.cob".
*Das nachfolgende Copy gehört zu dieser Anwendung. Es
*wurde vom DM aus dem Dialog generiert und sollte in den
*COBOL-Modulen da verwendet werden, wo auf die entsprechenden
*Strukturen zugegriffen werden soll.
COPY "tablec.cpy".
PROCEDURE DIVISION USING DM-COMMON-DATA RECADDRESS.
SEC-RECADDRESS SECTION.
*Hier müssten jetzt die Werte für die einzelnen Einträge
*in der Datenbank gespeichert werden.
*Das entfällt hier. Stattdessen werden hier Dummy-Werte
*in die entsprechenden Strukurelemente zugewiesen.
MOVE " " TO STREET.
MOVE 0 TO COUNTRY.
GOBACK.