Codierbeispiel: Variablen splitten
Autor: Peter Hinsberg

Frage:
Wie kann man Speichervariablen inhaltlich splitten, ohne vom Compiler eine Warnung zurück zu bekommen?
Beispiel: Man will das vom System gelieferte Datum (8stelliges numerisches Feld) in Stunden, Minuten, Sekunden und hundertstel Sekunden aufsplitten.
Antwort:
Anfangs habe ich es selber so gemacht, daß ich z.B. die Stellen hinter den Stunden durch folgende Rechenoperation entfernt habe:

*-------------------------------------------------*
*-------------------------------------------------*
*Eintrag in der 
WORKING-STORAGE SECTION

01  ZEIT                        PIC 9(08).
01  STUNDEN                     PIC 9(02).

*-------------------------------------------------*

*Eintrag in der 
POCEDURE-DIVISON

ACCEPT ZEIT FROM TIME
COMPUTE STUNDEN = ZEIT / 1000000

*-------------------------------------------------*
*-------------------------------------------------*

Diese Operation nimmt der Compiler noch ohne Klagen entgegen....

Die führenden Stellen z.B. vor den hundertstel Sekunden lassen sich durch folgende Anweisung entfernen:

*-------------------------------------------------*
*-------------------------------------------------*
*Eintrag in der 
WORKING-STORAGE SECTION

01  ZEIT                        PIC 9(08).
01  HUNDERTSTEL-SEKUNDEN        PIC 9(02).

*-------------------------------------------------*

*Eintrag in der 
POCEDURE-DIVISON

ACCEPT ZEIT FROM TIME
MOVE ZEIT TO HUNDERTSTEL-SEKUNDEN
*-------------------------------------------------*
*-------------------------------------------------*

Diese Opertaion wird vom Compiler zwar entgegengenommen, jedoch gibt er eine Warnung aus:

FILES MAY BE TRUNCATED DURING MOVE FROM ZEIT....


Viel Gelaber, nun die Lösung:
Der oben angesprochene Lösungsweg funktioniert zwar, ist jedoch sehr platzaufwendig (die Source läßt sich später schlechter lesen) und obendrein auch sehr unschön anzugucken (besonders beim compilieren ;).
Statt dessen schreibt man:

*-------------------------------------------------*
*-------------------------------------------------*
*Eintrag in der 
WORKING-STORAGE SECTION

01  ZEIT                        PIC 9(08).

01  TIMER.
   05  STUNDEN                  PIC 9(02).
   05  MINUTEN                  PIC 9(02).
   05  SEKUNDEN                 PIC 9(02).
   05  HUNDERTSTEL-SEKUNDEN     PIC 9(02).
*-------------------------------------------------*

*Eintrag in der 
POCEDURE-DIVISON

ACCEPT ZEIT FROM TIME
MOVE ZEIT TO TIMER
*-------------------------------------------------*
*-------------------------------------------------*


COBOL schreibt in diesem Falle die Zahlen der Speichervariable ZEIT der Reihe nach (also von "links nach rechts") in die, zu Verfügung stehenden Felder der Speichervariablengruppe TIMER, von "oben links" angefangen.
Das Ergebnis ist, daß alle Einheiten der Zeitberechnung (Stunden, Minuten, usw...) in einem sepperaten Feld stehen und getrennt von einander bearbeitet werden können.

...