PDA

View Full Version : MCH3601 in Prozedur



Hubert
26-04-07, 08:07
Hallo zusammen,

ich poste die Anfrage hier noch einmal; beim ersten Mal habe ich das falsche Forum erwischt.

Beim Aufruf einer Prozedur (steht in einem Service Programm) erhalte ich die Fehlermeldungen

Pointer not set for location referenced.
Function check. MCH3601 unmonitored by QDBGETKY at statement *N,
instruction X'0CD1'.
The call to ADDORD2SHP ended in error (C G D F).

die Prozedur sieht so aus:



P AddOrd2ShpmOrd B export
d PI 2
d pcusno 6 0 value
d pShipment 7 0 value
d pOrdno 6 0 value

c Key klist
c kfld pcusno
c kfld pordno

c key setll ssshlc30
c if %found(ssshlc30)
c return '1'
c else

c eval CUSNO = pcusno
c eval SSSHPMID = pShipment
c eval ORDNO = pOrdno
c write SSHC30
c
c return '0'
c endif

p e

Im Debugger habe ich lokalisiert, dass der Fehler beim SETLL auftritt. Hat jemand eine Idee, was da falsch läuft?

Danke

Hubert

Fuerchau
26-04-07, 08:52
Wo wird denn die Datei definiert ?
Wann wird diese eröffnet ?

Eine Serviceprocedure muss alle benötigten Ressourcen beinhalten.
Eine globale Definition reicht nicht aus.

Hubert
26-04-07, 09:10
Die Datei wird im Serviceprogramm geöffnet. Ich habe auch versucht, ob der Fehler mit USROPN vermieden wird, hatte damit aber auch keinen Erfolg.
Das Service Programm enthält 13 (ob das ein böses Omen ist?;) ) Prozeduren. Ich habe diese Prozedur testweise in einem anderen Serviceprogramm isoliert. Die Fehlermeldung blieb dann aus, aber eine andere Prozedur meldete dann den gleichen Fehler.

Fuerchau
26-04-07, 10:34
Dann tippe ich auf die Parameterübergabe.
Das rufende Programm übergibt die Wert ggf. nicht per Value oder zuwenig Parameter.

Prüfe den Inhalt der Parameter im Debugger.

Hubert
26-04-07, 14:04
Anzahl und Art der parameter sind identisch, sie werden alle by value übergeben. Beim debuggen werden auch die erwarteten Werte in den Schlüsselfeldern angezeigt.

mk
26-04-07, 14:07
Hallo Hubert,

ich kann nicht genau sagen ob es daran liegt,
aber deine Prozedur gibt 2 Stellen zurück.
Gefüllt wird aber von Dir nur 1n
Vielleicht stört das ?????

Gruss
Michael

Fuerchau
26-04-07, 15:05
@MK
Der "return" funktioniert hier wie der "eval", linksbündig mit blanks füllen.

Fuerchau
26-04-07, 15:09
ggf. kommt der Compiler (bzw. die Runtime) an dieser Stelle nicht mit den Parametervariablen (value!) zurecht.
Übertrage diese doch mal in Hilfsfelder, da die Runtime grundsätzlich "Call by reference" benötigt.

"Call by value" mag aber vom Compiler anders aufgelöst sein, so dass die Runtime hier keinen Zugriff auf die Variablen hat.

Hubert
27-04-07, 08:45
Ich habe den Fehler gefunden:

In dem Programm wird eine Prozedur eines Service Programms aufgerufen. In dieser Prozedur wird eine Prozedur eines anderen Service Programms aufgerufen. Diese Prozedur hatte ich um einen Parameter (by Reference) erweitert und diese Erweiterung bei einem Prozeduraufruf nicht nachgezogen. Obwohl die Anzahl der Parameter (keine optionalen) abwich hat das Binden problemlos funktioniert. Nur die Ausführung ließ dann zu wünschen übrig. :D

@MK Der Parameter war ursprünglich einstellig. in einem anderen Thread hatte ich gelesen, dass es damit manchmal Probleme gibt (ebenfalls MCH3601) und deshalb hatte ich es geändert.

Danke für eure Unterstützung

Hubert

Fuerchau
27-04-07, 10:33
Das Binden klappt auch deshalb problemlos, da die Anzahl der Parameter leider immer variabel ist (max. 255).
Dies lässt sich per %-Funktion oder SDS abfragen.

Einzig der Compiler prüft die Anzahl der Parameter durch das Prototyping.
Nicht neu erstellte Programme betrifft das leider nicht.

Deshalb sollte man bei Parameteränderungen liber eine neue Prozedur erstellen und die alte ruft dann die neue mit der Konvertierung auf.
Neue Programme werden mit dem neuen Prototyp (gleicher Definitions-Name, aber andere externe Prozedur) gewandelt, der alte Prototyp entfällt.

Wandelt man nun alte Programme, meldet der Compiler einen Fehler.