Gefüllte dynamische Tabelle um Spalten erweitern

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

Gefüllte dynamische Tabelle um Spalten erweitern

Beitrag von km216 (Specialist / 151 / 6 / 11 ) »
Hallo,

wer in dem anderen Thread geschaut hat, wird schon in etwa wissen, worum es geht..
Da es nun aber nicht mehr zum Thema passt, gibt es halt einen neuen Thread.

Dank adt habe ich es geschafft, eine Tabelle vollkommen dynamisch zu erstellen und mit Daten zu füllen.
Ich habe da jedoch ein Problem, dass ich am Anfang noch nicht weiß, wie die Tabelle am Ende aussehen soll (daher auch die dynamische Erzeugung).

Ich baue mir also einen Teil der Tabelle auf und lade Daten aus EINA/EINE rein. Anhand dieser Daten will ich dann nach Konditionen suchen und meine dynamische Tabelle um Spalten für die gefunden Konditionsarten mit Werten und Name der Konditionstabelle erweitern.

Da hängts jedoch bei mir, ich schaffe es nicht, meine dynamische Tabelle nachträglich um Spalten zu erweitern.
Ist dies überhaupt möglich? Habe auch schon versucht, mir eine weitere Tabelle mit mehr Spalten leer aufzubauen und dann die Daten rüberzukopieren, lief auch nicht :/

Anbei mal die wichtigsten Code-Zeilen mit Kommentaren:

Datendeklaration:

Code: Alles auswählen.

*----------------------------------------------------------------------*
*       T A B L E S
*----------------------------------------------------------------------*
TABLES: eina, "Einkaufsinfosatz - allgemeine Daten
        eine, "Einkaufsinfosatz - Einkaufsorganisationsdaten
        konh. "Konditionen (Kopf)

DATA: l_typedescr_ref     TYPE REF TO cl_abap_typedescr,
      l_strucdescr_ref    TYPE REF TO cl_abap_structdescr,
      l_tabledescr_ref    TYPE REF TO cl_abap_tabledescr,
      it_components       TYPE cl_abap_structdescr=>component_table,
      it_components_help  TYPE cl_abap_structdescr=>component_table,
      wa_components       LIKE LINE OF it_components,
      l_data_ref          TYPE REF TO data,
      l_data_help_ref     TYPE REF TO data.

*----------------------------------------------------------------------*
*         F I E L D - S Y M B O L S
*----------------------------------------------------------------------*

* Field-Symbols for dynamic table
FIELD-SYMBOLS: <fs_components>  LIKE LINE OF it_components,
               <fs_data>        TYPE STANDARD TABLE,
               <fs_data_help>   TYPE STANDARD TABLE,
               <fs_datensatz>   TYPE ANY,
               <fs_daten>       TYPE ANY.
Erstellung der ersten dynamischen Tabelle:

Code: Alles auswählen.

  "Strukturbeschreibung abfragen
  l_typedescr_ref = cl_abap_typedescr=>describe_by_name( 'EINA' ).

  "Strukturbeschreibung casten
  l_strucdescr_ref ?= l_typedescr_ref.

  "Komponenten der Struktur in interner Tabelle speichern
  it_components = l_strucdescr_ref->get_components( ).

  l_typedescr_ref = cl_abap_typedescr=>describe_by_name( 'EINE' ).
  l_strucdescr_ref ?= l_typedescr_ref.
  it_components_help = l_strucdescr_ref->get_components( ).

"Felder aus EINA/EINE zusammenfügen
  LOOP AT it_components_help INTO wa_components.
"MANDT/INFNR wäre sonst doppelt, ebenso gibt es ein Append in der EINE-Struktur, was ein leeren Feldnamen in it_components zur Folge hat
    IF wa_components-name IS NOT INITIAL AND wa_components-name NE 'MANDT' AND wa_components-name NE 'INFNR'.
      APPEND wa_components TO it_components.
    ENDIF.
  ENDLOOP.

  TRY.
      CALL METHOD cl_abap_structdescr=>create
        EXPORTING
          p_components = it_components
*    p_strict     = TRUE
        RECEIVING
          p_result     = l_strucdescr_ref
          .
    CATCH cx_sy_struct_creation .
  ENDTRY.

  TRY.
      CALL METHOD cl_abap_tabledescr=>create
        EXPORTING
          p_line_type  = l_strucdescr_ref
*    p_table_kind = TABLEKIND_STD
*    p_unique     = ABAP_FALSE
*    p_key        =
*    p_key_kind   = KEYDEFKIND_DEFAULT
        RECEIVING
          p_result     = l_tabledescr_ref
          .
    CATCH cx_sy_table_creation .
  ENDTRY.

  CREATE DATA l_data_ref TYPE HANDLE l_tabledescr_ref.
  ASSIGN l_data_ref->* TO <fs_data>.

Tabelle füllen:

Code: Alles auswählen.

  SELECT *
  FROM eina AS a
    INNER JOIN eine AS b ON a~infnr = b~infnr
    INTO CORRESPONDING FIELDS OF TABLE <fs_data>
  WHERE lifnr = '0000000001'.
Bis dahin ist alles kein Problem... Nun habe ich versucht, die Tabelle zu erweitern, testweise um eine weitere EINE-Struktur, nur um zu wissen, wie es geht:

Code: Alles auswählen.

 LOOP AT it_components_help INTO wa_components.
   if wa_components-name is not initial.
     APPEND wa_components TO it_components.
   endif.
  ENDLOOP.

  l_typedescr_ref = cl_abap_tabledescr=>describe_by_data( it_components ).
  l_strucdescr_ref ?= l_typedescr_ref. "<- hier kommts zum Dump "MOVE_CAST_ERROR"
Ändere ich die letzte 2 Zeilen wie folgt:

Code: Alles auswählen.

  l_typedescr_ref = cl_abap_tabledescr=>describe_by_NAME( 'EINE' ).
  l_strucdescr_ref ?= l_typedescr_ref.
Kommt es nicht zum Dump, es tritt jedoch bei folgendem Code danach eine Ausnahme auf:

Code: Alles auswählen.

ALL METHOD cl_abap_structdescr=>create
        EXPORTING
          p_components = it_components
*    p_strict     = TRUE
        RECEIVING
          p_result     = l_strucdescr_ref
          .
Ausnahmeklasse: CX_SY_STRUCT_NAME, Text: Fehler in der Spezifikation des Komponentennames der Komponente 0.

Was mache ich da falsch? :(
Hatte gehofft, die Tabelle zu erweitern, selbst wenn diese bereits gefüllt ist, wäre einfacher... Gibts da eine andere/einfachere Methode?
Weil so wie ich es vorhabe, muss ich mir ja eine Hilfstabelle erstellen, dort die Daten reinkopieren, damit ich meine erste Tabelle mit der neuen Struktur neu erstellen kann. Dabei würde ich einen Haufen Daten hin und herschieben.

Ich hoffe, mir kann da jemand einen Tip zu geben :-)

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


Re: Gefüllte dynamische Tabelle um Spalten erweitern

Beitrag von black_adept (Top Expert / 4066 / 120 / 933 ) »
Hallo km216,

schau mal hier - vielleicht reicht dir das ja schon.

Und ja - ich glaube schon, dass deine vorgeschlagene Vorgehensweise "neue Tab. anlegen, Daten reinkopieren, neue Tabe zurückgeben" der korrekte Weg ist
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Gefüllte dynamische Tabelle um Spalten erweitern

Beitrag von km216 (Specialist / 151 / 6 / 11 ) »
Hi Stefan,

das sieht schon einmal sehr gut aus, vielen Dank :-)
Ich mache mir momentan noch Gedanken, wie ich für meinen Fall die Struktur vorher soweit rausbekomme, dass ich die dynamische Tabelle nur einmal erstellen muss.

Wenn ich da eine praktikable Lösung finde, lasse ich es euch wissen.

gruß
Kevin

Re: Gefüllte dynamische Tabelle um Spalten erweitern

Beitrag von Orestes (ForumUser / 9 / 3 / 0 ) »
Da ich nun vor derselben Herausforderung stehe, wollte ich mich bei dir erkundigen, ob du eine funktionierende (und verständliche) Lösung gefunden hast!

Re: Gefüllte dynamische Tabelle um Spalten erweitern

Beitrag von km216 (Specialist / 151 / 6 / 11 ) »
Hallo Orestes,

ich werde wahrscheinlich mit einer anderen Struktur arbeiten, sodass ich die Tabelle nicht in den Spalten um die zusätzlichen Konditionen erweitere, sondern jeweils eine neue Zeile einfüge. Dadurch erspar ich mir das nachträgliche Erweitern.

Wie black_adept schon geschrieben hat, müsste man sich sonst wohl die Daten immer hin und herkopieren, was auch einiges an Aufwand bedeutet.

gruß

Re: Gefüllte dynamische Tabelle um Spalten erweitern

Beitrag von Orestes (ForumUser / 9 / 3 / 0 ) »
Hallo,

danke für die Auskunft. Dann werde ich mir wohl weiter Gedanken machen müssen. :x

Viele Grüße

Re: Gefüllte dynamische Tabelle um Spalten erweitern

Beitrag von a-dead-trousers (Top Expert / 4370 / 222 / 1174 ) »
Eine Möglichkeit um sich das mit dem Kopieren zu ersparen, wäre es sich schon von Anfang an eine Struktur (RTTC) zu erstellen, die die maximal benötigten Spalten bereitstellt.

lg ADT
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Gefüllte dynamische Tabelle um Spalten erweitern

Beitrag von km216 (Specialist / 151 / 6 / 11 ) »
Hi adt,

klar wäre das eine Möglichkeit, dann würde meine SQL-Abfrage aber extrem komplex und ich weiß nicht, ob die so machbar wäre.
Weil ich entweder eine SQL-Abfrage brauche um direkt an alle Daten zu komme oder vorselektiere auf EINA/EINE-Daten und danach die Konditionen abfrage. Dann weiß ich aber beim ersten Mal, wo ich die Tabelle brauche noch nicht, wieviele Konditionen es gibt und wieviele zusätzlichen Spalten benötigt werden.
Wenn ich 5-6 Felder aus der Konditionstabelle PRO bestehender Kondition, egal ob EK-Org, Lieferanten oder Infosatzabhängig in der gleichen Zeile haben will, würde meine Tabelle gegebenenfalls auch einfach viel zu breit werden.

Ich werde daher den Umweg nehmen, mir nur die 5-6 Spalten am Anfang dranzuklatschen und dann für jede Kondition eine neue Zeile einzufügen, ist bei meiner Anforderung wahrscheinlich der einfachere Weg.

gruß

Re: Gefüllte dynamische Tabelle um Spalten erweitern

Beitrag von a-dead-trousers (Top Expert / 4370 / 222 / 1174 ) »
ja, okay!

Wollte nur anmerken, das es durchaus geht. Nicht, dass jemand anderes der das hier ließt gleich entmutigt aufgibt ;)

lg
ADT
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Gefüllte dynamische Tabelle um Spalten erweitern

Beitrag von km216 (Specialist / 151 / 6 / 11 ) »
Gehen tut ja fast alles, ist immer nur eine Frage des Aufwands ;)

Ich mein, ich kann mir auch am Anfang eine Struktur mit den Felder EINA/EINE erstellen diese füllen.
Dann selektier ich mir in eine andere Tabelle die Konditionen, schau, zu welchem Satz EINA/EINE-Daten die meisten Konditionen vorhanden sind und erstelle mir dann eine neue Struktur, mit EINA/EINE + Felder für die Daten, die ich zu den Konditionen brauch * der maximalen Anzahl.
Da könnte ich dann die EINA/EINE-Daten reinkopieren und die Konditionsdaten hinzuklatschen bzw. nachselektieren.
Gibt dann nur mindestens 130 bis 200 Spalten und ist einiges an Arbeit, daher tendiere ich doch zu der einfacheren Alternativlösung ;)

gruß

Re: Gefüllte dynamische Tabelle um Spalten erweitern

Beitrag von km216 (Specialist / 151 / 6 / 11 ) »
Hallo,

sitze inzwischen wieder an dieser Anforderung, die nun etwas erweitert wurde und fühle mich gerade etwas überfordert.

Hintergrund ist folgender:
Die heruntergeladenen Einkaufsinfosatzdaten und Konditionen sollen nach einer Änderung wieder nach SAP importiert werden.
Jedoch ist vorher nicht klar, welche Spalten sich der Anwender anzeigen und demnach auch runterläd.
Auch die Reihenfolge der Spalten kann sich natürlich verändern.

-> Wie bekomme ich dann beim Import meine Daten in eine ordentliche Struktur?
Ich könnte über "cl_abap_typedescr=>DESCRIBE_BY_NAME" mir da etwas zusammenbasteln, aber:
Angezeigt werden, und damit heruntergeladen, soll nicht der technische Feldname, sondern die Bezeichnung. Also nicht KONH-DATAB, sondern "gültig ab".

Kann ich mir daraus auch irgendwie eine interne Struktur zusammenbasteln?
Oder muss ich den Anwendern eine feste Struktur vorgeben, welche diese beim Download einhalten müssen, also sowohl welche Spalten und auch welche Reihenfolge?
Das wird denen halt überhaupt nicht passen...

Edit:
Ich hab mir da eine Lösung überlegt und hätte gerne eure Meinung, ob diese zielführend sein kann:

Beim Download der Datensätze werden Bezeichnung UND techn. Name, also z.B. EINA-MANDT, als Überschrift ausgegeben.
Ich mache den Anwendern die Vorgabe, dass der technische Name zwingend in der Upload-Datei enthalten sein muss.
Daraufhin kann ich diesen auslesen, über RTTI den Typ bestimmen, mir mittels RTTC die interne Tabelle zusammenhauen und die tatsächlichen Daten dort hineinschreiben und damit weiterarbeiten.

Wäre dies soweit möglich/sinnvoll?

Ein Problem fällt mir direkt auf:
Ich benötige eine 2-zeilige Überschrift innerhalb des ALV / SALV. Ist dies möglich?

Seite 1 von 1

Vergleichbare Themen

7
Antw.
1424
Views
interne Tabelle dynamisch mit Spalten erweitern
von JM1804_ABAP » 06.06.2023 17:23 • Verfasst in ABAP® für Anfänger
6
Antw.
1812
Views
MD04 Tabelle mit neuen Spalten erweitern
von BecomingAnAbapGuru » 24.02.2022 19:44 • Verfasst in ABAP® für Anfänger
1
Antw.
2725
Views
Dynamische Spalten einer Tabelle
von toto » 22.12.2005 10:18 • Verfasst in ABAP® Core
8
Antw.
372
Views
Die gefüllte interne Tabelle an Form als parameter weitergeben.
von HH_ABAP » 25.04.2023 12:04 • Verfasst in ABAP® für Anfänger
2
Antw.
2652
Views
Workflow zu TS00008074 um Spalten erweitern
von Alexander D. » 25.04.2014 14:23 • Verfasst in Basis

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.