Interne Tabelle dynamisch erzeugen

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV

Interne Tabelle dynamisch erzeugen

Postby Sofie4407 » Mon Jan 20, 2003 12:47 pm

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 ?
Sofie4407
.
.
 
Posts: 6
Joined: Mon Jan 20, 2003 12:47 pm

Postby Jarne2165 » Mon Jan 20, 2003 2:57 pm

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
Jarne2165
..
..
 
Posts: 42
Joined: Mon Dec 02, 2002 1:25 pm

Interne Tabelle dynamisch erzeugen

Postby Sofie4407 » Mon Jan 20, 2003 5:02 pm

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.
Sofie4407
.
.
 
Posts: 6
Joined: Mon Jan 20, 2003 12:47 pm

Postby Walter4536 » Mon Jan 20, 2003 5:48 pm

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
Walter4536
...
...
 
Posts: 315
Joined: Mon Dec 02, 2002 12:09 pm

Interne Tabelle dynamisch erzeugen

Postby Sofie4407 » Tue Jan 21, 2003 9:29 am

Hallo, hier ein Auszug meines Quelltextes und des Kurzdumps
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. * gs_tabinfo-tabname enthält den Namen der DB-Tabelle
  2. * in meinem Falle 'MARA'
  3. * <g_tab> enthält Sätze aus dieser Tabelle.
  4. * Der Select funktioniert fehlerfrei !
  5.  ........
  6.       SELECT             &#40;gt_fieldlist&#41;
  7.              FROM        &#40;gs_tabinfo-tabname&#41;
  8.              INTO TABLE  <g_tab>
  9.              WHERE       &#40;gt_sel_matnr&#41;
  10.             .
  11.  ........
  12.  
  13.     .......
  14.           DELETE &#40;gs_tabinfo-tabname&#41; FROM TABLE <g_tab>.
  15.     .......
  16.           INSERT &#40;gs_tabinfo-tabname&#41; FROM TABLE <g_tab>.
  17.     .......
  18.           UPDATE &#40;gs_tabinfo-tabname&#41; FROM TABLE <g_tab>.
  19.     .......
  20.  
  21. * DELETE und UPDATE funktionieren ohne Probleme
  22. * INSERT verursacht folgenden Kurzdump:
  23.  
GeSHi ©

---------------------------------------------------------------------------------
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
Sofie4407
.
.
 
Posts: 6
Joined: Mon Jan 20, 2003 12:47 pm

Postby Walter4536 » Tue Jan 21, 2003 10:38 am

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: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. data: ws_mara type ref to data.
  2. field-symbols: <lf_mara> type any.
  3.  
  4. create data ws_mara type &#40; gs_tabinfo-tabname &#41;.   "Hier steht 'MARA'
  5. assign ws_mara->* to <lf_mara>.
  6.  
  7. loop at <g_tab> into <lf_mara>.
  8. * Hier den insert ausführen
  9.  
GeSHi ©


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
Walter4536
...
...
 
Posts: 315
Joined: Mon Dec 02, 2002 12:09 pm

Interne Tabelle dynamisch erzeugen

Postby Sofie4407 » Tue Jan 21, 2003 11:26 am

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.
Sofie4407
.
.
 
Posts: 6
Joined: Mon Jan 20, 2003 12:47 pm

Postby Walter4536 » Tue Jan 21, 2003 11:27 am

Ok, ich überleg mir was anderes :-)
Walter4536
...
...
 
Posts: 315
Joined: Mon Dec 02, 2002 12:09 pm

Postby Walter4536 » Wed Jan 22, 2003 12:27 pm

Hallo,

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

Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. CALL FUNCTION 'DDIF_NAMETAB_GET'
  2.      EXPORTING
  3.           TABNAME     = 'MARA'
  4. *         ALL_TYPES   = ' '
  5. *         LFIELDNAME  = ' '
  6. *         GROUP_NAMES = ' '
  7. *    IMPORTING
  8. *         X030L_WA    =
  9. *         DTELINFO_WA =
  10. *         TTYPINFO_WA =
  11. *         DDOBJTYPE   =
  12. *         DFIES_WA    =
  13.      TABLES
  14. *         X031L_TAB   =
  15.           DFIES_TAB   = lt_dfies.
  16. *    EXCEPTIONS
  17. *         NOT_FOUND   = 1
  18. *         OTHERS      = 2
  19.           .
  20. IF SY-SUBRC <> 0.
  21. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
  22. *         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  23.  
  24. loop at lt_dfies into ls_dfies.
  25.   if ls_dfies-inttype eq 'P'.
  26.       ls_fieldcatalog-DATATYPE = 'QUAN'.
  27.       ls_fieldcatalog-INTTYPE = ls_dfies-inttype.
  28.       ls_fieldcatalog-INTLEN = ls_dfies-intlen.
  29.       ls_fieldcatalog-DECIMALS = ls_dfies-decimals.
  30.   else.
  31.   ls_fieldcatalog-ref_table = ls_dfies-TABNAME.
  32.   ls_fieldcatalog-ref_field = ls_dfies-FIELDNAME.
  33.   endif.
  34.  
  35.   ls_fieldcatalog-FIELDNAME  = ls_dfies-fieldname.
  36.   append ls_fieldcatalog to lt_fieldcatalog.
  37.  
  38.  
  39. CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
  40.   EXPORTING
  41.     IT_FIELDCATALOG = lt_fieldcatalog
  42.    IMPORTING
  43.      EP_TABLE        = my_table
  44.     .
  45.  
GeSHi ©


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
Walter4536
...
...
 
Posts: 315
Joined: Mon Dec 02, 2002 12:09 pm

Hmm, sowas...

Postby Edin1867 » Wed Jan 22, 2003 2:04 pm

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
Edin1867
...
...
 
Posts: 406
Joined: Wed Dec 18, 2002 11:50 am

Next

Return to ABAP® Core

Who is online

Users browsing this forum: No registered users and 4 guests

cron