PDA

View Full Version : Verschachtele /COPY Anweisung und embedded SQL



dschroeder
23-06-14, 12:12
Hallo,

ich möchte 2 Copy Strecken verschachteln und bekomme im embedded SQL den Fehler SQL1003: Verschachtelte /COPY-Anweisungen nicht zulässig.

Weiß jemand auf die Schnelle, ob man das beim CRTSQLRPGI einstellen kann? Bisher hatten wir die Verschachtelung einfach mit /INCLUDE anstatt /COPY gemacht. Dadurch hat der SQL Precompiler die 2. Copy Strecke ignoriert und es gab keinen Verschachtelungskonflikt. Jetzt brauche ich in einem Programm aber die 2. Copy Strecke und möchte, dass auch embedded SQL die Verschachtelung auflöst. Geht das?

Dieter

Fuerchau
23-06-14, 12:22
RPGPPOPT(*LVL1/*LVL2) sollte dies dann machen.

dschroeder
23-06-14, 13:01
Ich habe es gerade ausprobiert. *LVL2 scheint für uns genau das richtige zu sein.

Herzlichen Dank.

Dieter

Fuerchau
23-06-14, 13:07
Bedenke bei geschachtelten Copies/Includes Mehrfachcopies/Rekursionen per

#ifndef MyCopyMbr
#define MyCopyMbr
:
:
#endif

(oder so ähnlich) auszuschließen.

dschroeder
23-06-14, 13:16
Vielen Dank für den Hinweis. Wir haben 2 "Ebenen" von Copystrecken. Zum einen die für die Serviceprogramm-Prototypes und zum anderen eine für Datenstrukturen. Die Serviceprogramm Copy-Strecken beinhalten alle auch die Datenstrukturen-Copystrecke. In der Datenstruktur Copy Strecke haben wir alles mit der if defined Direktive abgesichert. Z.B.:


/if not defined(COPY__###_um_SwitchDS)
D um_SwitchDS DS qualified template
D Name 50A varying
D Wert N
/define COPY__###_um_SwitchDS
/endif

Scheint jedenfalls zu klappen.

Nochmals Danke,
Dieter

Fuerchau
23-06-14, 14:10
Diese Direktiven sind am Besten grundsätzlich anzuwenden, also egal von welchem Typ der Copy ist.
Der "/define" gehört direkt nach den "/if"!
Warum?
Da Copies nun mal gerne länger als eine Seite sind, fügt hier irgendjemand einen neuen /Copy vor dem "/define" ein und schon klappts nicht mehr mit der Absicherung, da der /Define zu spät kommt.

dschroeder
23-06-14, 14:58
Also wäre folgendes besser?

/if not defined(COPY__###_um_SwitchDS)
/define COPY__###_um_SwitchDS
D um_SwitchDS DS qualified template
D Name 50A varying
D Wert N
/endif

woodstock99
23-06-14, 15:33
genau . also ich mache das persönlich immer so .

/if not defined(COPY__###_um_SwitchDS)
/define COPY__###_um_SwitchDS
bla bla
/endif

Fuerchau
23-06-14, 15:40
Nun, das entspricht doch eher einer verständlichen Logik:).
Solange nun keiner einen "/undef" einbaut, bist du auf der sicheren Seite.

Mittel "/if" lassen sich auch "konfigurierbare" Copies erstellen.
Ich habe mehrere Gruppen von Funktionen in einem Copy.
Allerdings benötige ich nicht alle.

So kann ich in meiner Hauptquelle definieren:

/define FktBlock1
/define FktBlock2
:
/copy FktCopy

Ähnlich wird es in z.B. C++ auch gemacht (Dieter wird jetzt mal wieder dagegen sprechen).

Auch Versionen lassen sich so ggf. steuern.

/if Defined(Version_2)
d myCallProc pr extproc(MyCallProcV2)
d Parm1
d Parm2
/else
d myCallProc pr extproc(MyCallProc)
d Parm1
/endif

Solange also keiner explizit auf V2 verweist, wird die alte Funktion verwendet.
Dies vereinfacht die Kompilierung ins besonders bei längeren Copystrecken.

Dieter wird auch hier was dagegen haben:).

dschroeder
23-06-14, 17:51
Vielen Dank.
ich denke, ich werde unsere copy-Strecke entsprechend umbauen.
Dieter