View Full Version : Webservice über PHP aus einer COBOL Anwendung
Gibt es irgendwo eine MappingTabelle für C-Variablen ---> COBOL?
Passing Data to an ILE C Program or Procedure (http://publib.boulder.ibm.com/infocenter/iadthelp/v7r1/topic/com.ibm.etools.iseries.pgmgd.doc/c0925405262.htm)
Jetzt wird es allerdings so kompliziert, dass es den Rahmen dieses Forums sprengt.
Eine Variable vom Typ "**" ist ein Pointer, der auf ein Pointer-Array verweist.
In Cobol sähe das in etwa so aus:
01 StructArray.
05 kundeRqTypeTag usage pointer.
05 m_Size pic s9(9) comp-4.
05 AXISC_XSDTYPE.
10 ?????
01 kundeRqTypeArr.
05 kundeRqTypePtr usage pointer dim(10).
01 kundeRqTypeStruct.
05 kundeRqType.
10 KundenNr pic x(nn).
:
Jetzt sind nur noch die Pointer korrekt zu initialisieren. m_Size gibt wohl die Anzahl der Verweise an.
Was aber immer noch fehlt, sind halt die Typdefinitionen der restlichen Felder.
Hier ist wohl Fleißarbeit angesagt.
Jetzt wird es allerdings so kompliziert, dass es den Rahmen dieses Forums sprengt.
Was aber immer noch fehlt, sind halt die Typdefinitionen der restlichen Felder.
Hier ist wohl Fleißarbeit angesagt.
Danke einmal für Deine Hilfe, die Fleißarbeit ist eigentlich ganz einfach, 40 C-Procedure-Definitionsdateien durchackern und die richtigen Typen finden.
Jetzt sind nur noch die Pointer korrekt zu initialisieren.
Das müßte mit SET ... TO ADDRESS OF ... (http://publib.boulder.ibm.com/iseries/v5r2/ic2924/books/c092540317.htm#HDRADJPNTR) gehen, siehe auch hier: Pointer Data Item (http://publib.boulder.ibm.com/infocenter/iadthelp/v7r0/topic/com.ibm.etools.iseries.langref.doc/c0925395519.htm)
Nicht zu vergessen, die Typen neu definieren und die ganzen Verpointerungen zu setzen.
Die Frage ist ja auch, was du dann zurückbekommst.
In diesem Fall musst du die Strukturen in der Linkage Section definieren und deren Adressen dann mit den Pointern der Rückgabe verbinden.
Ganz schön mühsam, nur um das Ganze in Cobol zu machen, was dann anschließend keiner mehr versteht.
Bei der Rückgabe von Strukturen und Pointern ist zu beachten, dass du gewaltige Memory Leaks bekommen kannst.
In C werden Bereiche mit malloc() ganz einfach angelegt und mit free() wieder freigegeben.
In C++ sieht das leider anders aus, da es hier Konstruktoren und Destruktoren gibt, die du aus Cobol nicht aufräumen kannst.
Wenn deine Routine also häufig im selben Job läuft, kann irgendwann dein Speicher platzen.
Lass dir doch lieber ein paar C-Routinen entwickeln, die dir dieses Mapping abnehmen.
Nicht zu vergessen, die Typen neu definieren und die ganzen Verpointerungen zu setzen.
Die Frage ist ja auch, was du dann zurückbekommst.
In diesem Fall musst du die Strukturen in der Linkage Section definieren und deren Adressen dann mit den Pointern der Rückgabe verbinden.
Ganz schön mühsam, nur um das Ganze in Cobol zu machen, was dann anschließend keiner mehr versteht.
Bei der Rückgabe von Strukturen und Pointern ist zu beachten, dass du gewaltige Memory Leaks bekommen kannst.
In C werden Bereiche mit malloc() ganz einfach angelegt und mit free() wieder freigegeben.
In C++ sieht das leider anders aus, da es hier Konstruktoren und Destruktoren gibt, die du aus Cobol nicht aufräumen kannst.
Wenn deine Routine also häufig im selben Job läuft, kann irgendwann dein Speicher platzen.
Lass dir doch lieber ein paar C-Routinen entwickeln, die dir dieses Mapping abnehmen.
Danke für Deine Hinweise, vor allem mit dem Speicher. Das mit den C-Routinen wäre ja nicht uninteressant, aber ich muss diesen Webservice aus einer online Anwendung aufrufen, die in COBOL gepinselt worden ist(1995 und später).
Aber vielen Dank für Deine Unterstüzung, die uns schon sehr viel weitergeholfen hat. Heute habe ich Pause, bin erst morgen wieder im Büro und werde dann weiter die ganzen Mappings pinseln.
Gruß aus dem sonnigen Wien
Du sollst dir ja nicht alles in C schreiben lassen sondern man definiert eine feste Schnittstelle zwischen COBOL und C, die mit festen Strukturen (Unicode, N(xx) und gepackte/gezonte Felder) umgeht.
Diese C-Routine wird dann von Cobol aufgerufen, macht dann alles und übergibt das gewünschte Ergebnis wieder zurück.
Du sollst dir ja nicht alles in C schreiben lassen sondern man definiert eine feste Schnittstelle zwischen COBOL und C, die mit festen Strukturen (Unicode, N(xx) und gepackte/gezonte Felder) umgeht.
Diese C-Routine wird dann von Cobol aufgerufen, macht dann alles und übergibt das gewünschte Ergebnis wieder zurück.
Nochmals danke für deine fundierten Tipps und die Anregung werd ich mal morgen bei uns im Büro einwerfen, vielleicht find ich ja einen C-Programmierer, der mir das schnitzt.
Danke vielmals.
Nochmals danke für deine fundierten Tipps und die Anregung werd ich mal morgen bei uns im Büro einwerfen, vielleicht find ich ja einen C-Programmierer, der mir das schnitzt.
Danke vielmals.
So Spät aber doch, mein Zugang zu dem Thema. Keinen C-Programmierer bei uns gefunden, welcher die Zeit hätte das zu schnitzen. Nochmals Dr. Google bemüht und siehe da es gibt eine COBOL-Version für das HTTP-API von Scott Klement. Dieses für meine Bedürnisse adaptiert und schon funktioniert der ganze Krempel reibungslos. Vielen Dank für eure Unterstützung und die Zeit die ihr für meine Fragen aufgewendet habt. Mein Horizont hat sich durch dieses Projekt eindeutig erweitert.
Schau mal, ob Dir vielleicht XMLSERVICE weiterhilft:
XMLSERVICE (http://www.youngiprofessionals.com/wiki/XMLSERVICE)
Birgitta