Anmelden

View Full Version : Free RPG und Copies/Includes



Seiten : [1] 2

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?

Fuerchau
10-09-14, 14:30
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

Fuerchau
10-09-14, 15:51
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.

Fuerchau
10-09-14, 15:54
Nachtrag:
Wobei ich eine bedingte INFDS eher für unsinnig halte;-).

Fuerchau
10-09-14, 16:06
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 ;-)

Fuerchau
10-09-14, 16:26
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;-)).

B.Hauser
10-09-14, 17:18
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.