PDA

View Full Version : V7R1 Compiler-Fehler?



Fuerchau
26-04-16, 17:41
Das hat mich nun doch einiges an Zeit gekostet:
Aus der OPM-Welt kennt man das ja, man definiert die F-Bestimmung und zusätzlich eine externe DS derselben Datei um beim READ/CHAIN alle Felder gelesen zu bekommen, damit man im Debugger auch nicht verwendete Felder ansehen kann.
Im ILERPG mit V7R1 funktioniert das nun nicht mehr.
In der externen DS werden tatsächlich nur die Felder gefüllt, die vom RPGLE referenziert, also benutzt werden.
Wenn man das alte Verfahren benötigt, muss man nun eine DS (ohne extern) mit LIEKREC(Format:*input) definieren und beim READ/CHAIN dann diese DS als Ziel angeben.
Nun kann man erst alle Felder betrachten.
Was ich noch nicht ausprobiert habe ist, ob der Compiler anders reagiert, wenn man diese DS dann als CALL-Parameter verwendet. Wenn nicht wäre das an dieser Stelle fatal und man kann dann von einem CVTRPGSRC nur abraten.
Kleiner Nachteil: die DS ist automatisch qualified, was ein Menge Codeänderungen bedeutet.
Dies bekommt man leider auch nicht mit irgendeiner Optimized-Methode/Option weg.

dschroeder
28-04-16, 10:41
Ich kann dein Problem nicht nachvollziehen. Wahrscheinlich habe ich das falsch verstanden.
Wir haben V7R2. Da haben wir keine Probleme.

Es ist allerdings (ich denke schon immer) so, dass nicht benutzte Variablen vom Compiler aus dem Programm herausoptimiert wurden (CPF7031 in der Wandlungsliste). Das heißt, eine reine Deklaration des Datensatzes als externe Struktur bringt nichts, wenn die externe Struktur im weiteren Programm nicht verwendet wird.

Wenn du irgendwo im Programm eine unproblematische Verwendung des Datensatzes arrangierst, kannst du auch alle Felder sehen.

Hier sieht man den Inhalt nicht:

FKUNDE IF E K DISK
dcl-ds KUNDESatz extname('KUNDE') end-ds;
C READ KUNDE
*inlr = *on;
return;


Hier kann man den Inhalt von KUNDESatz (alle Felder) im Debugger sehen:

FKUNDE IF E K DISK
dcl-ds KUNDESatz extname('KUNDE') end-ds;
C READ KUNDE
if KUNDESatz = *loval;
endif;
*inlr = *on;
return;


Das "if KUNDESatz = *loval" ist natürlich inhaltlich sinnlos, da im if nichts gemacht wird. Aber es sorgt dafür, dass der Compiler KUNDESatz nicht herausoptimiert.

Fuerchau
28-04-16, 11:31
Ok, das mag als Hinweis gelten, werde ich mal ausprobieren.
Allerdings ist damit das einfache CVTRPGSRC noch nicht der Weisheit letzter Schluss.
Denn wenn die DS als solche nicht referenziert wird würden nicht alle Felder der DS gefüllt und das ILERPG läuft anders als das OPMRPG.
Ich werde da noch mal einen Test machen.

ExAzubi
28-04-16, 12:09
Also Kollege Schroeder hat Recht, es muss nur zumindest einmal die Datenstruktur im Programm verwendet werden (Wie ist egal) weil sonst die DS auch ein RNF7031 ist.
Also bau ruhig mal ein Dummy - IF ein und dann sollte alles gut sein...

dschroeder
28-04-16, 12:19
Ein Einzeiler anstatt des if geht natürlich auch:
KUNDESatz = KUNDESatz;

Dieter

Fuerchau
28-04-16, 13:10
Soviel zum Thema einfach mal einen CVTRPGSRC automatisieren.
Aber ich denke, dass ist ggf. kein großer Akt.
Vielen Dank an alle.

Pikachu
28-04-16, 14:17
Probier mal ab V5R4 mit DEBUG(*INPUT)

V5R4 RPG Enhancements (http://www.itjungle.com/fhg/fhg022206-story01.html)

DEBUG(*INPUT) tells the compiler to retain unused input fields (the ones flagged with error 7031 in the compilation listing) in the program object. If you exclude unused fields, you will not be able to see the values of those fields while debugging.

Fuerchau
28-04-16, 14:51
DAS ist der beste Hinweis überhaupt! Das kann man globalisieren und erleichtert ungemein.
Die Performance ist da nämlich nicht relevant bzw. ein paar moves mehr sind da jenseits der Nachweisgrenze.
Im Absturzfall (Dump) aber eine extreme Hilfe.