View Full Version : embedded SQL in RPG und dcl-c Definitionen
Servus :)
kann ich in embedded SQL keine per dcl-c definierten Werte in einer Where Bedingung abfragen?
Bsp:
dcl-c STATUS 'L';
exec sql
select * from xy.abc
where kundenstatus = :STATUS;
Mir wird dann beim Umwandeln immer gesagt das STATUS nicht definiert sei und läuft deswegen auf Fehler. Sobald ich die dcl-c in dcl-s umändere passt es dann aber....
Habe ich bei mir irgendein Fehler oder ist das in der Tat so vorgesehen?
Dein dcl-c impliziert einen Typ, der anscheinend vom SQL-Compiler nicht erkannt wird.
Schau mal, ob du dem dcl-c auch den Typ unterjubeln kannst, was du ja beim dcl-s machen musst.
Konstanten konnten noch nie von embedded SQL genutzt werden, unabhängig davon ob sie mit fixen oder free-format D-Bestimmungen definiert wurden.
In SQL PSM (Persistent Module - Programmier-Sprache SQL) können Konstanten erst seit einem der letzten Technologie Refreshs definiert und verwendet werden.
Warum eigentlich eine Konstatne verwenden, wenn man diese im statischen SQL stattdessen direkt angeben kann?
Weil man Konstanten dieser Art häufig mehrfach braucht, ggf. in Copy-Strecken verwendet und bei Änderungen dies nur an einer Stelle tun muss?
Gegenfrage:
Warum macht man denn Copystrecken?
Man kann den Code doch auch genau an der Stelle eintragen, wo man ihn braucht!
Im Ernst: Einer meiner Kunden macht dies tatsächlich so, weil ihm die Gefahr einer falsch geänderten Copystrecke ungleich größer erscheint, als bei Änderung der Funktion dies zig mal wiederholen zu müssen. Wobei, wenn die Funktion einmal korrekt steht bedarf sie ja auch keiner Änderung mehr.
... dieser ganze Deckel Kram ist wieder mal so eine meta solution (zu deutsch: Zwischenlösung) und der C-Deckel nimmt halt alle geerbten Schwächen mit: man kann da nix typisieren, eine Variable ist da die bessere Wahl (was auch gleich die Frage beantwortet, warum man da kein Literal hinschreiben soll!).
D*B
PS: Der SUBF-Deckel hat die /free-Kantinenwette in Toronto abgelöst, was man so einem RPG Programmierer alles als Verbesserung verkaufen kann - die lachen sich krumm und schief...
SUBF-Deckel? Was ist denn da nun wieder mit gemeint...
... kennst Du etwa nicht DCL-SUBF , da fehlt Dir sicher noch das brandneue TR76
Also DCL kenne ich nur bei CLP.
Interessanter wäre da eher mal die Integration der CMD-Schnittstelle:
DCL-CMD MyOvr OVRPRTF FILE(&NAME) ....;
:
EXEC CMD MyOvr(: Name);
Die Verarbeitung von RTV-CMD's wäre da dann viel effektiver, da ich mir den CLP-Kram dann sparen kann. Ggf. im V8R1-TR83?
der DCL-SUBF ist eine der wichtigsten Deklarationsarten und wird gebraucht, damit man in einer Datenstruktur, auch im Freeformat, Felder deklarieren kann, die man dann nur im fixed Format verwenden kann.
Ich habe da mal ein Beispiel aus einer offiziösen Doku:
Example 13. Data structure with the DCL-SUBF keyword
DCL-DS record_one;
buffer CHAR(25);
DCL-SUBF read INT(3);
END-DS;
Quelle: Free-form RPG support on IBM i (https://www.ibm.com/developerworks/ibmi/library/i-ibmi-rpg-support/)
Data structure subfields start with the DCL-SUBF keyword, but the keyword is optional unless the name is the same as a free-form operation code (op code). Example 13 illustrates a subfield declaration where the DCL-SUBF keyword is required. The DCL-SUBF keyword must be used because read is an op code supported in free-form.
Example 13. Data structure with the DCL-SUBF keyword
DCL-DS record_one;
buffer CHAR(25);
DCL-SUBF read INT(3);
END-DS;