Hä?casman hat geschrieben:Und wenn du keine Kopfzeile hast, musst du immer eine Workarea nutzen.
Aha. Man sollte vllt. über die mannigfachen Nachteile von Tabellen mit Kopfzeilen was sagen, wenn man sie schon erwähnt. Nicht umsonst sind sie im OO-Kontext verboten.casman hat geschrieben:Die Workarea ist nichts anderes als eine explizite Kopfzeile, während die Deklaration mit HEADER LINE eine implizite Kopfzeile erzeugt.
Und was soll er dann bitte mit einer Kopfzeile, wenn er eh den Zeiger durch den Tabellenkörper schickt? Warum sagst du nicht dazu, dass er dann ein Feldsymbol braucht und was das ist?casman hat geschrieben:Verwende beim loopen LOOP AT ASSIGNING, das ist performant.
Code: Alles auswählen.
LOOP AT itab INTO workarea.
Code: Alles auswählen.
LOOP AT itab ASSIGNING <FS>.
Code: Alles auswählen.
TYPES: BEGIN OF ty_itab,
posid TYPE prps-posid,
objnr TYPE prps-objnr,
prart TYPE prps-prart,
stat TYPE jest-stat,
END OF ty_itab.
data: lt_itab TYPE TABLE OF ty_itab,
p_filename TYPE FILENAME-FILEINTERN,
wa_itab Type ty_itab,
*Tables
lt_xpa Type TABLE OF ty_itab, lt_erg type TABLE OF ty_itab.
FIELD-SYMBOLS: <z1> TYPE ty_itab, <z2> Type ty_itab, <z3> like LINE OF lt_erg.
START-OF-SELECTION.
PERFORM sub_get_filename .
PERFORM sub_get_data .
* Tabelle aus dem Dictionary in interne Tabelle laden.
SELECT prps~posid prps~objnr prps~prart jest~stat
FROM prps JOIN jest on prps~objnr = jest~objnr
into CORRESPONDING FIELDS OF TABLE lt_xpa
WHERE jest~inact <> 'X'.
* Zeileninhalt der Tabelle lt_itab (Basis) auf Zeileninhalt mit Tabelle lt_xpa überprüfen.
loop at lt_itab ASSIGNING <z1>.
loop at lt_xpa ASSIGNING <z2>.
* Identifizierendes Objekt ist Feld objnr.
* Bei ungleichem Inhalt des Feldes stat wird dieser Datensatz in die Tabelle lt_erg geschrieben.
if <z1>-objnr = <z2>-objnr AND <z1>-stat <> <z2>-stat.
* Die Stati in der XPA sind andere als in der X82, deshalb müssen die "gleichbedeutenden" übersprungen werden.
if <z1>-stat = 'E0002' AND <z2>-stat = 'I0002'.
skip to line 64 .
endif.
IF <z1>-stat = 'E0003' AND <z2>-stat = 'I0045'.
skip to line 64.
endif.
Append <z2> to lt_erg.
endif.
endloop.
endloop.
* loop at lt_erg ASSIGNING <z3>.
PERFORM feldkatalog_fuellen.
PERFORM fieldcatalog_commit.
PERFORM alv_fill.
clear: lt_itab, lt_xpa, lt_erg.
END-OF-SELECTION.
Code: Alles auswählen.
loop at lt_itab ASSIGNING <z1>.
loop at lt_xpa ASSIGNING <z2>
WHERE objnr = <z1>-objnr AND stat <> <z1>-stat.
Code: Alles auswählen.
CONTINUE.
Code: Alles auswählen.
EXIT.
Wow. Das erinnert mich an die Anweisung GOTO auf meinem ZX81 mit 1KB RAM, muss so Anfang der 80er gewesen sein.....Spookykid hat geschrieben:Die Skip TO Line 64 Anweisung soll gewährleisten, dass der Befehl "Append <z2> to lt_erg." nicht ausgefährt wird, sollten die beiden inneren Schleifen "true" sein.