Discussion:
Interne Tabelle dynamisch erzeugen und darauf zugreifen
(zu alt für eine Antwort)
Michael Fritz
2003-10-09 14:30:36 UTC
Permalink
Hi,

ich verwende das folgende Coding um mit eine interne Tabelle dynmisch zur
Laufzeit zu erzeugen.

Dies funktioniert soweit ja recht gut, nur der Zugriff auf die einzelnen
Felder der Tabelle klappt nicht. Konkret wird die Zeile <f_tab_input>-bkorg
= '1000' zurückgewiesen, da es sich bei <f_tab_input> um keine Struktur
handelt.

Wie kann ich dann trotzdem auf die einzelnen Felder zugreifen?

cu,
Michael

*--Makros

DEFINE add_field.

clear wa_tab_input.

wa_tab_input-ref_table = &1. "Tabellennamen

wa_tab_input-ref_field = &2. "Feldname

wa_tab_input-fieldname = &2. "Feldbzeichnung.

append wa_tab_input to l_tab_input .

END-OF-DEFINITION.

*-----------------------------------------------------------------------

TYPES:

t_alv_cat TYPE lvc_s_fcat,

t_tab_alv_cat TYPE STANDARD TABLE OF t_alv_cat

.

DATA:

l_tab_input TYPE t_tab_alv_cat

.

DATA:

d_ref TYPE REF TO data,

wa_tab_input TYPE lvc_s_fcat,

x type ref to data

.

FIELD-SYMBOLS :

<f_tab_input> TYPE table,

<watab> type structure,

<fwa_tab_input>

.

* Felder hinzufügen

add_field 'KNVV' 'VKORG'. " 'Verkaufsorganisation'.

add_field 'KNVV' 'VTWEG'. " 'Vertriebsweg'.

add_field 'KNA1' 'KUNNR'. " 'Debitor'.

add_field 'MARA' 'MATNR'. " 'Material'.

* Interne Tabelle erzeugen

CALL METHOD cl_alv_table_create=>create_dynamic_table

EXPORTING

it_fieldcatalog = l_tab_input

IMPORTING

ep_table = d_ref .

ASSIGN d_ref->* TO <f_tab_input>.

<f_tab_input>-vkorg = '1000'.
Gerwin Borkowsky
2003-10-09 17:57:29 UTC
Permalink
Post by Michael Fritz
Dies funktioniert soweit ja recht gut, nur der Zugriff auf die einzelnen
Felder der Tabelle klappt nicht. Konkret wird die Zeile <f_tab_input>-bkorg
= '1000' zurückgewiesen, da es sich bei <f_tab_input> um keine Struktur
handelt.
Wie kann ich dann trotzdem auf die einzelnen Felder zugreifen?
Versuch es mal mit einer Zuweisung auf ein Feldsymbol.

field-symbols: <value> type any.

assign component <positiondesfeldes> of structure <fwa_tab_input> to
<value>.

<value> = '1000'.

So, oder so ähnlich.


Aber:

|FIELD-SYMBOLS :
|<f_tab_input> TYPE table,
| ...
| ASSIGN d_ref->* TO <f_tab_input>.
| <f_tab_input>-vkorg = '1000'.

Ist <f_tab_input> nicht eine Tabelle und keine Struktur?
--
Ciao Gerwin
Michael Fritz
2003-10-10 06:33:55 UTC
Permalink
Post by Gerwin Borkowsky
Versuch es mal mit einer Zuweisung auf ein Feldsymbol.
field-symbols: <value> type any.
assign component <positiondesfeldes> of structure <fwa_tab_input> to
<value>.
<value> = '1000'.
Gerwin,

danke für Deine Antwort. Dies Möglichkeit kannte ich bereits, nur stehe ich
vor folgendem Problem:
Die <Position des Feldes> ist nicht immer bekannt. Da ich die Tabelle dynam.
aufbaue und zwar anhand
einer Eingabe-Datei mit Feldnamen, kann und wird es sein, dass die Felder
nicht immer an der gleichen Stelle stehen.
Post by Gerwin Borkowsky
|<f_tab_input> TYPE table,
| ...
| ASSIGN d_ref->* TO <f_tab_input>.
| <f_tab_input>-vkorg = '1000'.
Ist <f_tab_input> nicht eine Tabelle und keine Struktur?
Ja, natürlich und genau das ist ja das Problem. Es ist eine Tabelle ohne
Kopfzeile. Somit bräuchte ich noch eine Art WA mit dem Aufbau wie
<f_tab_input> um die Daten von dort in die Tabelle zu bekommen.

cu,
Michael
"Martin Otto" <>
2003-10-10 09:52:15 UTC
Permalink
Hallo,
Post by Michael Fritz
Post by Gerwin Borkowsky
Versuch es mal mit einer Zuweisung auf ein Feldsymbol.
field-symbols: <value> type any.
assign component <positiondesfeldes> of structure <fwa_tab_input> to
<value>.
<value> = '1000'.
Gerwin,
danke für Deine Antwort. Dies Möglichkeit kannte ich bereits, nur stehe ich
Die <Position des Feldes> ist nicht immer bekannt. Da ich die Tabelle dynam.
aufbaue und zwar anhand
einer Eingabe-Datei mit Feldnamen, kann und wird es sein, dass die Felder
nicht immer an der gleichen Stelle stehen.
Post by Gerwin Borkowsky
|<f_tab_input> TYPE table,
| ...
| ASSIGN d_ref->* TO <f_tab_input>.
| <f_tab_input>-vkorg = '1000'.
Ist <f_tab_input> nicht eine Tabelle und keine Struktur?
Ja, natürlich und genau das ist ja das Problem. Es ist eine Tabelle ohne
Kopfzeile. Somit bräuchte ich noch eine Art WA mit dem Aufbau wie
<f_tab_input> um die Daten von dort in die Tabelle zu bekommen.
Du kannst beim Assign auch Feldnamen angeben.

ASSIGN COMPONENT (fieldname) OF STRUCTURE <fs_stru> TO <fd_val>.
Post by Michael Fritz
cu,
Michael
HTH,

Martin
Michael Fritz
2003-10-10 10:07:59 UTC
Permalink
Post by "Martin Otto" <>
Du kannst beim Assign auch Feldnamen angeben.
ASSIGN COMPONENT (fieldname) OF STRUCTURE <fs_stru> TO <fd_val>.
Danke Martin,

nur nach wie vor habe ich das Problem, dass ich gar keine Struktur habe auf
die ich mich beziehen könnte. Ich habe lediglich eine dynamisch erzeugte
Tabelle. Es wäre jetzt natürlich hilfreich, wenn ich mir eine Struktur
ebenfalls dynamisch erzeugen könnte....

cu,
Michael
Gerd Rother
2003-10-10 16:18:19 UTC
Permalink
"Michael Fritz" <***@yahoo.de> wrote in message news:<bm60dv$ir7o4$***@ID-90772.news.uni-berlin.de>...
[..]
Post by Michael Fritz
die ich mich beziehen könnte. Ich habe lediglich eine dynamisch erzeugte
Tabelle. Es wäre jetzt natürlich hilfreich, wenn ich mir eine Struktur
ebenfalls dynamisch erzeugen könnte....
[..]
Hallo,

der FB ALV_TABLE_CREATE erzeugt nun mal nur eine Tabelle, keine
Struktur. Da er aber ohnehin nur ein dynamisches Programm erzeugt, in
der dann die Tabelle erzeugt wird (GENERATE SUBROUTINE POOL), würde
ich das gleich selbst tun.
Das könnte etwa so aussehen:

*-----------------------------------------------------------------------
report yytestdyntab.

*-----------------------------------------------------------------------
define s.
line = &1.
insert line into table source.
end-of-definition.

*-----------------------------------------------------------------------
define sf.
concatenate:
&1 'like' &2 ','
into line
separated by space.
insert line into table source.
end-of-definition.

*-----------------------------------------------------------------------
types:
t_abaplines type table of edpline
with default key.

*-----------------------------------------------------------------------
start-of-selection.

perform run.

*-----------------------------------------------------------------------
form run.

data:
prog type progname,
pt type ref to data,
ps type ref to data.
field-symbols:
<t> type table,
<s> type any,
<f> type any.

perform generate_program
using
prog.
break xtrnrte.
perform get_dyntable in program (prog)
using
pt
ps.
assign pt->* to <t>.
assign ps->* to <s>.
assign component 1 of structure <s> to <f>. " BUKRS
<f> = '4711'.
assign component 2 of structure <s> to <f>. " SAKNR
<f> = '0815000000'.
insert <s> into table <t>.
loop at <t> assigning <s>.
assign component 1 of structure <s> to <f>. " BUKRS
write <f>.
assign component 2 of structure <s> to <f>. " SAKNR
write <f>.
endloop.

endform.

*-----------------------------------------------------------------------
form generate_program
using
prog type progname.

data:
source type t_abaplines,
line type edpline,
m(120),
l type i.

s:
'program geryon.',
'',
'types:',
' begin of t_dyn,'.
sf:
'BUKRS' 'T001-BUKRS',
'SAKNR' 'SKA1-SAKNR'.
s:
' end of t_dyn,',
' t_dyntab type table of t_dyn',
' with default key.',
'',
'form get_dyntable',
' using',
' pt type ref to data',
' ps type ref to data.',
'',
'create data:',
' pt type t_dyntab,',
' ps type t_dyn.',
'',
'endform.'.
generate subroutine pool source name prog
message m line l.
if sy-subrc <> 0.
* shit happens
* ...
endif.

endform.

*-----------------------------------------------------------------------


Die Feldzuweisung kann latürnich auch über den Feldnamen erfolgen (wie
mein Vorredner schon ausführte) statt über Komponentennummer.

HTH
Gerd
Gerwin Borkowsky
2003-10-10 11:40:33 UTC
Permalink
Post by Michael Fritz
Ja, natürlich und genau das ist ja das Problem. Es ist eine Tabelle ohne
Kopfzeile. Somit bräuchte ich noch eine Art WA mit dem Aufbau wie
<f_tab_input> um die Daten von dort in die Tabelle zu bekommen.
Versuch es mal mit:

DATA: d_ref_wa TYPE REF TO data.
FIELD-SYMBOLS : <wt_result> TYPE ANY.


CREATE DATA d_ref_wa LIKE LINE OF <f_tab_input>.
ASSIGN d_ref_wa->* TO <w_result>.
Michael Fritz
2003-10-13 06:46:50 UTC
Permalink
Post by Gerwin Borkowsky
DATA: d_ref_wa TYPE REF TO data.
FIELD-SYMBOLS : <wt_result> TYPE ANY.
CREATE DATA d_ref_wa LIKE LINE OF <f_tab_input>.
ASSIGN d_ref_wa->* TO <w_result>.
Gerwin,
EXAKT! Das ist genau das was ich suchte!

Danke nochmals auch an alle anderen, die dazu beigetragen haben auch an
Dirk-Werner Kaimer
Merci beaucoup Michel Pioud!

cu,
Michael

Loading...