Dynamisches Update

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).
8 Beiträge • Seite 1 von 1
8 Beiträge Seite 1 von 1

Dynamisches Update

Beitrag von fantomas02 (ForumUser / 9 / 0 / 0 ) »
Hallo,

ich schreibe gerade einen ABAP, der im System hinterlegte Drucker umbenamen soll (an allen Stellen, wo der Drucker angegeben ist - also auch Customizing, usw). In einem ersten Schritt gibt der Benutzer den alten und den neuen Druckernamen an, das System sucht daraufhin alle Tabellen, wo dieser Name drin steht und schreibt den Tabellennamen und das entsprechende Feld in dem der Drucker steht in eine interne Tabelle.

Anschließend lasse ich mir eine dynamische interne Tabelle für jede der ermittelten Tabellen aufbauen, in die die zugehörigen Datensätze geschrieben werden.

Aber wie bekomme ich jetzt das Update hin?

Was ich bisher habe:

Code: Alles auswählen.

LOOP AT d_it_gesamt.

  DATA it_fieldcatalog TYPE lvc_t_fcat.
  DATA wa_fcat TYPE lvc_s_fcat.
  DATA wa_fieldcat TYPE lvc_s_fcat.
  DATA: puff_field(30) TYPE c,
        puff_intyp(1) TYPE c,
        puff_ileng(6) TYPE n,
        puff_ddtyp(4) TYPE c,
        puff_oleng(6) TYPE n.

  DATA ep_table TYPE REF TO data.
  DATA: counter1 TYPE i.
  DATA: wa_tab1 TYPE REF TO data.

  FIELD-SYMBOLS: <my_table> TYPE STANDARD TABLE.
  FIELD-SYMBOLS: <wa_tabl2> TYPE ANY.
  FIELD-SYMBOLS: <struct>.
  FIELD-SYMBOLS: <feld>.

  SELECT fieldname inttype intlen datatype leng
    INTO (puff_field, puff_intyp, puff_ileng, puff_ddtyp, puff_oleng)
    FROM dd03l WHERE tabname = d_it_gesamt-tabel
               AND keyflag = 'X'.

    IF counter1 < 99.
      IF NOT puff_field = 'JOBNAME'.
        wa_fcat-fieldname = puff_field.
        wa_fcat-inttype = puff_intyp.
        wa_fcat-intlen = puff_ileng.
        wa_fcat-datatype = puff_ddtyp.
*      wa_fcat-outputlen = puff_oleng.
        APPEND wa_fcat TO it_fieldcatalog.
        counter1 = counter1 + 1.
      ENDIF.
    ENDIF.

  ENDSELECT.

  SELECT SINGLE fieldname inttype intlen datatype leng
  INTO (puff_field, puff_intyp, puff_ileng, puff_ddtyp, puff_oleng)
  FROM dd03l WHERE tabname = d_it_gesamt-tabel
             AND fieldname = d_it_gesamt-field.

  wa_fcat-fieldname = puff_field.
  wa_fcat-inttype = puff_intyp.
  wa_fcat-intlen = puff_ileng.
  wa_fcat-datatype = puff_ddtyp.
  wa_fcat-outputlen = puff_oleng.
  APPEND wa_fcat TO it_fieldcatalog.

  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog           = it_fieldcatalog
    IMPORTING
      ep_table                  = ep_table
    EXCEPTIONS
      generate_subpool_dir_full = 1
      OTHERS                    = 2.

  ASSIGN ep_table->* TO <my_table>.

  CREATE DATA wa_tab1 LIKE LINE OF <my_table>.
  ASSIGN wa_tab1->* TO <wa_tabl2>.

  LOOP AT <my_table> ASSIGNING <struct>.
    LOOP AT it_fieldcatalog INTO wa_fcat.
     ASSIGN COMPONENT wa_fcat-fieldname OF STRUCTURE <struct> TO <feld>.
*       <feld> = '123456'.
*      APPEND <struct> TO <my_table>.
    ENDLOOP.
  ENDLOOP.

  REFRESH d_it_data.

  LOOP AT it_fieldcatalog INTO wa_fieldcat.
    d_zw_data = wa_fieldcat-fieldname.
    APPEND d_zw_data TO d_it_data.
  ENDLOOP.

  SELECT (d_it_data) FROM (d_it_gesamt-tabel)
                     INTO TABLE <my_table>.

  LOOP AT <my_table> INTO <wa_tabl2>.
    WRITE <wa_tabl2>.
    
*    UPDATE ?????

  ENDLOOP.

  REFRESH it_fieldcatalog.
  REFRESH <my_table>.

ENDLOOP.
Ich wollte eigentlich den normalen UPDATE Befehl mit UPDATE (dbtab) FROM wa benutzen, aber da bekomme ich immer einen Dump SAPSQL_WA_TOO_SMALL - wahrscheinlich, weil ich nur die Key-Felder in die Struktur hole - aber ich muss z. B. über die LTAP und die hat 147 Felder, was wohl nicht mit der Methode CL_ALV_TABLE_CREATE funktioniert?

Kann mir jemand weiterhelfen?

Vielen Dank!
Stefan

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


Beitrag von DeathGuardian (Expert / 759 / 0 / 3 ) »
Wie wärs mit "UPDATE (tabname) SET (set_clause) WHERE (where_clause)."?

Beitrag von fantomas02 (ForumUser / 9 / 0 / 0 ) »
Hallo,

funktioniert leider nicht - bei UPDATE (dbtab) ist FROM wa wohl zwingend erforderlich.

Fehler in Struktur

Beitrag von fantomas02 (ForumUser / 9 / 0 / 0 ) »
Hallo,

hab die Aufgabe jetzt mit folgendem Coding lösen können:

Code: Alles auswählen.

      REFRESH d_it_data.

      CONCATENATE d_it_gesamt-field ' = ''' d_it_gesamt-print '''' INTO
                where_clause.
      APPEND where_clause TO d_it_data.

      SELECT * FROM (d_it_gesamt-tabel)
               INTO CORRESPONDING FIELDS OF TABLE <my_table>
               WHERE (d_it_data).

      LOOP AT <my_table> INTO <wa_tabl2>.

        MOVE prin_new TO <wa_tabl2>+count_dd(4).

        UPDATE (d_it_gesamt-tabel) FROM <wa_tabl2>.

        IF NOT ret_sub = 4.
          ret_sub = sy-subrc.
        ENDIF.
      ENDLOOP.
Allerdings ist noch ein Fehler aufgetaucht.

Meine Selektion geht auch auf die Tabelle TBTCP. Allerdings stimmt die Länge der Tabelle nie mit der daraus generierten dynamischen internen Tabelle überein

Beispiel:

TBTCP hat die Länge 1184 Byte

über CL_ALV_TABLE_CREATE erstellte interne Tabelle von TBTCP = 1180 Byte

Hat jemand einen Lösungsansatz für das Problem?

Vielen Dank u. viele Grüße

Beitrag von JDO (ForumUser / 45 / 0 / 3 ) »
Hallo,

da die Differenz 4 ist, könnte es am Feld TBTCP-ACHECK liegen. Die zugehörige Domäne SYST-SHORT vom Typ INT4 hat Länge 10, aber Ausgabelänge 6.

MfG Juergen

Beitrag von fantomas02 (ForumUser / 9 / 0 / 0 ) »
Hi,

ich hab zu dem Thema auch noch mal einen Hinweis bei der SAP eröffnet. Mir kommt es merkwürdig vor, weil in dem Funktionsbaustein, der in der Klasse CL_ALV_TABLE_CREATE aufgerufen wird, alle Datentypen abgefragt werden, der INT4 aber nicht.

Vielleicht kommt das Problem ja daher.

Beitrag von MarkusW (Specialist / 406 / 5 / 0 ) »
Hat die Tabelle zufällig 4 Keyfelder?
Musst die Keyfelder mitgeben, zumindest hatte ich mal so ein ähnliches Problem. Beim dynamischen anlegen der Tabelle hab ich die Keyfelder mit angegeben und scho hats funktioniert 8)

Allerdings hab ich jetzt nicht 100%ig hier alles durchgelesen, kann das mit dem dynamischen bei dir auch verwechseln...
Aber wenn du auch die Tabelle, welche du ansprichst dynamisch erstellst, dann könnte es vllt die Lösung sein mit den Keyfelder.

Gruß
Markus

Beitrag von fantomas02 (ForumUser / 9 / 0 / 0 ) »
Hallo,

sorry, das hat jetzt etwas gedauert :roll:

Hab mittlerweile von der SAP eine Antwort erhalten. Demnach soll wohl die Methode lt. OSS 654306 angepasst werden. Die Änderungen sind anscheindend auch für Release 4.6C durchführbar.

Hab das allerdings nicht ausprobiert, weil ich mittlerweile das Programm umgestellt hab, so dass einfach im Nachgang nochmal ein Update auf die TBTCP gemacht wird (war die einzige Tabelle, wo dieses Problem aufgetreten ist). Das ist zwar keine schöne Lösung, aber funktioniert soweit.

Vielen Dank für Eure Hilfe :D

Seite 1 von 1

Vergleichbare Themen

1
Antw.
1266
Views
Dynamisches Zuweisung
von Handeglo » 30.11.2009 14:15 • Verfasst in ABAP® für Anfänger
2
Antw.
1496
Views
Dynamisches Perform.
von Charly_Brown » 08.12.2005 17:25 • Verfasst in ABAP® Core
2
Antw.
2452
Views
dynamisches TableControl
von Pat » 13.05.2004 14:24 • Verfasst in Dialogprogrammierung
5
Antw.
814
Views
Dynamisches Feldmapping
von Harry_Koeller » 30.08.2019 13:56 • Verfasst in ABAP® für Anfänger
2
Antw.
2363
Views
Dynamisches Selektionsbild
von m.andreschak » 08.09.2011 21:14 • Verfasst in ABAP® für Anfänger

Ü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.