View Full Version : Free RPG und Copies/Includes
camouflage
10-09-14, 14:12
So ich das neue Free RPG schätze (auch wenn sich nach Dieters Meinung die IBMer schief lachen), so sehr treibt's mich manchmal zur Verzweifelung.
Ist das nun wirklich nicht möglich, dass ich auf ein "DCL-F" nicht mehr eine "DEFINE" konditionierte Anweisung mittels "copy" oder "include" definieren kann. Da erhalt ich doch glatt die Meldung RNF0202: THE DIRECTIVE IS NOT SUPPORTED IN A FREE-FORM STATEMENT.
Weiss da jemand Bescheid?
Poste mal den Code. Ich denke da liegt eher ein Syntax-Fehler vor.
Der Compiler liefert da schon mitunter komische Meldung, z.B.:
exec sql delete mytable where ...;
Hier kommt nun die Meldung "... wird von diesem Release nicht unterstützt ...".
Früher wurde man da eher auf das fehlende " from " hingewiesen.
camouflage
10-09-14, 15:25
Hier mein Beispiel:
dcl-f myDSPFile workstn(*ext) usropn
/copy qrpgcpysrc,f_infds
sfile(MySfl:RRN);
und im f_infds steht:
/if defined (INFDS)
infds(myInfDS)
/endif
Ergibt die erwähnte Fehlermeldung
Dies liegt in der generellen Syntax begründet:
Solange eine Anweisung nicht mit Semikolon abgeschlossen ist, wird sie als eine Zeile betrachtet.
Nur Kommentare bis Zeilenende werden ausgeblendet.
Deine Anweisung wird nun mal als:
dcl-f myDSPFile workstn(*ext) usropn /copy qrpgcpysrc,f_infds sfile(MySfl:RRN);
interpretiert. Da ist ein copy/include nun leider nicht mehr möglich.
Hat nun mal alles so seine Vor/Nachteile.
Nachtrag:
Wobei ich eine bedingte INFDS eher für unsinnig halte;-).
Ggf. hilft ja noch ein kleiner Trick:
Definiere die Quelle als SQLRPGLE (man muss kein SQL verwenden).
Verwende beim CRTxxx die Option RPGPPOPT(*LVL2)!
Dies löst Copy/Includes auf bevor der SQL-Precompiler dran ist da der das mitunter nicht kann.
Für Nicht-SQL-RPG's gibt's diese Option wohl nicht.
camouflage
10-09-14, 16:09
Baldur,
Ist ja nur ein Beispiel - ich hätte ja auch ein zweites SFL hinschreiben können. Allerdings ist das wirklich ein Mist (hmmm, ob ich Dieter doch Recht geben sollte) :eek:.
Hingegen in einer DCL-S geht's:
siehe hier:
DCL-S salary
/IF DEFINED(large_vals)
PACKED(13:3)
/ELSE
PACKED(7:3)
/ENDIF
;
Nachtrag: Sorry, ist kein Copy.
Mal gucken was Barbara zum Copy meint ;-)
Also wenn /IF-Anweisungen gehen mag er ja nur den Copy nicht. Versuch es doch mal mit dem Include, die Syntax ist ja die selbe.
Ansonsten ist das halt eine Fehlermeldung an IBM wert.
RPGLE ist da sowieso nicht besonders flexibel.
Ins besonders bei bedingten Daten-Teilstrukturen. Wenn sowas auch noch in Prototypen vorkommt (LIKEDS ist schnell gewählt) kann es ganz schön knallen.
Includes zu bedingen macht bei RPGLE eigentlich nur Sinn um doppelte Includes zu verhindern.
Sprachen wie C++ machen das zwar gerne, C++ hat aber genug Laufzeitprobleme bei falschen Definitionen.
Es gibt bei RPGLE zu wenig Laufzeit-Überwachungen (Pufferüberschreibungen werden ja hier häufiger mal gemeldet;-)).
M.E. Sollte es eigentlich immer noch funktionieren.
Poste es doch mal im IBM-Forum, das liest auch Barbara Morris und gibt entsprechende Antworten.
IBM RPG Forum (https://www.ibm.com/developerworks/community/forums/html/forum?id=11111111-0000-0000-0000-000000002284)
camouflage
11-09-14, 06:39
Licht im Dunkel...
/COPY oder /INCLUDE ist innerhalb von free form Statements nicht erlaubt. Erlaubt sind /IF, /ELSEIF, /ELSE und /ENDIF.
Um beim Beispiel zu bleiben müsste der Code so aussehen:
dcl-f myDSPFile workstn(*ext) usropn
/if defined (INFDS)
infds(f_infds)
/endif
sfile(MySfl:RRN);
Und um die "myINFDS" nicht "hart" zu codieren, kann ich mir als Copy Feld
dcl-c f_infds 'myInfDS';
definieren. Das kann man natürlich mit allen entsprechenden Keywords machen, klar.
Herzlichen Dank an Barbara Morris.