PDA

View Full Version : SQL -> CREATE VIEW



Seiten : 1 [2]

Kaufmann
10-05-06, 12:18
Das Programm wird als Modul gewandelt.
Ich habe eine eigene Prozedur zum Testen des SQL angelegt. Diese sieht so aus:

//-------------------------------------------------------------------------------------------
// GetBLFOLGE2 : BLFOLGE aus Parameterdatei lesen
// IN : pMdt - Mandant
// RESULT : true = erfolgreich, false = nicht gefunden
// FILE : -
//-------------------------------------------------------------------------------------------
P GetBLFOLGE2 B
D GetBLFOLGE2 PI 1N
D pMdt CONST like(FRD1.MDT)
//--------------------
// Lokale Variablen
//--------------------
D vBlFolge S like(FRD1.BLFOLGE) inz
//--------------------
//

C*-----------------------------
C* DEKLARATION 1 --------------
‚C/EXEC SQL
‚C+ DECLARE CURSOR MYCURSOR FOR
C+ SELECT BLFOLGE FROM SCHUELLER/ARBP2P
C+ WHERE FERT1B BETWEEN 680 AND 699 AND BLOCKN <> 0
C+ ORDER BY MDT, BLOCKN, FERT1B, LFDNREH, STKZ2B,
C+ CASE RLB WHEN 'R' THEN '1' WHEN ' ' THEN '2' WHEN 'L' THEN '3' END
C+ FOR UPDATE [ OF BLFOLGE ]
‚C/END-EXEC
šC/EXEC SQL OPEN MYCURSOR
‚C/END-EXEC
C*-----------------------------
‚C SQLCOD DOUNE 0
C*-----------------------------
‚C/EXEC SQL
ˆC+ FETCH MYCURSOR INTO :vBLFOLGE
šC/END-EXEC
C*-----------------------------
C ENDDO
C*-----------------------------
C/EXEC SQL CLOSE MYCURSOR
C/END-EXEC
C*-----------------------------
/FREE

return;

/END-FREE

P GetBLFOLGE2 E


Versuche ich das Programm mit CRTSQLRPGI zu wandeln bekomme ich diese Fehlermeldungen:

Satz *...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8 FLGNR. Letzte Änderung Kommentare
2424 C+ DECLARE CURSOR MYCURSOR FOR 16506 10.05.06
2431 C/EXEC SQL OPEN MYCURSOR 16516 10.05.06
2437 C+ FETCH MYCURSOR INTO :vBLFOLGE 16522 10.05.06
2442 C/EXEC SQL CLOSE MYCURSOR 16527 10.05.06
5722ST1 V5R2M0 020719 SQL-ILE-RPG-Objekt erstellen NACHT547 10.05.06 13:09:45 Seite
DIAGNOSENACHRICHTEN
MSG ID WTK SATZ TEXT
SQL0104 30 2424 Position 24 Token MYCURSOR ungültig. Gültige Token:
STATEMENT.
SQL0199 30 2424 Position 33 Schlüsselwort FOR nicht erwartet. Gültige
Token: <ENDE DER ANWEISUNG>.
SQL0504 35 2431 Position 22 Cursor MYCURSOR nicht deklariert.
SQL0504 35 2437 Position 15 Cursor MYCURSOR nicht deklariert.
SQL0312 30 2437 Position 30 Variable VBLFOLGE nicht definiert oder nicht
verwendbar.
SQL0504 35 2442 Position 23 Cursor MYCURSOR nicht deklariert.
Nachrichtenzusammenfassung
Total Info Warnung Fehler Wertigk. Beendigung


Was mache ich falsch?
Sorry das ich immer noch nerve!!
Habe keine große Erfahrung mit SQL in RPG-Sourcen

Fuerchau
10-05-06, 13:01
Die eckige Klammer darf nicht angegeben werden. Sie diente nur zur Syntaxerklärung, dass diese Angabe optional ist.
Werden Felder in "for update of f1, f2, ..." benannt, können nur diese in einer späteren "Update ... current of .." verändert werden.

Ansonsten:
Bist du sicher, dass du nur 1 Zeile verarbeiten musst ?

Kaufmann
11-05-06, 13:08
Jetzt gehts!!
Danke für die Tips!!!

Eine Frage habe ich aber noch:

Ich rufe die Prozedur in der sich der SQL-Aufruf befindet aus einer anderen Prozedur im selben Programm auf. Wenn ich beim Debugen(STRDBG) in eine Prozedur wechseln will mache ich das über die F22-Taste(Step into) oder ich setze gleich einen Breakpoint (mit F6) in der Prozedure. Will ich aber die Prozedur mit dem SQL-Statment debugen so komme ich nicht in die Prozedur und ich kann diese auch nicht im Debugmodus anzeigen. Es ist wie wenn diese nicht vorhanden ist.

Das Programm habe ich mit CRTSQLRPGI gewandelt.

CRTSQLRPGI OBJ(Lib/Programm) SRCFILE(Lib/QRPGLESRC) OBJTYPE(*MODULE)
Muss ich beim Aufruf der Debugfunktion etwas beachten oder habe ich etwas bei der Umwandlung falsch gemacht?

Frank Hildebrandt
11-05-06, 13:40
Beim Befehl CRTSQLRPGI den Parameter DBGVIEW auf den Wert *SOURCE setzen.

Kaufmann
11-05-06, 13:55
Die Änderung der Generierung hat nichts bewirkt. Zusätzlich habe ich in die Prozedur einen Rückgabewert eingefügt den ich innerhalb der Prozedur stumpf mit einem Wert gefüllt habe. Der Wert ist als VALUE deklariert und wird aber nicht verändert durch den Aufruf der Prozedure.

P GetBLFOLGE2 B
D GetBLFOLGE2 PI
D pMdt like(FRD1.MDT) CONST
D pBlFolge like(FRD1.BLFOLGE)
//--------------------
// Lokale Variablen
//--------------------
D vBlFolge S like(FRD1.BLFOLGE) inz
‚C/EXEC SQL
‚C+ DECLARE C1 CURSOR FOR
C+ SELECT * FROM SCHUELLER/ARBP2P
C+ WHERE FERT1B BETWEEN 680 AND 699 AND BLOCKN <> 0
C+ ORDER BY MDT, BLOCKN, FERT1B, LFDNREH, STKZ2B,
C+ CASE RLB WHEN 'R' THEN '1' WHEN ' ' THEN '2' WHEN 'L' THEN '3' END
C+ FOR UPDATE OF BLFOLGE
‚C/END-EXEC

šC/EXEC SQL
C+ OPEN C1
‚C/END-EXEC

‚C/EXEC SQL WHENEVER NOT FOUND GO TO DONE1
‚C/END-EXEC
C*-----------------------------
‚C* SQLCOD DOUNE 0
C*-----------------------------
‚C/EXEC SQL
ˆC+ FETCH C1 INTO :BLFOLGE
šC/END-EXEC
C*-----------------------------
C* ENDDO
C*-----------------------------
C/EXEC SQL CLOSE C1
C/END-EXEC
C*-----------------------------

C DONE1 TAG
/FREE

pBlFolge = 99;
return;

/END-FREE

Fuerchau
11-05-06, 14:19
Definiere einen Rückgabewert auf dem Interface

d*Prototyp
D GetBLFOLGE2 PR 5S 0
:

d*Interface
D GetBLFOLGE2 PI 5S 0
:
:
return BlFolge;

Oder Übergebe den Paramter nicht als VALUE.
Dies bedeutet nämlich, dass eine Kopie der Variablen übergeben wird !
Definierst du einen Returnwert, kannst du das dann auch netter aufrufen:

NewBlFolge = GetBLFOLGE2(Parameter);

Achtung:
Dein DONE1-Tag muss VOR dem Close sitzen, da der Fehler nicht beim Open gemeldet wird. Ansonsten ist es besser SQLCOD = 100 (EOF) abzufragen.

Frank Hildebrandt
11-05-06, 14:22
Das Modul muss in jedem Fall mit dem Parameter DBGVIEW(*SOURCE) über den Befehl CRTSQLRPGI umgewandelt werden. Ohne dem geht es in keinem Fall. Jetzt versuch mal noch den. 1. STRDBG PGM(Programmname) 2. Dann drückst Du F14=Mit Modulliste arbeiten. Dann gibst Du vor dem Modul mit der ominösen Prozedur die Auswahl 5=Modulquelle anzeigen
ein. Dann gehst Du mit dem Cursor auf das Statement mit der ersten C-Bestimmung innerhalb der Prozedur und drückst dort F6=Unterbrechungspunkt hinzufügen. Wenn Du dann dein Programm aufrufst, dann sollte der Debugger in der Prozedur stoppen. Nur noch mal der Vollständigkeit halber. Zuerst mit dem Befehl CRTSQLRPGI das Modul erstellen und dann mit CRTPGM das Programm erstellen.

Kaufmann
11-05-06, 14:57
Hatte die ganze Zeit das Programm nicht mit CRTPGM umgesetzt. Für die Erstellung eines Moduls oder eines Serviceprogramms haben wir das normalerweise auf ein Kürzel gelegt. Dieses erstellt über einen Programmaufruf die Programme.

Zu Fürchau:

Auf einen Parameter möchte ich das Ergebnis nicht legen, weil ich die Funktion wie folgt benutzen will:
if not GetBlFolge(pMDT :vBlFolge);

endif;
Als Rückgabwert erhalte ich einen bolschen Wert der aussagt Fehler oder keine Fehler. Dies ist nicht mehr möglich wenn ich BlFolge als Rückgabewert erstelle.

Zu Frank Hildebrandt:

Danke das war der Tip der mir gefehlt hat.
Manchmal ist man halt nicht auf das naheliegenste.

Danke nochmal an Euch für die Hilfe bei meinem Problem.