Natriumarm Geschrieben 3. Februar 2009 Geschrieben 3. Februar 2009 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. Zitieren
geloescht_KaelteContainer Geschrieben 3. Februar 2009 Geschrieben 3. Februar 2009 hmm... ich glaub es ist noch zu früh... ich hab deine Frage nicht ganz verstanden... was genau willst du wissen? Zitieren
geloescht_KaelteContainer Geschrieben 3. Februar 2009 Geschrieben 3. Februar 2009 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... Zitieren
Natriumarm Geschrieben 3. Februar 2009 Autor Geschrieben 3. Februar 2009 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. Zitieren
geloescht_KaelteContainer Geschrieben 3. Februar 2009 Geschrieben 3. Februar 2009 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. Zitieren
Natriumarm Geschrieben 3. Februar 2009 Autor Geschrieben 3. Februar 2009 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 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) Zitieren
geloescht_KaelteContainer Geschrieben 3. Februar 2009 Geschrieben 3. Februar 2009 (bearbeitet) 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 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 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 3. Februar 2009 von geloescht_KaelteContainer Nachtrag Zitieren
Natriumarm Geschrieben 4. Februar 2009 Autor Geschrieben 4. Februar 2009 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. Zitieren
geloescht_KaelteContainer Geschrieben 4. Februar 2009 Geschrieben 4. Februar 2009 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? Zitieren
Natriumarm Geschrieben 4. Februar 2009 Autor Geschrieben 4. Februar 2009 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 Aber ich denke mal, das wird heut noch gschafft. Zitieren
geloescht_KaelteContainer Geschrieben 4. Februar 2009 Geschrieben 4. Februar 2009 *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? Zitieren
Natriumarm Geschrieben 4. Februar 2009 Autor Geschrieben 4. Februar 2009 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 Zitieren
geloescht_KaelteContainer Geschrieben 4. Februar 2009 Geschrieben 4. Februar 2009 aaaah... :upps mea culpa! hab das etwas anders verstanden... vielleicht auch deshalb, weil ich mir mal ein Programm geschrieben hab was zwei Dateien miteinander vergleicht! aber am Prinzip Lesen-Vergleichen-Verarbeiten ändert sich ja nichts... Zitieren
Natriumarm Geschrieben 5. Februar 2009 Autor Geschrieben 5. Februar 2009 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. Zitieren
Just a girl Geschrieben 8. Oktober 2010 Geschrieben 8. Oktober 2010 Hab mal ne frage zu cobol: da ich selbst alle möglichen programmiersprachen vom aufbau kenne nur bei cobol nicht wollte ich fragen ob cobol ähnlichkeiten mit xml hat. Wurde mir so gesagt. stimmt das auch? :] Zitieren
ronaldus Geschrieben 8. Oktober 2010 Geschrieben 8. Oktober 2010 Hi, Ich denke nicht. siehe: Extensible Markup Language ? Wikipedia und COBOL ? Wikipedia Vielleicht eine kleine Ähnlichkeit in der Datendefinition...Elemente können Unterelemente haben...aber die Größe muss in COBOL vorher statisch festgelegt werden anders als in XML, da ist die Größe flexibel. Gruß Ron Zitieren
Just a girl Geschrieben 8. Oktober 2010 Geschrieben 8. Oktober 2010 Ich denke nicht. Also ich war auch der Meinung. Trotzdem danke Zitieren
Empfohlene Beiträge
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.