PDA

View Full Version : MCH3601



Seiten : 1 [2]

BenderD
04-01-07, 11:53
edit
mal so einen kleinen Test gemacht, sieht nicht so Hoffnungslos aus, pro Parameter, der auch rein gehen kann, wird eine short ergänzt (Null Bite vermutlich), beim Aufruf passiert noch was seltsames mit Parameterlängen, könnte aber heilbar sein.

Was dennoch dagegen spräche: das ist undokumentiert!!!
end of edit

naja, das könnte auch schief gehen

- die SQL Runtime weiß, dass das originär eine SQL Procedure war
- das Parameter mapping zwischen runtime und generiertem C Programm ist SQL spezifisch (zusätzliche Parameter)
- C kann im Parameter Handling mehr als CL (und auch RPG)
- nicht jede C Procedure muss aus CL aufrufbar sein
- nicht alles was die Datenbank in der Runtime hat, haben andere Programme auch

mfg

Dieter Bender,

der nicht unbedingt glaubt, dass es die zusätzlichen Parameter sind, wie man in anderen Foren lesen kann


Irgendwo gibt es doch die Prozedurdeklaration, ggf. in SYSPARMS mal nachschauen.
Deine Parameter musst du nun identisch deklarieren und die zusätzlichen Parameter wie SQLCOD, SQLSTATE mit übergeben.
Im SQL-Reference steht beschrieben, wie die Parameter in welcher Folge, ob mit/ohne NULL-Indikator usw. abhängig vom Prozedurtyp an Prozeduren übergeben werden.

Im Zweifel läßt man sich die Prozedur noch mal erstellen und schaut sich die generierte C-Quelle an (Spoolfile).

Dann steht einem Aufruf aber wirklich nichts im Wege.

HPKahn
10-01-07, 09:17
Hallo zusammen,

da ich Rückgabeparameter aus meiner SQL-SP erwarte und es auch partout nicht funktioniert ein CL mit Parametern aufzurufen(weiß der Geier warum) habe ich den Umweg über eine RPG-Programm gemacht (mein allererstes ;-)) und das funktioniert prima.

d main PR extpgm('CALLSQLSP')
d pspname 10A
d pretval N
*-----------------------------------------------------------
d main PI
d pspname 10A
d pretval N
*-----------------------------------------------------------
/free
select;
when pspname = 'GETPRJNTZ';
exsr callGetNtz;
when pspname = 'GETPRJ';
exsr callGetPRJ;
when pspname = 'GETTIME';
exsr callGetTime;
when pspname = 'MKPREPPRJ';
exsr callPrepPrj;
WHEN pspname = 'GETIBPKOST';
exsr callSTDSTZ;
when pspname = 'CRT_IBRHG';
exsr callCrtRhg;
endsl;
return;
/end-free

C callGetNtz begsr
* Aufruf der stored procedure
C/exec sql
C+ call GETPRJNTZ (:pretval)
C/end-exec
C endsr

C callGetPrj begsr
* Aufruf der stored procedure
C/exec sql
C+ call GETPRJ (:pretval)
C/end-exec
...

hier stellt sich jetzt ein neues Problem.
Eine Prozedur benötigt einen weiteren Parameter (Monatserster des Vormonats) diesen will ich im gleichen RPG-Programm ermitteln, nur weiss ich nicht richtig wie?

Hat hier jemand einn Tipp?

PS: Ein ausgesprochenes Lob an das Forum, hier können sich andere Foren eine Scheibe abschneiden.


Grüße HP Kahn

Fuerchau
10-01-07, 11:06
Erstmal danke für das Lob ;)

Monatserster am besten auch über SQL:

date(substr(char(current date - 1 month, *ISO), 1, 8) concat '01'))

Fuerchau
10-01-07, 12:34
Oder besser:

current date - 1 month - (day(current date) -1)

B.Hauser
10-01-07, 12:51
@ Baldur:


current date - 1 month - (day(current date) -1)
... versuch das mal, wenn das aktuelle Datum der 31.03. ist! Außerdem fehlt am Schluss Days!

Es gibt ausserdem noch andere Möglichkeiten, z.B. in Release V5R4:

Exec SQL Set :MyDate = Last_Day(Current_Date - 2 Month) + 1 Day;

Oder mit RPG (was außerdem schneller als die SQL-Variante ist, da kein Pseudo Datei-Zugriff gemacht wird):

/Free
MyDate = %Date(%Subst(%Char(%Date() - %Months(1): *ISO): 1: 8) + '01');
/End-Free

Birgitta

Fuerchau
10-01-07, 14:11
So funktionierts auch mit jedem Datum:

(current date - (day(current date) - 1) days) - 1 month

du hast Recht, "Days" fehlte und die Reihenfolge ist auch wichtig.

HPKahn
30-01-07, 14:22
Hallo zusammen,

hiermit funktioniert es auch.

D aktDate S D datfmt(*iso) inz(*Job)
D prvdate S D datfmt(*iso)

/free

prvDate = aktDate - %months(1) -
%days(%subdt(aktDate:*days) - 1);


Grüße HP