Code: Alles auswählen.
2 Tabellen: t_kum mit den kumulierten Werten, t_dyn mit den dynamischen spalten
loop at t_kum assigning <ls_kum>.
tabelleneintrag in t_dyn zum Beleg finden und in Feldsymbol <ls_dyn> ablegen.
Wenn dieser noch nicht existiert einfügen und neuen Eintrag in <ls_dyn> ablegen.
ASSIGN COMPONENT zmonth of structure <ls_dyn> to <lv_monatsspalte>.
* Wenn das nicht klappt im Debugger schauen ob zmonth richtig gefüllt ist und es auch wirklich eine Spalte gibt, die genau so heißt.
add <ls_kum>-wmeng to <lv_monatsspalte>.
endloop.
Code: Alles auswählen.
If <wa_kum>-zmonth = <lv_spaltenname>
ASSIGN....WMENG
Code: Alles auswählen.
ASSIGN COMPONENT 'VBELN' OF STRUCTURE <wa_dyn_table> to <w_field>.
<w_field> = <wa_res>-vbeln.
Code: Alles auswählen.
REPORT.
TYPES: BEGIN OF ts_kum,
spmon TYPE spmon,
vbeln TYPE vbeln,
wmeng TYPE wmeng,
END OF ts_kum,
tt_kum TYPE STANDARD TABLE OF ts_kum WITH NON-UNIQUE DEFAULT KEY.
TYPES: BEGIN OF ts_dyn,
vbeln TYPE vbeln,
wmeng_201611 TYPE wmeng,
wmeng_201612 TYPE wmeng,
wmeng_201701 TYPE wmeng,
END OF ts_dyn,
tt_dyn TYPE STANDARD TABLE OF ts_dyn WITH NON-UNIQUE DEFAULT KEY.
DATA: gt_kum TYPE tt_kum,
gs_kum TYPE ts_kum,
gt_dyn TYPE tt_dyn,
gs_dyn like line of gt_dyn.
FIELD-SYMBOLS: <ls_dyn> LIKE LINE OF gt_dyn,
<lv_field> TYPE wmeng.
DEFINE build_testdata.
gs_kum-spmon = &1.
gs_kum-vbeln = &2.
gs_kum-wmeng = &3.
append gs_kum to gt_kum.
END-OF-DEFINITION.
END-OF-SELECTION.
* Testdaten -
build_testdata: '201611' '0000011111' 10,
'201612' '0000011111' 20,
'201701' '0000011111' 40,
'201611' '0000022222' 50,
'201611' '0000022222' 60, " 2. Eintrag mit selbem Schlüssel
'201612' '0000022222' 70,
'201611' '0000033333' 80,
'201611' '0000033333' 90, " 2. Eintrag mit selbem Schlüssel
'201611' '0000033333' 100,
'201612' '0000033333' 110,
'201611' '0000044444' 120,
'201701' '0000044444' 130.
LOOP AT gt_kum INTO gs_kum.
LOOP AT gt_dyn ASSIGNING <ls_dyn> WHERE ('VBELN = gs_kum-vbeln').
EXIT.
ENDLOOP.
if sy-subrc <> 0.
clear gs_dyn.
gs_dyn-vbeln = gs_kum-vbeln.
append gs_dyn to gt_dyn ASSIGNING <ls_dyn>.
endif.
data: spaltenname type string.
spaltenname = |WMENG_{ gs_kum-spmon }|.
assign COMPONENT spaltenname of STRUCTURE <ls_dyn> to <lv_field>.
if sy-subrc = 0.
add gs_kum-wmeng to <lv_field>.
endif.
ENDLOOP.
break-point.
Code: Alles auswählen.
LOOP AT gt_res INTO wa_res.
LOOP AT <t_dyn_table> ASSIGNING <wa_dyn_table> WHERE ('VBELN = wa_res-vbeln').
EXIT.
ENDLOOP.
IF sy-subrc <> 0.
CLEAR <wa_dyn_table>.
<wa_dyn_table> = wa_res-vbeln.
APPEND <wa_dyn_table> TO <t_dyn_table> ASSIGNING <wa_dyn_table>.
ENDIF.
spaltenname = ( wa_res-zmonth ).
ASSIGN COMPONENT spaltenname OF STRUCTURE <wa_dyn_table> TO <w_field>.
IF sy-subrc = 0.
ADD wa_res-wmeng TO <w_field>.
ENDIF.
ENDLOOP.
Code: Alles auswählen.
<wa_dyn_table> = wa_res-vbeln.
Code: Alles auswählen.
<wa_dyn_table>-vbeln = wa_res-vbeln.
Code: Alles auswählen.
FIELD-SYMBOLS: <vbeln> type vbeln_va.
Assign component 'VBELN' of structure <wa_dyn_table> to <vbeln>.
if sy-subrc = 0.
<vbeln> = wa_res-vbeln.
endif.
Code: Alles auswählen.
DATA: BEGIN OF ls_known_fields,
vbeln type vbeln,
END OF ls_known_fields.
ls_known_fields-vbeln = wa_res-vbeln.
MOVE-CORRESPONDING ls_known_fields TO <wa_dyn_table>.
Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
Akatash
Code: Alles auswählen.
field-symbols: <vbeln> type vbeln,
<labnk> type labnk.
create data wa_dyn_table like line of <t_dyn_table>.
assign wa_dyn_table->* to <wa_dyn_table>.
loop at gt_res into wa_res.
loop at <t_dyn_table> assigning <wa_dyn_table> where (('VBELN = wa_res-vbeln') AND ('LABNK = wa_res-LABNK')) * wird zwar hier richtig dargestellt, aber in SAP krieg ich da eine Fehlermeldung.
* LOOP AT <t_dyn_table> ASSIGNING <wa_dyn_table> WHERE ('LABNK = wa_res-LABNK').
* EXIT.
* ENDLOOP.
exit.
endloop.
clear <wa_dyn_table>.
assign component 'VBELN' of structure <wa_dyn_table> to <vbeln>.
if sy-subrc = 0.
<vbeln> = wa_res-vbeln.
endif.
assign component 'LABNK' of structure <wa_dyn_table> to <labnk>.
if sy-subrc = 0.
<labnk> = wa_res-labnk.
endif.
spaltenname = ( wa_res-zmonth ).
assign component spaltenname of structure <wa_dyn_table> to <w_field>.
if sy-subrc = 0.
add wa_res-wmeng to <w_field>.
endif.
append <wa_dyn_table> to <t_dyn_table>.
endloop.
Code: Alles auswählen.
FIELD-SYMBOLS: <vbeln> TYPE vbeln,
<labnk> TYPE labnk.
* <wa_res> like LINE OF gt_res.
CREATE DATA wa_dyn_table LIKE LINE OF <t_dyn_table>.
ASSIGN wa_dyn_table->* TO <wa_dyn_table>.
SORT gt_res BY zmonth labnk.
LOOP AT gt_res INTO wa_res.
IF <wa_dyn_table> IS NOT ASSIGNED.
APPEND INITIAL LINE TO <t_dyn_table> ASSIGNING <wa_dyn_table>.
ENDIF.
CLEAR <wa_dyn_table>.
IF <vbeln> IS NOT ASSIGNED.
ASSIGN COMPONENT 'VBELN' OF STRUCTURE <wa_dyn_table> TO <vbeln>.
ELSE.
<vbeln> = wa_res-vbeln.
ENDIF.
IF sy-subrc = 0.
<vbeln> = wa_res-vbeln.
ENDIF.
ASSIGN COMPONENT 'LABNK' OF STRUCTURE <wa_dyn_table> TO <labnk>.
IF sy-subrc = 0.
<labnk> = wa_res-labnk.
ENDIF.
spaltenname = ( wa_res-zmonth ).
ASSIGN COMPONENT spaltenname OF STRUCTURE <wa_dyn_table> TO <w_field>.
IF sy-subrc = 0.
ADD wa_res-wmeng TO <w_field>.
ENDIF.
APPEND <wa_dyn_table> TO <t_dyn_table>.
ENDLOOP.
Code: Alles auswählen.
READ TABLE <t_dyn_table> ASSIGNING <wa_dyn_table> WITH KEY vbeln = wa_res-vbeln labnk = wa_res-labnk.
Code: Alles auswählen.
loop at gt_res into wa_res.
READ TABLE <t_dyn_table> INTO ls_wa_dyn_table WITH KEY vbeln = wa_res-vbeln labnk = wa_res-labnk.
ls_wa_dyn_table-spaltenname = wa_res-zmonth.
append ls_wa_dyn_table to <t_dyn_table>.
endloop.
Code: Alles auswählen.
loop at gt_res assigning <ls_res>
group by VBELN = <ls_res>-vbeln LABNK = <ls_res>-labnk
assigning <ls_group>.
APPEND INITIAL LINE TO <t_dyn_table> ASSIGNING <wa_dyn_table>.
ASSIGN COMPONENT 'VBELN' OF STRUCTURE <wa_dyn_table> TO <vbeln>.
<vbeln> = <ls_group>-vbeln.
ASSIGN COMPONENT 'LABNK' OF STRUCTURE <wa_dyn_table> TO <labnk>.
<labnk> = wa_res-labnk.
loop at group <ls_group> assigning <ls_group_res>.
spaltenname = ( <ls_group_res>-zmonth ).
ASSIGN COMPONENT spaltenname OF STRUCTURE <wa_dyn_table> TO <w_field>.
IF sy-subrc = 0.
ADD <ls_group_res>-wmeng TO <w_field>.
ENDIF.
endloop.
endloop.
Warum schreibst du auch das AND außerhalb der dynamischen WHERE-Bedingung? Alles zusammen in einen String und alles ist easy.Akatash hat geschrieben:[...] Er fängt dann immer eine neue Zeile an und ich glaube das liegt daran, dass ich in die WHERE Klausel doch noch das Feld LABNK einbauen muss nur wenn ich das über AND verknüpfe, dann sagt er mir "nur statische Typen sind erlaubt".
Code: Alles auswählen.
REPORT. " DÖF
FIELD-SYMBOLS: <gt_test> TYPE STANDARD TABLE.
DATA: gt_t005 TYPE STANDARD TABLE OF t005 WITH NON-UNIQUE DEFAULT KEY,
begin of gs_relevant_fields,
land1 type t005-land1,
end of gs_relevant_fields,
gs_t005t type t005t.
PARAMETERS: p_waers TYPE t005-waers OBLIGATORY DEFAULT 'EUR',
p_spras TYPE t005-spras OBLIGATORY DEFAULT 'D'.
SELECT * FROM t005 INTO TABLE gt_t005.
ASSIGN gt_t005 TO <gt_test>.
*LOOP AT <gt_test> ASSIGNING FIELD-SYMBOL(<gs_line>) WHERE ('Bedingung1 AND Bedingung2').
LOOP AT <gt_test> ASSIGNING FIELD-SYMBOL(<gs_line>) WHERE ('WAERS = p_waers AND SPRAS = p_spras').
MOVE-CORRESPONDING <gs_line> to gs_relevant_fields.
select single *
into gs_t005t
from t005t
where land1 = gs_relevant_fields-land1
and spras = sy-langu.
WRITE:/ gs_t005t-landx.
ENDLOOP.
Weil es keinen dynamischen READ gibt ( naja - irgendwie gibts das schon - ist aber nicht sonderlich schön das zu verwenden und Lesbarkeit leidet stark darunter ) nimm halt den dynamischen LOOP.. WHERE. EXIT. ENDLOOP. Das enstpricht dem dyn. READ und die WHERE-Bedingung kann eben auch sehr gut lesbar sein ( siehe Beispiel ) und beliebig komplex mit Mischformen aus Konstanten und Programmvariablen.Akatash hat geschrieben:Mittlerweile tendier ich fast dazu, das <wa_dyn_table> komplett aus der gt_res befüllen zu lassen mit ein paar checks und dann mit einem Append am Ende anzufügen, die Frage ist nur wie mach ich das, weil über READ TABLE nach einem bestimmten KEY kann ich es nicht lösen, da die Werte je nach Eingabe des Anwenders dynamisch generiert werden... naja evtl hat ja irgendjemand ne Idee wie man die Problemstellung am schlausten lösen kann.