Code: Alles auswählen.
Update db_auto from wa_auto
Code: Alles auswählen.
form update_fields_mara.
data wa_table type DDOBJNAME.
* Felddefinitionen
data it_dfies type DFIES_TAB.
field-symbols <fs_dfies> type dfies.
field-symbols <fs_field> type any.
field-symbols <fs_new> type any.
field-symbols <fs_old> type any.
* Für set
DATA fieldvalue(72) TYPE c.
DATA set_field TYPE string.
DATA it_set_field TYPE TABLE OF string.
DATA fieldvalue_num(32) TYPE c.
* Nehmen wir einfach an es ist die mara
* und in wa_mara_new stehen die neuen Daten
* und in wa_mara_old stehen die alten Daten
data wa_mara_new type mara.
data wa_mara_old type mara.
* Nehmen wir an die Sperrtabelle sieht so aus :
types : begin of ty_sperr,
tabname type tabname,
fieldname type fieldname,
sperr type flag.
types : end of ty_sperr.
data it_sperr type sorted table of ty_sperr
with unique key tabname fieldname.
data wa_sperr type ty_sperr.
field-symbols <fs_sperr> type ty_sperr.
* und Annahme Änderung erlaubt nur falls
* Feld in it_sperr !und! sperr = ' '.
*Sperrtabelle bestücken
clear it_sperr.
clear wa_sperr.
wa_sperr-tabname = 'MARA'.
wa_sperr-fieldname = 'HOEHE'.
insert wa_sperr into table it_sperr.
wa_sperr-tabname = 'MARA'.
wa_sperr-fieldname = 'EAN11'.
insert wa_sperr into table it_sperr.
* Achtung nur zum Test MARA !!!!!!
wa_table = 'MARA'.
* Tabellendefinition der MARA holen
CALL FUNCTION 'DDIF_FIELDINFO_GET'
EXPORTING
tabname = wa_table
* FIELDNAME = ' '
* LANGU = SY-LANGU
* LFIELDNAME = ' '
* ALL_TYPES = ' '
* GROUP_NAMES = ' '
* UCLEN = UCLEN
* IMPORTING
* X030L_WA = X030L_WA
* DDOBJTYPE = DDOBJTYPE
* DFIES_WA = DFIES_WA
* LINES_DESCR = LINES_DESCR
TABLES
dfies_tab = it_dfies
* FIXED_VALUES = FIXED_VALUES
EXCEPTIONS
not_found = 1
internal_error = 2
OTHERS = 3.
IF sy-subrc ne 0.
* dann ist eh schon alles zu spät
EXIT.
ENDIF.
clear it_set_field.
* Hier simulieren wir eine Änderung :
* irgend einen MARA satz einlesen Höhe / EAN11 ändern und
* wegschreiben
select single * from mara
into wa_mara_old.
wa_mara_new = wa_mara_old.
* Einfach eine Änderung
wa_mara_new-hoehe = wa_mara_old-hoehe + '0.5'.
wa_mara_new-ean11 = '1111'.
* Jetzt Feld für Feld prüfen
loop at it_dfies assigning <fs_dfies>.
* Keine Schlüssel !! verändern
if <fs_dfies>-keyflag = 'X'. continue. endif.
* bist Du Feld in Sperrtabelle ?
read table it_sperr assigning <fs_sperr>
with key tabname = <fs_dfies>-tabname
fieldname = <fs_dfies>-fieldname
binary search.
* Falls nicht -> kein Update !
if sy-subrc ne 0. continue. endif.
* Falls sperr = 'X'. auch nicht
if <fs_sperr>-sperr = 'X'. continue. endif.
* Jetzt noch prüfen neu <-> alt
assign component <fs_dfies>-fieldname of
structure wa_mara_new to <fs_new>.
* Darf zwar nicht vorkommen aber !?
if sy-subrc ne 0. continue. endif.
assign component <fs_dfies>-fieldname of
structure wa_mara_old to <fs_old>.
* Darf zwar nicht vorkommen aber !?
if sy-subrc ne 0. continue. endif.
* Alt = Neu -> nichts tun
if <fs_new> = <fs_old>. continue. endif.
* Sonst baue die "Set Bedingung auf
* Zuerst Prüfung was ist das für ein Feld P/I/F
if <fs_dfies>-inttype ca 'PIF'.
* diesen müssen wir aufbereiten
fieldvalue_num = <fs_new>.
shift fieldvalue_num left deleting leading space.
concatenate '''' fieldvalue_num '''' into fieldvalue.
* Sonst direkt den Wert
else.
concatenate '''' <fs_new> '''' into fieldvalue.
endif.
concatenate <fs_dfies>-fieldname '=' fieldvalue into set_field
separated by space.
append set_field to it_set_field.
* so jetzt ist das Set-statement in der Tabelle
endloop.
* Alle Felder fertig und set_tabelle nicht leer -> dann update
* Die Where Bedingung könnte natürlich auch dynamisch sein
* aber das tue ich mir jetzt nicht an :-)
if not it_set_field is initial.
update (wa_table) SET (it_set_field)
where matnr = wa_mara_new-matnr.
endif.
endform.