Zum Inhalt springen

Cobol Einsteiger


Natriumarm

Empfohlene Beiträge

Hallo,

ich bin neu hier und vor allem noch ganz neu in Cobol und hab da ein, zwei grundsätzliche Fragen.

Ich habe einen Auftrag bekommen, bei dem ich eine gegebene Datei durchlaufen soll und dann entsprechende Vergleiche anstellen soll. Aussehen sollen das ungefähr so.

Aufbau der Datei (ziemlich simpel):

123456781234567812345678901234567890

876543211234567812345678901234567890

.

.

.

983546274826384636274374627361926491

geforderter Vergleich:

Ersten Datensatz einlesen (hab ich Vergleich_alt genannt)

Zweiten Datensatz einlesen (Vergleich_neu)

If Abfrage auf Unterschiede (hab ich)

dann je nach Ergebnis den neuen Satz verwerfen und einen Zähler hochzählen oder auf den alten schieben und auf den neuen einen aus der Datei und das ganze solange, bis die Datei durchlaufen ist.

Die Ergebnisse sollen dann in eine neue Datei weggeschrieben werden.

Bin grad mal seit ein paar Wochen an Cobol dran und glaub mit Perform until das irgendwie lösen zu können, bin aber noch nicht ganz hinter gestiegen wie.

Hoffe, das ihr mir ein wenig helfen könnt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

hmm... nach mehrmaligem Lesen:

viele Wege führen nach Rom. Das ist ja grad das schöne am Programmieren. Es gibt mehrere mehr oder weniger schöne Lösungen.

"perform until" ist eine von vielen.

ist es das was du wissen willst:



perform verabeitung

until abbruch = true


[...]


verarbeitung section.

  [dein code]

  [...]

  [wenn abbruchbedingung erfüllt dann abbruch = true]

exit.


du hast doch bestimmt nen "Habib" zum nachschlagen bekommen, oder?

in meinem steht unter "perform until" n schönes Beispiel... ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das ist genau das Problem...ich hab so gut wie nix zum Nachschlagen. Ich hatte eine Schulung auf Fujitsurechner obwohl ich auf nem IBM Großrechner arbeite.

Meine Unterlagen erstrecken sich über cfs, sort, percon und diesen ganzen Fujitsu Sachen, aber Cobol selber so gut wie nix.

Also so in die Richtung geht das schon was du geschrieben hast, aber soweit kenn ich das auch.

Ich versuch mal mein Problem noch zu definieren. Ich habe eine Eingabedatei die in mein Programm reinläuft. In dieser Datei stehen halt viele viele Datensätze und ich muss DS 1 mit DS 2 vergleichen um Zählungen durchzuführen (Statistik).

Mein Problem daran ist, wie sag ich Cobol nimm jetzt 1&2 - vergleich die - führe deine Aktion aus (soweit hab ichs) und behalte (je nach Ergebnis des Vergleichs) DS1 oder 2 und fülle die freie Variable mit DS3 aus der Datei. Das ganze halt, bis die Datei durchgelaufen ist.

Hoffe ich konnte mich jetzt klarer ausdrücken.

MFG und vielen Dank schonmal.

Link zu diesem Kommentar
Auf anderen Seiten teilen

hmm... also ich denke ich hab´s verstanden... und im Prinzip du doch auch... ;)

schreib dir das ganze nochmal ordentlich als Pseudocode auf. Ruhig auch hier, dann können wir mal zusammen Schritt für Schritt schauen wo du Probleme hast.

was mich dabei noch interessiert:

wie sind deine Dateien definiert?

ISAM Files? Sequentiell? Satzbett?

suchst du jetzt die Bedingung wann das Dateiende erreicht ist?

(---> Filestatus 10; "00" ist eine fehlerfreie Dateiaktion, bei allen anderen Stati war was nicht ok)

Zählung bzw Zählvariable sollte doch kein Problem sein, oder?

wenn du noch länger mit Cobol arbeitest würd ich dir den "Habib" empfehlen... ist imho ein sehr gutes Nachschlagewerk.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich papp da jetzt mal was hin, was ich hab. Die Variablennamen sind im übrigen geändert, da nicht jeder wissen muss, woran ich arbeite (Datenschutz). Mir gehts einfach nur darum die Logik richtig zu verstehen, da ich vorraussichtlich noch 1, 2..... Jahre mit Cobol beschäftigt sein werde.


MOVE Ein-Dtsz TO Vergleich-alt


PERFORM UNTIL Ein-eof                                

   MOVE Ein-Dtsz TO Vergleich-neu                    

   IF Teil1-alt = Teil1_neu AND Teil2-alt = Teil2-neu

      IF Teil3-alt = Teil3-neu                   

         compute zaehler = zaehler + 1       

      ELSE                                           

         Display 'Einmalige Kombination'             

      END-IF                                         

      MOVE Vergleich_neu TO DT-Satz                  

      EVALUATE Fallzaehler                           

      *Evaluate außen vor*    

      END-EVALUATE                                   

   ELSE                                              

      MOVE Vergleich-neu TO Vergleich-alt            

      MOVE 0 TO zaehler                          

   END-IF                                            

END-PERFORM                                          

Bin mir hier eben nicht sicher, bzw bin mir sicher das ich perform falsch einsetze :upps

Also für Tips bin ich immer offen, ich wills ja richtig lernen.

PS: hab mir den Habib von dir eben angeschaut, Java, XML, WEB --> wenn das alles da mit drin ist, ists viel, was ich nicht brauchen werde, da ich rein COBOL mache und wenn ich dann hoffentlich in eine Abteilung mal wechseln kann um Java zu machen, hab ich CORE JAVA :D

Aber danke für den Tip, suche ja selber nach guter COBOL Literatur und bin noch nicht richtig überzeugt von einem Buch.

MFG und schönen Feierabend (wenns dann so weit ist)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich papp da jetzt mal was hin, was ich hab. Die Variablennamen sind im übrigen geändert, da nicht jeder wissen muss, woran ich arbeite (Datenschutz).

kein Problem, mach ich i.d.R. auch wenn ich Code poste.


MOVE Ein-Dtsz TO Vergleich-alt


PERFORM UNTIL Ein-eof                                

   MOVE Ein-Dtsz TO Vergleich-neu                    

   IF Teil1-alt = Teil1_neu AND Teil2-alt = Teil2-neu

      IF Teil3-alt = Teil3-neu                   

         compute zaehler = zaehler + 1       

      ELSE                                           

         Display 'Einmalige Kombination'             

      END-IF                                         

      MOVE Vergleich_neu TO DT-Satz                  

      EVALUATE Fallzaehler                           

      *Evaluate außen vor*    

      END-EVALUATE                                   

   ELSE                                              

      MOVE Vergleich-neu TO Vergleich-alt            

      MOVE 0 TO zaehler                          

   END-IF                                            

END-PERFORM                                          

Bin mir hier eben nicht sicher, bzw bin mir sicher das ich perform falsch einsetze :upps

Also für Tips bin ich immer offen, ich wills ja richtig lernen.

ja, du kannst das "perform until" so einsetzen. Zumindest machen wir das hier unter Acucobol-GT auch so. Ich sehe in deinem Code aber a) keinen Punkt hinter dem end-perform und B) auch nicht wo du die Dateien nachliest und die Abbruchbedingung setzt. Nicht dran gedacht oder beim kopieren weggelassen?

Nachtrag: ich weiss nicht welchen Cobol-Dialekt du benutzt. Evtl könnte der Compiler meckern. Dann sollte es eigentlich helfen den Code zwischen "perform until" und "end-perform" in eine section zu packen und die aufzurufen.

Tips: "compute" ist im Gegensatz zu "add" langsam. Merkt man bei wenigen Datensätzen sicher nicht, aber wenn du dir überlegst wie viele Datensätze Cobol normalerweise verarbeitet kannst du mit "add" u.U. schon etwas Rechenzeit sparen.

PS: hab mir den Habib von dir eben angeschaut, Java, XML, WEB --> wenn das alles da mit drin ist, ists viel, was ich nicht brauchen werde, da ich rein COBOL mache und wenn ich dann hoffentlich in eine Abteilung mal wechseln kann um Java zu machen, hab ich CORE JAVA :D

Aber danke für den Tip, suche ja selber nach guter COBOL Literatur und bin noch nicht richtig überzeugt von einem Buch.

hmm... soweit ich weiss, gelten die, bzw das Buch von Raouf Habib als _das_ Cobol-Buch. Und eine ältere Ausgabe ohne Java wirst du wohl kaum noch kriegen! ;)

evtl kannst du dir das Buch ja über die Firma bestellen oder mal schauen ob eine Bücherei in der Nähe Cobol-Literatur im Bestand hat, obwohl ich letzteres bezweifel...

MFG und schönen Feierabend (wenns dann so weit ist)

danke, dir auch

Bearbeitet von geloescht_KaelteContainer
Nachtrag
Link zu diesem Kommentar
Auf anderen Seiten teilen

Guten Morgen,

das Einlesen der Datei erfolgt in anderen Sections, die ich jetzt nicht reinkopiert hatte (waren gegeben, sollten als funktionieren).

Das der Punkt hinter dem End-Perform fehlt ist auch korrekt, da noch anderer Code in der Section folgt.

Mir gehts halt hauptsächlich darum zu verstehen ob ich mit meinem Code jetzt DS für DS abarbeite und die Logik richtig verstanden habe.

Danke für den Tip mit "add" - aus der Schulung kannte ich nur compute und der Dozi meinte, das das völlig ausreicht. In diesem Fall stimmt das sicher auch, der Zaehler läuft vll bis maximal 100 und wird ja immer nur um 1 erhöht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mir gehts halt hauptsächlich darum zu verstehen ob ich mit meinem Code jetzt DS für DS abarbeite und die Logik richtig verstanden habe.

das kann ich dir so nicht sagen, da du in deinem Beispiel ja die Stellen weggelassen hast an denen du die Datei nachliest! ;)

Ich vermute jetzt einfach mal blind, dass du eine sequentielle Datei hast? Sind die Datensätze darin sortiert? Ansonsten wirst du wohl jeden Datensatz miteinander vergleichen müssen...

hast du denn Code denn schonmal laufen lassen und ihn dir im Animator oder Debugger angeschaut?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mahlzeit,

dann hier noch ein bissl Code, bei dem die Datei ausgelesen wird. Sie liegt sortiert vor.


LESEN-EIN SECTION.                  

L-VB-1.                             

    PERFORM LESEN-SATZ UNTIL EIN-EOF

    continue.                       

L-VB-9.                             

    EXIT.                           


LESEN-SATZ SECTION.                                            

SE1.                                                           

      READ Datei                                            

      END-READ                                                 

      IF EIN-OK THEN                                           

         ADD 1 TO ANZ-LES                                      

      ELSE                                                     

         IF EIN-EOF THEN                                       

            DISPLAY '*********************************'        

            DISPLAY 'Meldung von Bla:'                     

            DISPLAY 'EOF erreicht,'                            

            DISPLAY 'es wurden ' ANZ-LES ' Dtsz eingelesen'    

            DISPLAY '*********************************'        

         ELSE                                                  

            DISPLAY '*********************************'        

            DISPLAY 'FEHLER LESEN //EIN             '          

            DISPLAY 'DAT-STATUS: ' DAT-STA-EIN                 

            DISPLAY 'Satznummer: ' ANZ-LES                     

            DISPLAY '*********************************'        

            MOVE 12 TO RETURN-CODE                             

            GO TO S9                                           

         END-IF                                                

      END-IF                                                                     

      continue.                                    

SE9.                                               

    EXIT.                                          

Damit wird das ganze eingelesen. In der Steuerungssection mache ich einen Aufruf von der Lesen-Ein Section.

Hab jetzt noch ein paar andere Aufgaben dazu bekommen, die ich lösen muss - bevor ich zu meinem eigentlich Problem komme :P Aber ich denke mal, das wird heut noch gschafft.

Link zu diesem Kommentar
Auf anderen Seiten teilen

*g*

so meinte ich das eigentlich nicht... ;)

ich glaub dir ja das dein Datei-Lesen funktioniert.


PERFORM UNTIL Ein-eof

   [COLOR="Red"]hier zum Beispiel Datei-Lesen[/COLOR]                             

   MOVE Ein-Dtsz TO Vergleich-neu                    

   IF Teil1-alt = Teil1_neu AND Teil2-alt = Teil2-neu

      IF Teil3-alt = Teil3-neu                   

         compute zaehler = zaehler + 1       

      ELSE                                           

         Display 'Einmalige Kombination'             

      END-IF                                         

      MOVE Vergleich_neu TO DT-Satz                  

      EVALUATE Fallzaehler                           

      *Evaluate außen vor*    

      END-EVALUATE                                   

   ELSE                                              

      MOVE Vergleich-neu TO Vergleich-alt            

      MOVE 0 TO zaehler                          

   END-IF                                            

END-PERFORM

sowas meinte ich. und das:

Datei 1      Datei 2

  01             06

  05             05

  10             99

  87             23

  99             42

hast du dir, ohne das direkt in Code umzusetzen, überlegt wie du die Dateien vergleichen willst?

liest du den ersten Datensatz aus Datei 1 (hier: 01) und vergleichst den nachheinander mit jedem Datensatz in Datei 2 um nach Dateiende mit dem nächsten Datensatz aus Datei 1 (hier: 05) weiter zu machen und die Datei 2 wieder von vorne bis hinten zu durchsuchen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nein der Vergleich soll folgendermaßen laufen.

In der einen Datei stehen Datensätze wie ganz oben schon angedeutet. ich machs hier nochmal ausführlich:

123456789bla456

123456789bla789

123456987bla789

...

123456789bla987

Sortiert ist die Datei nach einem bestimmten Kriterium. In diesem Fall die ersten 9 Stellen, dann die nächsten 3, dann die letzten 3.

Jeder Datensatz ist also eine lange Kombination von Zahlen und Buchstaben, BSP: deinalter,Nachname,PsdeinesAutos

Vergleich läuft folgendermaßen, bzw soll so laufen:

V1 bekommt ersten DS

V2 den zweiten

geschaut wird ob nachname+PSdeinesAutos übereinstimmen, wenn ja, dann prüfe ob auch deinalter übereinstimmt, wenn ja, zähle dem Fallzähler eins hinzu zu.

V2 bekommt den nächsten DS und prüft das selbe. Wenn jetzt Nachname+PsdeinesAutos nicht übereinstimmen, soll V2 in V1 reingemoved werden und V2 nimmt sich den 4. DS.

Das Spielchen dann solange bis die Datei durchlaufen ist

Link zu diesem Kommentar
Auf anderen Seiten teilen

Guten Morgen,

bin meinem Problem auf die Schliche gekommen. Biege jetzt auf die Zielgerade ein mit der eigentlich Zählung.

Muss ihm noch schnell beibringen das er bei doppelten DS, diese nur einmal zählt und dann gehts ans testen.

Vielen Dank nochmal für deine Tips.

PS:

Das Buch werd ich mir mal versuchen zu besorgen bzw anzuschauen, bevor ichs dann wirklich kaufe.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 1 Jahr später...

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...