2016-04-05 8 views
3

Also im Lesen eines mmddyyyy (01012000) date in ein Bild x (8) und ich frage mich, wie ich eine neue Variable mit den vorherigen Variablen Informationen in yyyymmdd (20000101) Format erstellen kann. Ich bin mir sicher, dass es einen Weg geben muss, dies mit Teilstrings zu tun oder was nicht?Konvertieren eines Datums in COBOL

Antwort

2

In Arbeitsspeicher:

77 mmddyyyy-date pic x(8). 
77 yyyymmdd-date pic x(8). 

In der Prozedur Division Logik:

move mmddyyyy-date(1:2) to yyyymmdd-date(5:2) 
move mmddyyyy-date(3:2) to yyyymmdd-date(7:2) 
move mmddyyyy-date(5:4) to yyyymmdd-date(1:4) 
4

@ScottNelson den "mit Teil" Teil der Antwort zur Verfügung gestellt hat, finden Sie das "oder was nicht" Teil der Antwort.

01 mmddyyyy. 
    05 mm  pic xx. 
    05 dd  pic xx. 
    05 yyyy pic xxxx. 

01 yyyymmdd. 
    05 yyyy pic xxxx. 
    05 mm  pic xx. 
    05 dd  pic xx. 

move corresponding mmddyyyy to yyyymmdd 
2
01 a-name-to-describe-the-source-date. 
     05 antdtsd-dd      PIC XX. 
     05 antdtsd-mm      PIC XX. 
     05 antdtsd-yyyy     PIC XXXX. 

    01 a-name-to-describe-the-destination-date. 
     05 antdtdd-yyyy     PIC XXXX. 
     05 antdtdd-mm      PIC XX. 
     05 antdtdd-dd      PIC XX. 

Oder

01 a-name-to-describe-the-source-date PIC X(8). 
    01 FILLER 
     REDEFINES a-name-to-describe-the-source-date. 
     05 antdtsd-dd      PIC XX. 
     05 antdtsd-mm      PIC XX. 
     05 antdtsd-yyyy     PIC XX. 

    01 a-name-to-describe-the-destination-date. 
    01 FILLER 
     REDEFINES a-name-to-describe-the-destination-date. 
     05 antdtdd-yyyy     PIC XX. 
     05 antdtdd-mm      PIC XX. 
     05 antdtdd-dd      PIC XX. 

Dann

 MOVE antdtsd-dd      TO antdtdd-dd 
     MOVE antdtsd-mm      TO antdtdd-mm 
     MOVE antdtsd-yyyy     TO antdtdd-yyyy 

Erstens Sie overstating Dinge, wenn Sie diese "Umwandlung" nennen. Es ist eine einfache Neuanordnung von Daten.

Zweitens gibt es viele Möglichkeiten, dies zu tun. Welchen Weg machst du es? COBOL wird normalerweise von "Teams" codiert, und wenn Sie dies für einen Job tun, werden Sie am besten bedient, wenn Sie es so machen, wie es andere in Ihrem Team tun.

Sie haben zwei Möglichkeiten gezeigt: Referenzmodifikation und die Verwendung von CORRESPONDING (was, wenn Sie es im echten Code sehen, wird oft als CORR abgekürzt - wer CORRESPONDING eingibt, wenn die Absicht nicht viel ist). ..?).

Wie anders zu wählen zwischen ihnen? Performance? Sie werden wahrscheinlich identischen Code generieren. Also der Compiler ist da draussen. Verständlichkeit für den menschlichen Leser? Für mich ist das in COBOL (oder einer anderen Sprache) sehr wichtig.

Zwei Probleme mit der Referenzmodifikation. Tippfehler? Kein Problem, Code wird kompiliert und ausgeführt. Und Sie werden es beim Testen finden. Willst du nicht? Irgendwann? Und die ganze Zeit verschwenden, bis du es gefunden hast. Die zweite ist, was bedeutet (5: 4)? Wenn dir jemand sagt "dieses Programm macht etwas Ungewöhnliches mit Jahren", musst du zuerst feststellen, dass das Jahr als (5: 4) getarnt ist. Oh, und (1: 4). Großartig, Sie haben noch nicht einmal angefangen, nach dem Problem mit dem Programm zu suchen, und Sie müssen immer noch überprüfen, ob die Positionen und Längen korrekt sind. OK, ein Datum ist ein triviales Beispiel, aber Referenz-Modifikation-Benutzer wenden es vermutlich auf alles an, was sie können (wenn nicht, warum es auf ein Datum anwenden)? Also viel Spaß beim Lesen.

Oh, und COBOL hat keine "Strings", es hat Felder fester Länge. Referenzmodifikation erzeugt Felder

Die CORR. Dies spart viel Tipparbeit (der Grund dafür ist vermutlich die Lochkarten und die Art und Weise, wie viele COBOL-Programme Eingabedaten verarbeiten und neue Ausgabedaten erzeugen. Programme auf Lochkarten, also ein echter Grund, das Tippen zu reduzieren). für Lochkartenprogramme).

Nun, das ist jetzt moderne Zeiten.

Nehmen wir an, Sie möchten den "Monat" als Index verwenden, um den Monatsnamen zu erhalten, wenn das Jahr 2005 ist.

IF yy OF yyyymmdd EQUAL TO "2005" 
    MOVE month-name-in-table (mm OF yyyymmdd) TO ... 
END_IF 

(das davon ausgeht mm OF yyyymmdd ist als numerisch definiert).

Möchten Sie "Qualifizierung" (die Verwendung von OF oder IN, um einen Namen eindeutig zu machen, indem Sie auf etwas verweisen, zu dem es gehört) im gesamten Programm streuen, nur damit Sie CORR verwenden können?

+0

Schöne Erklärung, Bill. Aber deine 05 Level -yyyy Felder sind nur PIC XX in der aktuellen Liste. Außerdem; Da ich ein "COBOL-Programmierer in der kleinen, nur um Leute zu zeigen" -Typ Entwickler bin, könnte ich gut alle drei Stile auf der gleichen Seite Code verwenden. Nur um die Vielseitigkeit zu zeigen. Könnte in einer Produktionshalle keinen Sinn ergeben, aber * hoffentlich * ist es nicht allzu schädlich in How-to Samples. –

+0

@BrianTiffin danke für den Spot. Sollte getestet haben :-). Sicher. Ich möchte, dass es die erste Wahl ist, die auf diese Weise verwendet wird, mit Wissen über die anderen Möglichkeiten (die auftreten werden). –

+0

Zustimmen, Bill. Am klarsten ist immer das Beste. –