-
 Zitat von nico1964
So am Freitag habe ich es endlich geschafft. Mit den C-Procedures funtkioniert das tadellos, wenn man weiß wie man damit umgehen muss. Richtig Übergabe der Parameter und schon funktiert der ganze Haufen.
Jetzt habe ich nur mehr ein kleineres Problem, wo ich mangels C-Kenntnissen scheitere.
Ich muss an die C-Funktion folgendes überbgeben:
01 BONITAET.
05 QUELLSYSTEM PIC X(03).
05 FILLER PIC X VALUE X'00'.
05 ANTRAGSNUMMER PIC X(10).
05 FILLER PIC X VALUE X'00'.
05 ANTRAGSTYP PIC X(07).
05 FILLER PIC X VALUE X'00'.
05 GVK-NUMMER PIC X(08).
05 FILLER PIC X VALUE X'00'.
05 KUND-TAB.
10 KUNDENNR PIC X(10).
10 FILLER PIC X VALUE X'00'.
10 KUNDESEIT PIC X(10).
10 FILLER PIC X VALUE X'00'.
10 KUNDENTYP PIC X.
10 FILLER PIC X VALUE X'00'.
..
..
..
10 UWRBONITAET-TAB.
15 UWRPD PIC 9V9(8) COMP-4.
15 FILLER PIC X VALUE X'00'.
15 UWRSCORE PIC 9(10) COMP-4.
15 FILLER PIC X VALUE X'00'.
15 UWRRATING PIC X(02).
15 FILLER PIC X VALUE X'00'.
15 UWRRATTYP PIC X(02).
15 FILLER PIC X VALUE X'00'.
15 UWRRATMOD PIC X(04).
15 FILLER PIC X VALUE X'00'.
15 UWRRATMODV PIC X(05).
15 FILLER PIC X VALUE X'00'.
15 UWRRATDAT PIC X(10).
15 FILLER PIC X VALUE X'00'.
Meine Frage ist, wie bastle ich den Aufruf.
Andreas
Ein AS/400 Dinosaurier since 1989
-
Dazu müsstest du auch mal die C-Funktion posten.
-
Du mußt vermutlich jeden Parameter einzeln übergeben und deshalb den jeweiligen Wert und sein abschließendes NULL-Zeichen zusammenfassen. Probier's mal so:
...
04 QUELLSYSTEM-NULL.
05 QUELLSYSTEM PIC X(03).
05 FILLER PIC X VALUE X'00'.
04 ANTRAGSNUMMER-NULL.
05 ANTRAGSNUMMER PIC X(10).
05 FILLER PIC X VALUE X'00'.
04 ANTRAGSTYP-NULL.
05 ANTRAGSTYP PIC X(07).
05 FILLER PIC X VALUE X'00'.
...
CALL ...
USING
QUELLSYSTEM-NULL
ANTRAGSNUMMER-NULL
ANTRAGSTYP-NULL
...
-
Das ist ja mein Problem, die C-procedure erwartet einen Paramert mit PIC X Value '00' getrennt. Das funktioniert auch bis zur
05 KUND-TAB.
Wie gebe ich die an????? In der C-procedure wird ein ARRAY erwartet, welches wieder durch PIC X Value '00' getrennt ist.
Andreas
Ein AS/400 Dinosaurier since 1989
-
Zeig uns mal die Parameterdefinition dieser C-Prozedur.
-
 Zitat von Pikachu
Zeig uns mal die Parameterdefinition dieser C-Prozedur.
Das hört sich einfacher an, als es der Fall ist. Ich habe ein elendlanges .wsdl, aus dem dann die einzelnen C-procedures genieriert wurden. Aufgerufen, wird dann die Hauptfunktion, der ich alle Parameter übergeben soll.
Und dann soll ich einen maximal 5 Parameter zurückbekommen.
Andreas
Ein AS/400 Dinosaurier since 1989
-
 Zitat von Pikachu
Zeig uns mal die Parameterdefinition dieser C-Prozedur.
Aber ich versuche das mal
Der erste Aufruf:
typedef struct BonitaetRequestTypeTag {
quellsystemType quellsystem;
xsdc__string quellsystemAntragsnummer;
antragstypType antragstyp;
xsdc__string gvKNummer;
kundeRqType_Array* kundeRq;
} BonitaetRequestType;
Aufruf darin kundeRqType
typedef struct kundeRqTypeTag {
xsdc__string kundennummer;
xsdc__long* kundeSeit;
kundentypType kundentyp;
xsdc__string strasse;
xsdc__string plz;
xsdc__string hausnummer;
xsdc__string land;
xsdc__string ort;
kreditfaehigkeitType kreditfaehigkeit;
xsdc__date* kreditfaehigkeitDatum;
mahnstufeType mahnstufeAktuell;
mahnstufeType mahnstufeHoechste;
xsdc__date* mahnstufeHoechsteDatum;
bonitaetType* uwrBonitaet;
bonitaetType* saBonitaet;
bonitaetType* gwbBonitaet;
bonitaetType* externalBonitaet;
xsdc__string gvKRatingverbundKundennummer;
xsdc__double* gvKRatingverbundGewicht;
kompetenzUWRType kompetenzUWR;
personRqType* person;
firmaRqType* firma;
vertragRqType_Array* vertragRq;
} kundeRqType;
und darin dann wieder einzelne Aufrufe.
Wie gesagt, diesen Aufruf schaffe ich noch-->
Call Procedure Bonitaet
quellsystemType quellsystem;
xsdc__string quellsystemAntragsnummer;
antragstypType antragstyp;
xsdc__string gvKNummer;
Aber wenn ich die nächsten Parameter mitschicken will, habe ich ein Problem.
Und das ganze noch aus COBOL und nicht RPG
Andreas
Ein AS/400 Dinosaurier since 1989
-
Das ist zugegeben ein Problem, da insbesonders Strings in Strukturen nicht unbedingt in fester Länge sondern als Pointer verwendet werden.
Hierzu benötigst du die Definition des Types "xsdc__string".
Ist das ein Pointer?
Ist das ein char[nn] mit fester Länge?
"xsdc__long*" ist wohl ein Pointer auf eine Longinteger-Variable.
In COBOL ist das dann auch ein Zeiger, der auf die Adresse eines Pic S9(9) comp-4 verweisen muss.
Genauso siehts auch mit allen anderen Feldinhalten aus, die wiederum auf Strukturen und oder Pointer verweisen.
Wenn du die Typen nicht kennst, ist es ein Problem die Struktur genau passend aufzubauen.
Bei Pointern ist noch das Problem, dass diese in AS/400 16-Byte haben.
Ist die C-Lib allerdings mit Tera-Space aktiviert (umgewandlet) sind die Pointer nur 8-Byte (64-Bit) und du benötigst Tera-Space-API's zum allocieren/deallocieren von Speicher.
-
 Zitat von Fuerchau
Das ist zugegeben ein Problem, da insbesonders Strings in Strukturen nicht unbedingt in fester Länge sondern als Pointer verwendet werden.
Genauso siehts auch mit allen anderen Feldinhalten aus, die wiederum auf Strukturen und oder Pointer verweisen.
Wenn du die Typen nicht kennst, ist es ein Problem die Struktur genau passend aufzubauen.
Gibt es irgendwo eine MappingTabelle für C-Variablen ---> COBOL?
Andreas
Ein AS/400 Dinosaurier since 1989
-
Ein direktes Mapping gibt es so nicht, es ist allerdings relativ einfach:
short -> Pic s9(4) comp-4
long -> Pic s9(9) comp-4
int ist meist identisch mit long.
Float -> Pic s9(n)v9(m) comp-1
Double -> Pic s9(n)v9(m) comp-2
Decimal -> Pic s9(n)v9(m) comp-3
CHAR[n] -> pic x(n)
WCHAR[n] -> pic n(n)
*int -> usage pointer
*char usw.
Pointer müssen dann auf einen Bereich des entsprechenden Types verweisen.
Bei CHAR-Variablen (Strings) ist es halt häufig so, dass diese Nul-Terminiert sind, also am Ende ein x"00" enthalten.
Hier hat man ggf. bei Cobol ein Problem, da Strings in der Länge häufig nicht klar definiert sind. Man muss also die max. mögliche Länge vorsehen und beim Inhalt per Inspect die Zeichen vor dem x"00" zählen und kann dann per Referenzänderung, "Varname(1:Len)" auf die Variable zugreifen.
Bei der Übergabe setzt man den Inhalt dann per String-Funktion zusammen.
string
MyVar delimited by space
x"00" delimited by size
into MyCVar.
Wenn allerdings Leerzeichen vorkommen können und dürfen muss die Länge per Inspect ggf. rückwärts ermittelt werden und der String dann so aussehen:
string
MyVar(1:Len) delimited by size
x"00" delimited by size
into MyCVar.
Bei C-Strukturen ist also genau der Ursprungstyp (int, char, ...) zu kennen um das in Cobol nachzuvollziehen.
Das Problem hierbei ist, dass in C der Typ umdeklariert werden kann wie dein obiges Beispiel ja zeigt.
Man benötigt also tatsächlich die Ursprungsdeklaration was besonders dann schwierig wird, wenn diese auch noch kaskadiert sind.
Zusätzlich hat C noch die Eigenheit ggf. die einzelnen Felder einer Struktur auszurichten, also z.B. an geraden Adressen, teilbar durch 2, 4 oder 16.
der C-Programmierer braucht sich darum nicht zu kümmern, das macht ja der Compiler. Ähnliches gibt es auch für Cobol, wird aber selten verwendet.
Ausnahme sind Pointer, die sind immer an der nächste durch 16 teilbaren Adresse ausgerichtet.
-
 Zitat von Fuerchau
Man benötigt also tatsächlich die Ursprungsdeklaration was besonders dann schwierig wird, wenn diese auch noch kaskadiert sind.
Ich habe die WSDL, die XSD und dann die einzelnen C-Procedure Definitionen. Das Problem liegt derzeit bei folgender Definition:
typedef struct kundeRqType_ArrayTag {
struct kundeRqTypeTag ** m_Array;
int m_Size;
AXISC_XSDTYPE m_Type;
} kundeRqType_Array;
Die dazugehörige kundeRqType_ArrayTag
typedef struct kundeRqTypeTag {
xsdc__string kundennummer;
xsdc__long* kundeSeit;
kundentypType kundentyp;
xsdc__string strasse;
xsdc__string plz;
xsdc__string hausnummer;
xsdc__string land;
xsdc__string ort;
kreditfaehigkeitType kreditfaehigkeit;
xsdc__date* kreditfaehigkeitDatum;
mahnstufeType mahnstufeAktuell;
mahnstufeType mahnstufeHoechste;
xsdc__date* mahnstufeHoechsteDatum;
bonitaetType* uwrBonitaet;
bonitaetType* saBonitaet;
bonitaetType* gwbBonitaet;
bonitaetType* externalBonitaet;
xsdc__string gvKRatingverbundKundennummer;
xsdc__double* gvKRatingverbundGewicht;
kompetenzUWRType kompetenzUWR;
personRqType* person;
firmaRqType* firma;
vertragRqType_Array* vertragRq;
} kundeRqType;
Im Cobol weiß ich nicht wie ich die kundeRqType_ArrayTag nachbauen soll, damit ich Sie dann in einem übergeben kann.
Vor allem verstehe ich nicht, wie ich sie dem Aufruf Bonität mitgeben soll.
Andreas
Ein AS/400 Dinosaurier since 1989
-
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.
Similar Threads
-
By Hellena Smejda in forum Archiv NEWSblibs
Antworten: 0
Letzter Beitrag: 22-04-11, 06:20
-
By Xanas in forum NEWSboard Programmierung
Antworten: 4
Letzter Beitrag: 12-01-07, 08:32
-
By schatte in forum NEWSboard Programmierung
Antworten: 19
Letzter Beitrag: 10-01-07, 12:32
-
By Xanas in forum NEWSboard Programmierung
Antworten: 1
Letzter Beitrag: 13-12-06, 14:38
-
By Uli Müller in forum NEWSboard Programmierung
Antworten: 2
Letzter Beitrag: 09-11-06, 10:21
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks