Dynamische Update Anweisung

Getting started ... Alles für einen gelungenen Start.
3 Beiträge • Seite 1 von 1
3 Beiträge Seite 1 von 1

Dynamische Update Anweisung

Beitrag von jondahl11 (ForumUser / 79 / 0 / 0 ) »
Hallo,

ich habe folgendes Problem.
Ich möchte eine Tabelle mittels UPDATE Anweisung aktualisieren. Die aktuellen Daten stehen in einer Workarea gleicher Sturktur. Demnach sieht der Code so aus

Code: Alles auswählen.

 Update db_auto from wa_auto 
Nun möchte ich aber nur bestimmte Spalten aktualiseren. Dafür würde ich die SET Anweisung hinter Update verwenden. Allerdings gibt es eine weitere Tabelle in die bestimmte Felder stehen die zu schützen sind. Dort stehen jedoch nicht nur die Felder dieser Tabelle, sondern mehrerer Tabellen.

Ich müsste zunächst also dort nachschauen welche Felder geschützt sind und alle Felder die nicht geschützt sind per UPDATE aktualisieren. Bei großen Tabellen kann dies aber sehr aufwändig werden wenn ich hier für jedes Feld eine Prüfung schreibe.

Kann mir jemand sagen ob und wie ich dies dynamisch machen kann.

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Beitrag von DoGaS (ForumUser / 36 / 0 / 1 ) »
Hi,

evtl. wäre es günstig sich hier mal mit dem Sperrkonzept von SAP auseinander zu setzen.

Gruß

Beitrag von edwin (Specialist / 302 / 10 / 68 ) »
Hallo,
hier ein kleines Beispiel (SAP ERP2004):

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.
Gruss Edwin

Seite 1 von 1

Vergleichbare Themen

3
Antw.
8457
Views
Dynamische Update Anweisung
von JohnLocklay » 16.01.2018 14:23 • Verfasst in ABAP® Core
2
Antw.
991
Views
Dynamische SELECT-Anweisung
von mareikemei92 » 17.07.2019 19:16 • Verfasst in ABAP® Core
7
Antw.
2892
Views
Dynamische Select-Anweisung
von bliP! » 06.02.2006 13:54 • Verfasst in ABAP® für Anfänger
9
Antw.
9484
Views
DBTab Update from Table oder in Loop mit "Update Set" Oder ?
von RIG » 09.03.2018 11:27 • Verfasst in ABAP® Core
9
Antw.
3502
Views
IF Anweisung
von Mathan » 06.09.2006 13:07 • Verfasst in ABAP® Core

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Unbeantwortete Forenbeiträge

Daten an Tabelle binden
vor 2 Tagen von Bright4.5 1 / 771
aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2392
Hilfe bei SWEC/SWE2
letzen Monat von retsch 1 / 8978