Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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.

Geschrieben
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.

Geschrieben

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

...

Geschrieben
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.

Geschrieben
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.

Geschrieben
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?

Geschrieben

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.

Geschrieben
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.

Geschrieben
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?

Geschrieben
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.                               

Geschrieben

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.

Geschrieben
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.

Geschrieben
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.

Geschrieben

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.

Geschrieben

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 >>

Geschrieben
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.

Geschrieben

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>

Geschrieben

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.txt

ndyikt.txt

Geschrieben

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!

Geschrieben

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...

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...