Tutorials/Cobol Tutorial

From ThorstensHome
Revision as of 17:12, 10 May 2009 by WikiSysop (Talk)

Jump to: navigation, search

Cobol

Diese Seite wurde am 7.4.2002 für ein firmeninternes Abschlussprojekt zu einem Cobol-Programmierpraktikum ins Leben gerufen. Ich freue mich über jeden Leser, adressiere hier aber die Projektteilnehmer.

Abk.

Cobol
Common bussiness oriented language, solltet ihr schonmal gehört haben ;-) Eine an kaufmännischen Anforderungen ausgerichtete Programmiersprache der 60er Jahre, besonders beliebt im Großrechner-Umfeld. Da hier elegante (und unverständliche) Befehle wie unless ($query->param()) { unmöglich sind, wird Cobol auch die "Prosa der Programmiersprachen" genannt. Eine (vom Alter und vom Einsatz) vergleichbare Programmiersprache ist PL/1.
ISPF
Ist die Menüumgebung des TSO. Gäbe es kein ISPF, müsstet ihr zum Kopieren statt 3.4 (das geht, probiert es mal aus) umständliche Kommandobefehle wie unter der bash bei Linux oder damals unter der Shell von DOS eingeben. Wenn ihr die Langform von ISPF kennt, klickt bitte hier.
TSO
Time-Sharing-Option, ein System unter OS/390 unter dem Dateioperationen und JCL-Programmläufe möglich sind. Hierarchisch befindet es sich auf der gleichen Ebene wie CICS, es wird von OS/390 direkt aufgerufen.
OS/390
Operating System 390, das Betriebssystem, mit dem der Großrechner seine Ressourcen und Geräte verwaltet und Eingaben entgegen nimmt.
JCL
Job Control Language, ein unter TSO über den ISPF aufzurufendes System, das Befehle bereitstellt, die Programme kopieren, compilieren, ausführen usw..
CICS
Customer Information Control System, ein System, dass den Dialog mit dem Großrechner ermöglicht. Ihm werden die Befehle syntaktisch wie SQL übermittelt: durch einen EXEC CICS-Block im Cobol-Sourcecode. CICS ist nicht Gegenstand unseres Tutorials.
SQL
Structured Query Language, eine Datenbankabfragesprache (der IVten Generation), speziell auf relationalen und objektrelationalen Datenbankmanagementsystemen eingesetzt.
Sourcecode
Hier nun ein Beispiel-Cobol-Sourcecode eines noch nicht ganz fertigen Programms. Wichtig sind dabei speziell die Abstände zum linken Rand, da ein falscher Abstand (eine unkorrekte Anzahl an Leerzeichen) einen Fehler erzeugen kann.

     ***************************************************************** 00010003
     *  -----------------------                                        00020003
     *  Programm zur Dateibehandlung von Thorsten                      00030024
     *                                                                 00040003
     ***************************************************************** 00050003
     *                                                                 00060003
     * Dieses Programm liest einen Datensatz aus einer sequentiellen   00070024
     * Datei ein, berprft ihn, und schreibt ihn, falls fehlerhaft,   00080024
     * in eine Fehlerdatei, andernfalls in eine Ausgabedatei.          00090024
     * u123105.cobol.cobol(dat) (c) 16.10.1 by Thorsten Strk          00100024
     *---------------------------------------------------------------- 00110003
                                                                       00120024
      IDENTIFICATION DIVISION.                                         00130003
     *---------------------------------------------------------------- 00140003
      PROGRAM-ID.    ourfirst.                                         00150012
     *                                                                 00160003
     *---------------------------------------------------------------- 00170003
      ENVIRONMENT DIVISION.                                            00180003
     *---------------------------------------------------------------- 00190003
     *                                                                 00200003
      CONFIGURATION SECTION.                                           00210003
      SOURCE-COMPUTER. IBM-OS390.                                      00220008
      OBJECT-COMPUTER. IBM-OS390.                                      00230008
      SPECIAL-NAMES.                                                   00240003
                                                                       00250024
      input-output section.                                            00260024
      file-control.                                                    00270024
          select eingabe assign to eindat.                             00280045
          select ausgabe assign to ausdat.                             00290026
          select fehler  assign to fehldat.                            00300026
     *                                                                 00310003
     *---------------------------------------------------------------- 00320003
      DATA DIVISION.                                                   00330003
     *---------------------------------------------------------------- 00340003
     *                                                                 00350003
      file section.                                                    00360024
      fd eingabe                                                       00370048
          block contains 0 records.                                    00380047
      01 ein-satz.                                                     00390024
         05 e-name pic x(15).                                          00400024
         05 e-str  pic x(20).                                          00410024
         05 e-plz  pic 9(5).                                           00420024
         05 e-ort  pic x(15).                                          00430024
         05 e-an   pic x.                                              00440024
         05 messwerte pic x(48).                                       00450024
      fd ausgabe                                                       00460048
          block contains 0 records.                                    00470047
      01 aus-satz.                                                     00480024
         05 a-name pic x(15).                                          00490024
         05 a-str  pic x(20).                                          00500024
         05 a-plz  pic 9(5).                                           00510024
         05 a-ort  pic x(15).                                          00520024
         05 a-an   pic x.                                              00530024
         05 messwert2 pic x(48).                                       00540053
      fd fehler                                                        00550048
          block contains 0 records.                                    00560047
      01 fehl-satz.                                                    00570029
         05 a-name pic x(15).                                          00580029
         05 a-str  pic x(20).                                          00590029
         05 a-plz  pic 9(5).                                           00600029
         05 a-ort  pic x(15).                                          00610029
         05 a-an   pic x.                                              00620029
         05 messwert3 pic x(48).                                       00630053
      WORKING-STORAGE SECTION.                                         00640003
      01  artikel pic x(3).                                            00650024
      01  dateiende pic 9 value 0.                                     00660036
      01  falsch pic 9 value 0.                                        00670037
     *                                                                 00680003
     *                                                                 00690003
     *---------------------------------------------------------------- 00700003
      PROCEDURE DIVISION.                                              00710003
     *---------------------------------------------------------------- 00720003
     *                                                                 00730003
      MAIN SECTION.                                                    00740003
      MAIN-S.                                                          00750003
          display 'Unberechtigtes Vervielfltigen verboten !!!'        00760012
          open input eingabe, output ausgabe, output fehler            00770032
          perform until dateiende = 1                                  00780036
            read eingabe at end move 1 to dateiende                    00790036
            end-read                                                   00800033
            if dateiende = 0 then perform reaktion                     00810054
            end-if                                                     00820055
          end-perform.                                                 00830033
          close eingabe, ausgabe, fehler.                              00840033
          continue.                                                    00850025
      MAIN-X.                                                          00860003
          STOP RUN.                                                    00870003
      reaktion section.                                                00880033
          move '0' to falsch.                                          00890043
          if e-name=' ' then                                           00900041
            move '1' to falsch                                         00910040
            move 'Name ist leer' to fehl-satz                          00920039
            write fehl-satz                                            00930036
          end-if                                                       00940036
          if e-str=' ' then                                            00950041
            move '1' to falsch                                         00960040
            move 'Str. ist leer' to fehl-satz                          00970039
            write fehl-satz                                            00980036
          end-if                                                       00990036
          if e-plz=' ' then                                            01000041
            move '1' to falsch                                         01010040
            move 'PLZ ist leer' to fehl-satz                           01020039
            write fehl-satz                                            01030036
          end-if                                                       01040036
          if e-plz is not numeric then                                 01050049
            move '1' to falsch                                         01060049
            move 'PLZ nicht numerisch' to fehl-satz                    01070049
            write fehl-satz                                            01080049
          else                                                         01090049
            if not (e-plz>01066 and e-plz<99999)                       01100051
              move '1' to falsch                                       01110049
              move 'PLZ im falschen Bereich' to fehl-satz              01120049
              write fehl-satz                                          01130049
            end-if                                                     01140049
          end-if                                                       01150049
          if e-ort=' ' then                                            01160041
            move '1' to falsch                                         01170040
            move 'Ort ist leer' to fehl-satz                           01180039
            write fehl-satz                                            01190036
          end-if                                                       01200036
          if not (e-an='W' or e-an='M') then                           01210051
            move '1' to falsch                                         01220040
            move 'GKZ fehlerhaft' to fehl-satz                         01230039
            write fehl-satz                                            01240036
          end-if                                                       01250036
          if messwerte is not numeric then                             01260052
            move '1' to falsch                                         01270052
            move 'Messwerte nicht numerisch' to fehl-satz              01280052
            write fehl-satz                                            01290052
          end-if                                                       01300052
          if falsch = 0 then                                           01310040
            move ein-satz to aus-satz                                  01320039
            write aus-satz                                             01330036
          else move ein-satz to fehl-satz                              01340039
            write fehl-satz                                            01350036
          end-if                                                       01360036
                                                                       01370036
          exit.                                                        01380033