Lions2011 Geschrieben 18. Oktober 2005 Geschrieben 18. Oktober 2005 Hallo zusammen, kann mir hier jemand sagen, wie man in COBOL auf dem Großrechner (HOST) zwei Programme (Beisp: ND998 und ND999) miteinander verbinden kann? Ich möchte von ND998 auf ND999 zugreifen können. Und was genau passiert dann? Kann ich dann auf alle Variablen von ND999 zugreifen oder nur auf bestimmte? Gruß Martin Zitieren
Schiller256 Geschrieben 18. Oktober 2005 Geschrieben 18. Oktober 2005 Hallo ich weis zwar nicht so ganz was du mit verbinden meist aber du kannst in einem Programm mit dem CALL Befehl ein anders Programm rufen. Dem gerufenen Programm kannst du dann Parameter mitgeben einmal by Content oder by Reference. Also wenn du auf die Varibalen von deinem Unterprogramm zugreifen willst dann geht das indem du die gleiche Datengruppe in deinem Hauptprogramm anlegst. Diese Datengruppe dann by Reference dem Unterprogramm übergibst dann sind die Variablen sowohl in dem Hauptprogramm als auch im Unterprogramm bekannt. Wenn du die Variablen im Unterprogramm veränderst kannst du anschließend im Hauptprogramm auf die geänderten Daten zugreifen. Zitieren
Lions2011 Geschrieben 18. Oktober 2005 Autor Geschrieben 18. Oktober 2005 Hallo ich weis zwar nicht so ganz was du mit verbinden meist aber du kannst in einem Programm mit dem CALL Befehl ein anders Programm rufen. Dem gerufenen Programm kannst du dann Parameter mitgeben einmal by Content oder by Reference. Also wenn du auf die Varibalen von deinem Unterprogramm zugreifen willst dann geht das indem du die gleiche Datengruppe in deinem Hauptprogramm anlegst. Diese Datengruppe dann by Reference dem Unterprogramm übergibst dann sind die Variablen sowohl in dem Hauptprogramm als auch im Unterprogramm bekannt. Wenn du die Variablen im Unterprogramm veränderst kannst du anschließend im Hauptprogramm auf die geänderten Daten zugreifen. Wir arbeiten hier bei uns im Unternehmen mit Copystrecken. Jedoch benötige ich keine Copystrecke sondern möchte direkt von dem Programm das ich schreibe auf ein anderes Programm zugreifen, da ich von dort Daten benötige, um diese für eine Statistik zu prüfen. Kannst du mal ein Beispiel mit dazu schreiben, da ich mich nicht so gut auskenne in COBOL. Zitieren
Schiller256 Geschrieben 18. Oktober 2005 Geschrieben 18. Oktober 2005 Also entweder läst du dir die Copystrecken anlegen ist die sauberste Methode wenn sich da mal was ändern dann brauchst du nur diese anzupassen und musst nicht das ganze Programm ändern. Ansonsten: *Eine Datengruppe 01 UEBERGABEDATENGRUPPE. 05 PARAM-01 PIC X(10) VALUE SPACES. 05 PARAM-02 PIC 9(3)V99. ... PROCEDURE DIVISION. * PROGRAMM SECTION. *Dem Programm ND999 die Variablen übergeben damit sie geändert werden können. *Das ist jetzt ein Statischen CALL CALL 'ND999' USING BY REFERENCE UEBERGABEDATENGRUPPE *jetzt kannst du auf die geänderten Variablen zugreifen MOVE PARAM-01 TO AUSGABE-PARAM-01 ... Zitieren
Lions2011 Geschrieben 18. Oktober 2005 Autor Geschrieben 18. Oktober 2005 Also entweder läst du dir die Copystrecken anlegen ist die sauberste Methode wenn sich da mal was ändern dann brauchst du nur diese anzupassen und musst nicht das ganze Programm ändern. Ansonsten: *Eine Datengruppe 01 UEBERGABEDATENGRUPPE. 05 PARAM-01 PIC X(10) VALUE SPACES. 05 PARAM-02 PIC 9(3)V99. ... PROCEDURE DIVISION. * PROGRAMM SECTION. *Dem Programm ND999 die Variablen übergeben damit sie geändert werden können. *Das ist jetzt ein Statischen CALL CALL 'ND999' USING BY REFERENCE UEBERGABEDATENGRUPPE *jetzt kannst du auf die geänderten Variablen zugreifen MOVE PARAM-01 TO AUSGABE-PARAM-01 ... Kann man auch nur den Call angeben ohne eine Reference? Ich will in meinem Programm nichts an den Variablen ändern. Ich muss sie nur auslesen, um zu sehen, was für ein Wert in der Variable steht, da es davon abhängt, in welche Kategorie diese in der Statistik eingetragen werden muss Beispiel: TYPE = H bedeutet Hotelanfrage dann soll diese in der Statistik in den Bereich Hotelanfragen addiert werden. Zitieren
Schiller256 Geschrieben 18. Oktober 2005 Geschrieben 18. Oktober 2005 Kann man auch nur den Call angeben ohne eine Reference? Nein wie willst denn du dann auf die Variablen zugreifen können die müssen schon in dem Hauptprogramm bekannt sein. Ich kenne keine andere möglichkeit aus einem Unterprogramm Variablen zu bekommen als die übergabe der selbigen by Reference. Denn by Reference bedeutet ja nichts anders als das die Variablen im Haupt-/Unterprogramm auf den gleichen Speicherbereich zeigen. Zitieren
Lions2011 Geschrieben 18. Oktober 2005 Autor Geschrieben 18. Oktober 2005 Nein wie willst denn du dann auf die Variablen zugreifen können die müssen schon in dem Hauptprogramm bekannt sein. Ich kenne keine andere möglichkeit aus einem Unterprogramm Variablen zu bekommen als die übergabe der selbigen by Reference. Denn by Reference bedeutet ja nichts anders als das die Variablen im Haupt-/Unterprogramm auf den gleichen Speicherbereich zeigen. Das heißt, im Hauptprogramm (ND998) einen Call auf das andere Programm (ND999) machen? Müssen die Variablennamen in beiden Programmen gleich lauten? Oder können sie sich vom namen her unterscheiden? Zitieren
Schiller256 Geschrieben 18. Oktober 2005 Geschrieben 18. Oktober 2005 Ja genau du machst in Programm ND998 eÃnen CALL auf ND999 übergibst die Parameter. Ich meine wie die Variablen lauten ist egal wichtig ist die richtige Reihenfolge der übergebenen Variablen im Unterprogramm eingehalten wird. Bei der länge der Variablen bin ich mir nicht ganz sicher aber die sollte glaube ich auch gleich sein. Bei mir ist das immer der Fall weil ich weder Copystrecken habe oder die Sachen immer gleich lang mache. Zitieren
Lions2011 Geschrieben 18. Oktober 2005 Autor Geschrieben 18. Oktober 2005 Ja genau du machst in Programm ND998 eÃnen CALL auf ND999 übergibst die Parameter. Ich meine wie die Variablen lauten ist egal wichtig ist die richtige Reihenfolge der übergebenen Variablen im Unterprogramm eingehalten wird. Bei der länge der Variablen bin ich mir nicht ganz sicher aber die sollte glaube ich auch gleich sein. Bei mir ist das immer der Fall weil ich weder Copystrecken habe oder die Sachen immer gleich lang mache. Aber wie sieht es aus: Das ND999 wird auch von anderen Programmen genutzt. Dadurch gibt es dort sehr viele Variablen. Ich benötige jetzt aber nur ein paar davon. Wie kann ich das dem Programm "klar machen", welche es nutzen muss? Das ND999 ist kein direktes Unterprogramm von meinem. Es ist bereits heute in Nutzung. Mein Programm (Statistik) soll nun auch auf das Programm zugreifen, da dort die entscheidenden Teile stehen, um die Statistik zu erstellen. Zitieren
Schiller256 Geschrieben 18. Oktober 2005 Geschrieben 18. Oktober 2005 Das ND999 wird auch von anderen Programmen genutzt. Dadurch gibt es dort sehr viele Variablen. Ich benötige jetzt aber nur ein paar davon. Wie kann ich das dem Programm "klar machen", welche es nutzen muss? In dem Unterprogramm ist doch hinter der PROCEDURE DIVISION ein USING da werden Datengruppen bzw Variaben angegeben. Wenn da eben 100 Varibalen stehen musst du halt 100 Variablen in deinem Hauptprogramm angeben. Da kannst du nichts ändern. Welchem Programm willst du was klar machen? Zitieren
Lions2011 Geschrieben 18. Oktober 2005 Autor Geschrieben 18. Oktober 2005 In dem Unterprogramm ist doch hinter der PROCEDURE DIVISION ein USING da werden Datengruppen bzw Variaben angegeben. Wenn da eben 100 Varibalen stehen musst du halt 100 Variablen in deinem Hauptprogramm angeben. Da kannst du nichts ändern. Welchem Programm willst du was klar machen? Im Folgenden der Code aus dem Unterprogramm. Was muss ich dort ergänzen, damit das Hauptprogramm die Daten lesen kann? PROCEDURE DIVISION USING IO-PCB ERR-PCB *--------------------------------------- * Eingabe-Schnittstelle *--------------------------------------- CONT01E *--------------------------------------- * Ein-Ausgabe-Schnittstelle *--------------------------------------- NDYIKTCS. Zitieren
Schiller256 Geschrieben 18. Oktober 2005 Geschrieben 18. Oktober 2005 Im Unterprogramm musst du nichts ändern. Wenn in den Datengruppen schon die richtigen Variablen enthalten sind. Du musst nur im Hauptprogramm folgendes Angeben. CALL 'ND999' USING IO-PCB ERR-PCB CONT01E NDYIKTCS Dann kannst du diese Datengruppen/Variablen im Hauptprogramm verwenden. Diese müssen natürlich in der WORKING-STORAGE SECTION des Hauptprogrammes stehen. Zitieren
Lions2011 Geschrieben 18. Oktober 2005 Autor Geschrieben 18. Oktober 2005 Im Unterprogramm musst du nichts ändern. Wenn in den Datengruppen schon die richtigen Variablen enthalten sind. Du musst nur im Hauptprogramm folgendes Angeben. CALL 'ND999' USING IO-PCB ERR-PCB CONT01E NDYIKTCS Dann kannst du diese Datengruppen/Variablen im Hauptprogramm verwenden. Diese müssen natürlich in der WORKING-STORAGE SECTION des Hauptprogrammes stehen. PROCEDURE DIVISION. ------------------------------------------------------- A0000000-STEUER SECTION. - EINMALIGE PROGRAMM-INITIALISIERUNG - ANWENDUNGSSPEZIFISCHE VERARBEITUNG - PROGRAMM BEENDEN MIT GOBACK ------------------------------------------------------- A0000000-SECTION-START. PERFORM A0010000-INIT-PROGRAMM CALL 'NDYIKT' USING IO-PCB ERR-PCB CONT01E NDYIKTCS PERFORM V0000000-VERARBEITUNG PERFORM A0090000-GOBACK CONTINUE. A0000000-SECTION-ENDE. EXIT. habe jetzt den Call eingebaut in das Hauptprogramm. Was muss denn jetzt noch gemacht werden? Im Unterprogramm sollten die Variablen jetzt eigentlich korrekt sein. Zitieren
Maulwurf_der_Schlaue Geschrieben 18. Oktober 2005 Geschrieben 18. Oktober 2005 Hi Cobol-Kumpanen ich hab auch ein Codebeispiel wie man auf ein "Unterprogramm" zugreift. Wenn du noch hilfe brauchen solltest sag bescheid dann load ich's mal up. Zitieren
Lions2011 Geschrieben 18. Oktober 2005 Autor Geschrieben 18. Oktober 2005 Hi Cobol-Kumpanen ich hab auch ein Codebeispiel wie man auf ein "Unterprogramm" zugreift. Wenn du noch hilfe brauchen solltest sag bescheid dann load ich's mal up. Ja kannst du gerne mal mitteilen! Bin für alle Möglichkeiten offen. Zitieren
Maulwurf_der_Schlaue Geschrieben 18. Oktober 2005 Geschrieben 18. Oktober 2005 Hallo nochmal, also im Anhang ^^ sind die beiden Files...Hauptprogramm.txtUnterprogramm.txt Zitieren
Lions2011 Geschrieben 18. Oktober 2005 Autor Geschrieben 18. Oktober 2005 Kann man denn auch nur eine der variablen übergeben? Oder muss man immer alle angeben, die im Unterprogramm unter Using stehen? COPY NDYIKTCS REPLACING =="Y-"== BY ==NDYIKT==. PROCEDURE DIVISION USING IO-PCB ERR-PCB *------------------------- * Eingabe-Schnittstelle *------------------------- CONT01E *------------------------- * Ein-Ausgabe-Schnittstell *------------------------- NDYIKTCS. Woher weiß ich, was ich im Hauptprogramm für eine PIC-Klausel angeben muss? NDYIKTCS ist eine Copystrecke, die im Unterprogramm aufgerufen wird. Zitieren
Maulwurf_der_Schlaue Geschrieben 18. Oktober 2005 Geschrieben 18. Oktober 2005 Also bezogen auf mein Programm würde das schon gehen. Dann könnte ich aber nicht mehr auf die Usereingabe eingehen. Ich könnte nur mir ERG arbeiten... im unterprogramm wird dann halt hardcoded mit 100 und 50 für X1 un X2 gearbeitet... Es hängt immer davon ab was du mit dem unterprogramm machst, daran kannst du dann festmachen wie viele "Übergabeparameter" du brauchst. es würde auch so gehen MyParameter. X1 Pic ... X2 Pic ... ERG Pic ... und weiter unten dann beim Call Call ... using MyParameter. Dann übergeb ich halt eine Struktur... << edit >> Eine Copystrecke ist auch irgendwo gespeichert. Am besten einen Kollegen fragen wo ihr eure Copys speichert. << /edit >> Zitieren
Lions2011 Geschrieben 18. Oktober 2005 Autor Geschrieben 18. Oktober 2005 Es hängt immer davon ab was du mit dem unterprogramm machst, daran kannst du dann festmachen wie viele "Übergabeparameter" du brauchst. Und bei meinem Beispiel? Oben drüber (über der Proc-Div.) ist die Copystrecke NDYIKTCS. Bei den "Using"-Einträgen will ich eigentlich auch nur auf diese eingehen, denn die anderen brauche ich nicht zwingend für mein Programm. In der NDYIKTCS stehen die Variablen, die ich benötige. Zitieren
Maulwurf_der_Schlaue Geschrieben 18. Oktober 2005 Geschrieben 18. Oktober 2005 Also da ich nicht bei dir im Betrieb arbeite kann ich dir schlecht sagen was sich der Programmierer bei dem Unterprogramm überlegt hat.. folgendes IO-PCB << weiß ich nicht ERR-PCB << vermutlich enthält die Variable einen Fehlercode wenn was nicht wie geplant abgelaufen ist, damit das Hauptprogramm entsprechend reagieren kann. CONT01E << kann ich dir schlecht sagen NDYIKTCS << vermutlich ein Feld welches das ergbnis zur ausgabe beinhaltet... <edit> soweit ich weiß musst du immer alle parameter übergeben die auch im unterprogramm eingetragen sind. du kannst ja einfach (wenn du den typ der felder weißt) mit 0 oder " " Leerzeichen initialisieren. </edit> Zitieren
Lions2011 Geschrieben 18. Oktober 2005 Autor Geschrieben 18. Oktober 2005 Wird durch den Call eigentlich das ganze Unterprogramm durchlaufen oder was genau passiert dann? Wenn ich im Hauptprogramm die Variablen hinter dem Using alle lasse, wie muss ich diese dann noch im Programm in der WOrking-Storage aufrufen und wie erkenne ich, welche PIC-Klausel ich nutzen muss? Anbei die beiden Programme ND999 (mein Programm) NDYIKT ("Unterprogramm, das aufgerufen werden soll) Kannst du mir anhand dieser Dateien sagen, was ich machen muss?nd999.txtndyikt.txt Zitieren
Schiller256 Geschrieben 18. Oktober 2005 Geschrieben 18. Oktober 2005 Also ich habe mir jetzt nicht alles angeschaut. Aber wenn du aus dem Unterprogramm das was in der LINKAGE SECTION steht in das Hauptprogramm, in die WORKING-STORAGE SECTION noch zusätzlich einfügst sollte es nicht schon vorhanden sein dann hast du mal alle Variablen die du brauchst. Jetzt vielleicht nocht die Variablen initalisieren bzw mit bestimten Werten für das UPRO füllen. Dann nur doch das Programm aufrufen: CALL 'NDYIKT' USING IO-PCB ERR-PCB CONT01E NDYIKTCS Dann sollte es gehen! Zitieren
Maulwurf_der_Schlaue Geschrieben 18. Oktober 2005 Geschrieben 18. Oktober 2005 Würde ich auch so sehen... wenn ich mich nicht täusche müsstest du COPY IOERRPCB. COPY NDYICOC1 REPLACING =="Y-"== BY ==CONT01E==. COPY NDYIKTCS REPLACING =="Y-"== BY ==NDYIKT==. in der WORKING-STORAGE SECTION. des nd999 einfügen. Damit hättest du schon mal die Variablen alle Deklariert... Wie mein Vorposter sag ich probiers mal aus... Zitieren
Lions2011 Geschrieben 18. Oktober 2005 Autor Geschrieben 18. Oktober 2005 Danke für eure Hilfe, teile euch dann mal mit, ob das funktioniert! 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.