Code: Alles auswählen.
lr_table_ext ?= cl_abap_tabledescr=>describe_by_data( it_data ).
lr_struct_ext ?= lr_table_ext->get_table_line_type( ).
DATA(lt_table_ext) = lr_struct_ext->get_components( ).
" new col added to table
APPEND INITIAL LINE TO lt_table_ext ASSIGNING FIELD-SYMBOL(<fs_table_ext>).
TRANSLATE lv_attr_nm TO UPPER CASE.
<fs_table_ext>-name = lv_attr_nm.
<fs_table_ext>-type = iv_attr_type.
DATA(lr_struct_new) = cl_abap_structdescr=>create( lt_table_ext ).
DATA(lr_table_new) = cl_abap_tabledescr=>create( lr_struct_new ).
CREATE DATA rr_return TYPE HANDLE lr_table_new.
Code: Alles auswählen.
<lt_dbtab_ext> = CORRESPONDING #( BASE ( <lt_dbtab_ext> ) it_data ).
Bisschen optimieren geht immer. 😁Geht das evtl. noch schneller?
Code: Alles auswählen.
" new col added to table
APPEND VALUE #( name = TO_UPPER( lv_attr_nm )
type = iv_attr_type ) TO lt_table_ext.
Ja, kann man, wie auch in der Onlinehilfe steht. Aber Du kannst nur andersnamige Spalten der Quelltabelle ummappen und leider keine Konstanten reinmappen. Daher wird Dein oldschool-Ansatz zum Füllen der zusätzlichen Spalte leider alternativlos sein. Habe mich auch schon in Situationen befunden, in denen ich mir das anders gewünscht hätte.Kann man bei dem CORRESPONDING nicht irgendwie auch noch ein Feldmapping mitgeben?
Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
MarkusW
Thx.DeathAndPain hat geschrieben: ↑04.01.2024 17:12Bisschen optimieren geht immer. 😁
Code: Alles auswählen.
" new col added to table APPEND VALUE #( name = TO_UPPER( lv_attr_nm ) type = iv_attr_type ) TO lt_table_ext.
Code: Alles auswählen.
MODIFY itab FROM VALUE #( spalte = 1 ) TRANSPORTING spalte WHERE spalte = ''.
Folgende Benutzer bedankten sich beim Autor rob_abc für den Beitrag (Insgesamt 3):
ewx • DeathAndPain • MarkusW
Danke Dir Rob,rob_abc hat geschrieben: ↑05.01.2024 09:16Ich nutze modify, wenn ich alle Werte einer Spalte auf den gleichen Wert setzen möchte:Code: Alles auswählen.
MODIFY itab FROM VALUE #( spalte = 1 ) TRANSPORTING spalte WHERE spalte = ''.
Dieses Problem halte ich für lösbar, indem Du das machst, was man bei dynamischer Typgenerierung ohnehin alle Naselang machen muss: ein dynamisch erzeugtes Hilfsfeld verwenden.MarkusW hat geschrieben:dass funktioniert aber nur, wenn die Struktur der itab bekannt ist, ansonsten weiß der VALUE nicht welcher Typ '#' er hat
Code: Alles auswählen.
DATA where_string TYPE string.
FIELD-SYMBOLS <new_table> TYPE ANY TABLE.
* Hier steht Dein Code aus Deinem Originalpost bis einschließlich der Definition von rr_return
ASSIGN rr_return->* TO <new_table>.
CREATE DATA hilfsfeld LIKE LINE OF <new_table>.
ASSIGN hilfsfeld->* TO FIELD-SYMBOL(<hilfsfeld>).
ASSIGN COMPONENT lv_attr_nm OF STRUCTURE <hilfsfeld> TO FIELD-SYMBOL(<neue_spalte_des_hilfsfelds>).
<neue_spalte_des_hilfsfelds> = '1'.
where_string = lv_attr_nm && ` = ''`.
MODIFY <new_table> FROM <hilfsfeld> TRANSPORTING (lv_attr_nm) WHERE (where_string).
Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag (Insgesamt 2):
ewx • MarkusW
Hi DeathandPain,DeathAndPain hat geschrieben: ↑06.01.2024 16:43Auch von mir Dank an Rob; diese Syntaxvariante des MODIFY-Befehls war mir noch gar nicht bekannt. Die leistet ja genau das Benötigte.
Dieses Problem halte ich für lösbar, indem Du das machst, was man bei dynamischer Typgenerierung ohnehin alle Naselang machen muss: ein dynamisch erzeugtes Hilfsfeld verwenden.MarkusW hat geschrieben:dass funktioniert aber nur, wenn die Struktur der itab bekannt ist, ansonsten weiß der VALUE nicht welcher Typ '#' er hat
Ich schreib das jetzt mal aus dem Kopf runter, wie ich mir das vorstelle (unter Nutzung der von Dir definierten Felder), ohne es jetzt auch tatsächlich auszuprobieren:
Kann gut sein, dass in Obenstehendem noch ein Fehlerchen drin ist, aber ich denke, die Idee wird klar, und ich wette, dass man das zum Laufen bekommen kann.Code: Alles auswählen.
DATA where_string TYPE string. FIELD-SYMBOLS <new_table> TYPE ANY TABLE. * Hier steht Dein Code aus Deinem Originalpost bis einschließlich der Definition von rr_return ASSIGN rr_return->* TO <new_table>. CREATE DATA hilfsfeld LIKE LINE OF <new_table>. ASSIGN hilfsfeld->* TO FIELD-SYMBOL(<hilfsfeld>). ASSIGN COMPONENT lv_attr_nm OF STRUCTURE <hilfsfeld> TO FIELD-SYMBOL(<neue_spalte_des_hilfsfelds>). <neue_spalte_des_hilfsfelds> = '1'. where_string = lv_attr_nm && ` = ''`. MODIFY <new_table> FROM <hilfsfeld> TRANSPORTING (lv_attr_nm) WHERE (where_string).