Interne Tabelle dynamisch erzeugen

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
14 Beiträge • Seite 1 von 1
14 Beiträge Seite 1 von 1

Interne Tabelle dynamisch erzeugen

Beitrag von slsg27 (ForumUser / 6 / 0 / 0 ) »
Hallo alle.
Ich habe folgendes problem beim dynamischen erzeugen einer Tabelle im Release 4.6 C :

Ich benutze die Methode cl_alv_table_create=>create_dynamic_table um eine interne Tabelle zur Laufzeit zu deklarieren. Diese interne Tabelle hat aber bei DB-Tabellen in denen gepackte Felder sind nicht die gleiche Länge (in Byte) wie die DB-Tabelle. Hat jemand einen Tipp ? Oder gibt es die Möglichkeit sich eine interne Tabelle anders zu erzeugen ?

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


Beitrag von Jan (Site Admin / 188 / 13 / 14 ) »
Hi sl
Diese interne Tabelle hat aber bei DB-Tabellen in denen gepackte Felder sind nicht die gleiche Länge (in Byte) wie die DB-Tabelle
sorry aber ich verstehe den zusammenhang net ganz. warum nimmst du nicht eine struktur der db-tabelle???

In diesem Forum gab es schon mal eine ähnliche frage. vielleicht hilft dir das weiter.
http://www.abapforum.com/viewtopic.php?t=82

Mfg Jan

Interne Tabelle dynamisch erzeugen

Beitrag von slsg27 (ForumUser / 6 / 0 / 0 ) »
Hallo Jan

der Name der Tabelle steht erst zur Laufzeit zur Verfügung. Ich weiss also beim Programmstart nicht welche Struktur ich benötige. Der vorherige Beitrag den Du ansprichst endet damit das auf die Methode cl_alv_table_create=>create_dynamic_table verwiesen wird. Die interne Tabelle die dort zurückgeliefert wird ist zum Löschen und Ändern von DB-Tabelleneinträgen zu gebrauchen. Beim Insert gibt es aber einen Kurzdump.

Beitrag von Steff (Site Admin / 386 / 0 / 1 ) »
Hallo,

könntest Du ein paar Infos über den Kurzdump 'reinposten', vielleicht kommt man damit einer Lösung näher. Denn wenn die dynamische Tabelle für einen zum ändern verwendet werden kann, sollte eigentlich auch ein insert möglich sein. Interessieren würde mich auch, wie Du in Deinem Coding den insert machst.

Gruß,
Steff

Interne Tabelle dynamisch erzeugen

Beitrag von slsg27 (ForumUser / 6 / 0 / 0 ) »
Hallo, hier ein Auszug meines Quelltextes und des Kurzdumps

Code: Alles auswählen.

* gs_tabinfo-tabname enthält den Namen der DB-Tabelle
* in meinem Falle 'MARA'
* <g_tab> enthält Sätze aus dieser Tabelle.
* Der Select funktioniert fehlerfrei !
 ........
      SELECT             (gt_fieldlist)
             FROM        (gs_tabinfo-tabname)
             INTO TABLE  <g_tab>
             WHERE       (gt_sel_matnr)
            .
 ........

    .......
          DELETE (gs_tabinfo-tabname) FROM TABLE <g_tab>.
    .......
          INSERT (gs_tabinfo-tabname) FROM TABLE <g_tab>.
    .......
          UPDATE (gs_tabinfo-tabname) FROM TABLE <g_tab>.
    .......

* DELETE und UPDATE funktionieren ohne Probleme
* INSERT verursacht folgenden Kurzdump:
---------------------------------------------------------------------------------
SAPSQL_ARRAY_TAB_TOO_SMALL


Fehleranalyse

Bei einer Open SQL-Array-Operation muß die interne Tabelle, in der die
Werte für die Array-Operation übergeben werden, mindestens so breit
sein wie die Datenbanktabelle, auf die mit der Array-Operation
zugegriffen wird.

Im vorliegenden Fall hat die Datenbanktabelle eine Breite von 1004 Bytes,
die interne Tabelle dagegen ist nur 1002 Bytes breit.
---------------------------------------------------------------------------------

Irgendwelche Ideen ?
Slsg27

Beitrag von Steff (Site Admin / 386 / 0 / 1 ) »
Hallo,

probier es mal mit modify, damit können ebenfalls Sätze in eine Datenbank eingefügt werden. Möglicherweise funktioniert das.
Falls nicht, dann kannst Du immer noch folgendes ausprobieren:

Code: Alles auswählen.

data: ws_mara type ref to data.
field-symbols: <lf_mara> type any.

create data ws_mara type ( gs_tabinfo-tabname ).   "Hier steht 'MARA'
assign ws_mara->* to <lf_mara>.

loop at <g_tab> into <lf_mara>.
* Hier den insert ausführen
endloop.
Letzere Lösung ist zwar umständlicher und laufzeitintensiver, müßte aber wenigstens funktionieren. Wenn es lediglich wenige Sätze sind, die eingefügt werden müssen in MARA, dann dürfte die Laufzeit in diesem Fall eher eine untergeordnete Rolle spielen.
Ob es funktioniert würde mich sehr interessieren. Wäre nett, wenn Du Bescheid geben könntest, wie Du's gelöst hast. :D

Gruß,
Steff

Interne Tabelle dynamisch erzeugen

Beitrag von slsg27 (ForumUser / 6 / 0 / 0 ) »
Hallo Steff

Modify funktioniert leider auch nicht.
Deinen 2. Lösungsansatz hatte ich auch schon probiert. Dann enthalten die Felder des Arbeitsbereiches leider nur Müll. Ausserdem wird die Anzahl der Änderungen bei ca. 5.000.000 liegen, so dass ich nicht für jeden einzelnen Satz einen DB- Zugriff machen möchte. Das Programm wird trotz RFC Funktionsbaustein eh mehrere Tage laufen.

Beitrag von Steff (Site Admin / 386 / 0 / 1 ) »
Ok, ich überleg mir was anderes :-)

Beitrag von Steff (Site Admin / 386 / 0 / 1 ) »
Hallo,

hab'n bisschen überlegt und hätte noch etwas anzubieten:

Code: Alles auswählen.

CALL FUNCTION 'DDIF_NAMETAB_GET'
     EXPORTING
          TABNAME     = 'MARA'
*         ALL_TYPES   = ' '
*         LFIELDNAME  = ' '
*         GROUP_NAMES = ' '
*    IMPORTING
*         X030L_WA    =
*         DTELINFO_WA =
*         TTYPINFO_WA =
*         DDOBJTYPE   =
*         DFIES_WA    =
     TABLES
*         X031L_TAB   =
          DFIES_TAB   = lt_dfies.
*    EXCEPTIONS
*         NOT_FOUND   = 1
*         OTHERS      = 2
          .
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

loop at lt_dfies into ls_dfies.
  if ls_dfies-inttype eq 'P'.
      ls_fieldcatalog-DATATYPE = 'QUAN'.
      ls_fieldcatalog-INTTYPE = ls_dfies-inttype.
      ls_fieldcatalog-INTLEN = ls_dfies-intlen.
      ls_fieldcatalog-DECIMALS = ls_dfies-decimals.
  else.
  ls_fieldcatalog-ref_table = ls_dfies-TABNAME.
  ls_fieldcatalog-ref_field = ls_dfies-FIELDNAME.
  endif.

  ls_fieldcatalog-FIELDNAME  = ls_dfies-fieldname.
  append ls_fieldcatalog to lt_fieldcatalog.
endloop.


CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
  EXPORTING
    IT_FIELDCATALOG = lt_fieldcatalog
   IMPORTING
     EP_TABLE        = my_table
    .
Interessant ist eigentlich nur, dass man im Falle des Datentyps 'P' die Felder 'ref_table' und 'ref_field' des Feldkatalogs (der an die ALV-Klasse übergeben wird) nicht füllt, sondern stattdessen Datentyp 'QUAN' benutzt und inttype, intlen und decimals aus Tabelle DFIES verwendet. Damit hat es bei mir zumindest funktioniert.

Daher würde ich empfehlen: Einfach ausprobieren mit ein paar Tablleneinträgen und prüfen, ob die Mengenfelder (bzw. P-Felder) korrekt in MARA eingetragen werden. Würde mich über Feedback freuen. :wink:

Gruß,
Steff

Hmm, sowas...

Beitrag von Haubi (Expert / 625 / 20 / 30 ) »
Hi Steff.

Das hatten wir eigentlich schon ausprobiert (ich bin ein Kollege von slsg27) und das hat nicht gefunzt. Aber wir robieren das mal. Wir haben inzwischen schon einen Workaround gefunden, aber hübsch ist das nicht. Letztendlich werden da nämlich die Tabellen doch wieder statisch angelegt...

Gruss,
Haubi
Das ABAP Kochbuch ab sofort bei Amazon...

I'd rather write code that writes code than write code...

...und gleich nochmal

Beitrag von Haubi (Expert / 625 / 20 / 30 ) »
slsg27 hat dat jetzt ausprobiert, aber die Tabellenzeilen sind noch kürzer. D.h. wir haben noch eine Dumpmachine erzeugt. :?

Tja, ausser Spesen nix gewesen. Dynamische Tabellen scheinen unter 46C nur für die Anzeige im ALV oder in Auswerte-Reports zu taugen. DB-Updates Fehlanzeige. Somit beginnt das Warten auf 610 im Projekt... :wink:

Gruss,
Haubi + slsg27
Das ABAP Kochbuch ab sofort bei Amazon...

I'd rather write code that writes code than write code...

Beitrag von Steff (Site Admin / 386 / 0 / 1 ) »
Hallo,

seltsam, bei mir hat es funktioniert. Im ersten Fall hatte ich lediglich im Feldkatalog jeweils ref_tab und ref_field gefüllt und dann damit versucht, einen Eintrag in der MARA zu erzeugen. Dabei kam es dann bei mir zu demselben Kurzdump, wie Ihr oben geschildert habt.

Nachdem ich dann aber umgestellt hatte (für die P-Felder) und ref_tab und ref_field nicht mehr gefüllt habe, sondern bei P-Feldern eben nur noch 'DATATYPE', 'INTTYPE', 'INTLEN' und 'DECIMALS' hat es dann mit diesem einen Satz funktioniert (Kurzdump blieb aus), d.h. MARA wurde ordentlich upgedatet. Der Witz dabei: Ich bin auf Rel. 46B. :?

Habt Ihr zufällig ein Testprogramm geschrieben? Das einzige was ich noch anbieten könnte wäre, den Report bei mir mal reinzuhängen und zu testen. Einfach per email an webmaster@abapforum.com.

Gruß,
Steff

Beitrag von black_adept (Top Expert / 3946 / 105 / 886 ) »
@slsg27 und Haubi:

leider sehe ich keine emailaddy von euch und wer weiß ob ihr "Private Messages" lest - ich tu es jedenfalls nicht.

Ich hab hier ein relativ einfaches coding rumliegen, mit dem man zumindest in der von mir getesteten Tabelle Einträge einfügen kann:

addy: stefan@schmoecker.de


Nachtrag. Ich vergass den Releasestand: 4.6c
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Beitrag von Wolfgang G. Propfe (ForumUser / 23 / 0 / 0 ) »
Hi guys:
I have good and bad news. The good news is, you can use CREATE DATA with a reference to an itab to create an internal table. The bad news is, that the class method to create a table boils down to a subroutine pool.

Either way, it does not help much. You do not have a prototype of an internal table available to do the stuff you need to do.

However:
Think about creating a 'container table' of 8Kb width (or whatever you need). You can overlay the structure you need via field-symbols or temp structures, then update the DB from the table. It discards excess bytes anyway. To be more flexible, you can do what SAP does in SLG1 (application log): Define various containers, say 8Kb, 16Kb, 32KB and 64Kb. Then determine which size you need and point to that. The other (empty) tables don't use up too much space.

Additional hint:
If you cannot use a 'clean' structure, you may have to consider the alignment. Typically declaring a type F variable before the structure does the trick.

Regards,
Wolfgang

Seite 1 von 1

Vergleichbare Themen

8
Antw.
1037
Views
Interne Tabelle dynamisch erzeugen
von Der Formulator » 21.10.2021 09:30 • Verfasst in ABAP® Core
12
Antw.
2601
Views
Interne Tabelle Dynamisch einfuhlen
von autohandel7 » 22.01.2016 13:14 • Verfasst in ABAP® für Anfänger
3
Antw.
3287
Views
Interne Tabelle dynamisch füllen
von stas » 27.10.2007 10:41 • Verfasst in ABAP® Core
12
Antw.
7689
Views
dynamisch interne Tabelle füllen
von LittleT » 03.04.2007 15:27 • Verfasst in ABAP® für Anfänger
8
Antw.
5176
Views
Interne Tabelle dynamisch generieren
von inab » 22.10.2008 10:19 • Verfasst in ABAP Objects®

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.