Anmelden

View Full Version : Prozeduraufruf in Serviceprogramm durch externes Programm



dholtmann
01-03-16, 10:50
Guten Tag zusammen,

ich versuche aus einem Programm "PAR801" eine Prozedur eines Serviceprogramms
"PAR999" anzusprechen, bekomme jedoch beim Wandeln von "PAR801" folgende
Fehlernachricht:
" Objekt QZDMMDTA der Art *SRVPGM in Bibliothek QSOC nicht gefunden. Definition für Symbol 'pr_art800' nicht gefunden."

PAR999 ist als Modul und dann als Serviceprogramm gewandelt.
Ich habe ein Binderverzeichnis "PAR999_BND" erstellt mit Modul "PAR999".

BNDDIR Eintrag in PAR801:


H Bnddir('PAR999_BND')


Prototyp im PAR801:


D test PR * extproc('pr_art800')
D Firma 10I 0 value
D Artnr 10I 0 value
Dgetlabz S *


Der Aufruf in PAR801:


firm = 1;
arte = 278442;
getlabz = test(firm:arte);
labz = %str(%addr(getlabz));


Prozedurdefinition in PAR999:


dcl-proc pr_art800 export ;
D pr_art800 PI *
D FIRMA 10I 0
D ARTNR 10I 0
d LABZ S * inz



weiß jmd Rat, weshalb die Prozedur nicht gefunden wird?

Fuerchau
01-03-16, 10:55
Schau dir per DSPSRVPGM die Exporte an und achte auf die Groß/Kleinschreibung.

dholtmann
01-03-16, 11:00
Hallo nochmal,

habe den Fehler lokalisiert:
" D test PR * extproc('pr_art800')"
muss einfach groß geschrieben werden:
" D test PR * extproc('PR_ART800')"

Leider funktioniert meine Parameterübergabe nicht

dholtmann
01-03-16, 11:01
Dankeschön Fuerchau,
hab den Groß-/Kleinschreibungsfehler entdeckt

Fuerchau
01-03-16, 11:50
Mit der Parameterübergabe kann dir keiner helfen. Hier benötigst du eine Schnittstellenbeschreibung.
Anzahl und Typ der Parameter lässt sich leider nicht abfragen. Pauschal kann man nur sagen, es sind bis 400 Parameter erlaubt. D.h., man kann durchaus mehr Parameter übergeben als nötig, die werden halt ignoriert, aber selten weniger.

B.Hauser
01-03-16, 11:55
Ist Dir aufgefallen, dass die Prozedur-Definitionen unterschiedlich sind?
In der einen Defintion werden die Parameter-Felder by VALUE übergeben und in der anderen Defintion By Reference.
Defintionen sollten schon identisch sein .

Birgitta

Fuerchau
01-03-16, 13:08
Stimmt, habe ich übersehen.
Auch bzgl. des Returnwertes solltest du ggf. keinen Pointer (%ADDR) zurückgeben sondern direkt ein Zeichenfeld, ggf. auch mit VARYING.
Auch weiß ich nicht, was dir "%str(%addr(getlabz))" liefern soll.
"getlabz" muss ein Pointer sein da deine Prozedur einen zurückgibt.
%addr liefert dir nun die Adresse des Pointers im Speicher.
%str versucht nun davon einen Nul-terminerten String zu laden.
Korrekt wäre da eher "%str(test(p1:p2))", wenn der Return deiner Funktion auch einen C-String liefert.

Besser und übersichtlicher sind allemal native RPGLE-Variablen. Pointer sind eher was für API's.

dholtmann
04-03-16, 15:31
Dankeschön!
Habs inzwischen wie vorgeschlagen gelöst.
Ich gebe direkt das Char Feld zurück.
Das funktioniert jetzt einwandfrei.

Eine letzte Frage habe ich noch.
In meinem Serviceprogramm habe ich jetzt eine Datei eingebunden,
im Aufrufprogramm jedoch nicht.
Muss ich das Aufrufprogramm noch einmal wandeln, wenn die Datei erweitert wird?

Fuerchau
04-03-16, 16:09
Nein, wieso?
Ein Levelcheck passiert nur beim Open und den macht ja das Service-Pgm.
Nun rate mal, wer neu umgewandelt werden muss...
Wenn du allerdings eine E_DS definierst und diese Struktur als Parameter austauschst, ist natürlich jeder der das verwendet betroffen.

dholtmann
07-03-16, 15:44
Ja super,
das hatte ich mir auch überlegt.
Lag wahrscheinlich nur daran, dass ich noch auf das alte Objekt zugegriffen habe?
Dankeschön!