dynamisch type zuweisen

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
20 Beiträge • Seite 1 von 2 (current) Nächste
20 Beiträge Seite 1 von 2 (current) Nächste

dynamisch type zuweisen

Beitrag von MarkusW (Specialist / 406 / 5 / 0 ) »
Hallo Abap-Gemeinde.

Gibt es eine möglichkeit zur Laufzeit eine interne variable anzulegen und den type mitzugeben.

also so:

Code: Alles auswählen.

data:  strukturvar     type dictonarystruktur.
das einzig bekannte ist der name der struktur. Der variable Name ist auch vorgegeben.

Im grunde stehts bisher so im coding:(theoretisch)

Code: Alles auswählen.

data:  strukturvar     type .
im feld strukturname (type c(30)) steht der name der struktur z.b. 'MARA'.

wie bekomm ichs hin, dass ich im coding die variable strukturvar benutzen kann und diese var dann die struktur von mara hat.

man muss sich das so vorstellen das ich eine int. tabelle loope und bei jedem neuen loop muss der typ von strukturvar angepasst werden.


Den befehl generate subroutine pool hab ich mir angeschaut...aber auch damit komm ich auf keine lösung. Kann aber auch daran liegen das ich schon auf 180 bin wegen diesem Problem.

bitte um hilfe.

danke

Gruß
Markus

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


Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
Hallo Markus,

ja, die gibt es:

Code: Alles auswählen.

DATA:
  ld_struct TYPE REF TO DATA,
  lv_struct_name TYPE string.

FIELD-SYMBOLS:
  <ls_struct> TYPE ANY.

lv_struct_name = 'MARA'.

CREATE DATA ld_struct TYPE (lv_struct_name).
ASSIGN ld_struct->* TO <ls_struct>.
Damit hast Du Zugriff mit <ls_struct> auf deine Struktur.

Wenn Du auf einzelen Felder der Struktur zugreifen willst, musst Du ASSIGN COMPONENT benutzen.
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von MarkusW (Specialist / 406 / 5 / 0 ) »
ereglam hat geschrieben:Hallo Markus,

ja, die gibt es:

Code: Alles auswählen.

DATA:
  ld_struct TYPE REF TO DATA,
  lv_struct_name TYPE string.

FIELD-SYMBOLS:
  <ls_struct> TYPE ANY.

lv_struct_name = 'MARA'.

CREATE DATA ld_struct TYPE (lv_struct_name).
ASSIGN ld_struct->* TO <ls_struct>.
Damit hast Du Zugriff mit <ls_struct> auf deine Struktur.

Wenn Du auf einzelen Felder der Struktur zugreifen willst, musst Du ASSIGN COMPONENT benutzen.
Die Antwort kam schnell.
Werde es gleich mal ausprobieren. Wenn das funzt wie ichs brauch, dann haste was gut bei mir ;) Das erspart mir dann mehrere Std grübeln.

Thx erstmal.
Gruß
Markus

Beitrag von MarkusW (Specialist / 406 / 5 / 0 ) »
@ereglam: DANKE der Ansatz war genau der richtige :D

Darf ich mal so nebenher fragen, wieviel Jahre Erfahrung du schon hast?

Gruß
Markus

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
Hallo Markus,

das hat nicht sooo viel mit Erfahrung zu tun, da es den CREATE noch nicht so lange gibt.
Ich habe halt gerade damit zu tun...

PS:
ich saue jetzt erst seit ca. 10 Jahren mit und in SAP-Systemen herum...
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von MarkusW (Specialist / 406 / 5 / 0 ) »
ereglam hat geschrieben:Hallo Markus,

das hat nicht sooo viel mit Erfahrung zu tun, da es den CREATE noch nicht so lange gibt.
Ich habe halt gerade damit zu tun...

PS:
ich saue jetzt erst seit ca. 10 Jahren mit und in SAP-Systemen herum...
Respekt. Da hab ich ja noch vieles einzuholen.
Den Create Befehl habe ich im Buch sogar gelesen, konnte damit nur nix anfangen :oops:

dank Dir versteh ich ihn jetzt auch :lol:

THX

gruß
Markus

Beitrag von MarkusW (Specialist / 406 / 5 / 0 ) »
Geht das auch irgendwie um auf die gleiche art und weise dynamisch ein

Code: Alles auswählen.

data: variablenamen type table of 'typ'
mit der hier genannten art und weise gehts leider nicht, da man nur direkt typsieren kann.

und ne struktur anlegen um von der dann die type table of machen geht auch net, da ich kein fieldsymbol bzw auch keine datenreferenzvariable da nutzen darf.

gibts da was? oder ist das dann doch schwieriger bzw. gar nicht machbar...

ist wieder der gleiche fall...ich kenne den typ von dem das table of gmeacht werden soll, aber das kann eben variieren.

THX schonmal.

Gruß
Markus

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
Hallo Markus,

dazu gibt es zwei Möglichkeiten:
  1. Typ ist im DDIC bekannt
    CREATE DATA ... TYPE TABLE OF (typ).
  2. mit CL_ABAP_TABLEDESCR und CL_ABAP_STRUCTDESCR
    Anlegen einer Struktur und dann einer Tabelle mit CREATE DATA ... TYPE HANDLE tabdescr.
  3. Subroutinepool
    anlegen eines temporären Programmes/Form-Routine, dass eine Tabelle erzeugt und zurückgibt
Die letzte Variante ist notwendig, wenn Du auf einem System kleiner 6.20 arbeitest...
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von MarkusW (Specialist / 406 / 5 / 0 ) »
ereglam hat geschrieben:Hallo Markus,

dazu gibt es zwei Möglichkeiten:
  1. Typ ist im DDIC bekannt
    CREATE DATA ... TYPE TABLE OF (typ).
  2. mit CL_ABAP_TABLEDESCR und CL_ABAP_STRUCTDESCR
    Anlegen einer Struktur und dann einer Tabelle mit CREATE DATA ... TYPE HANDLE tabdescr.
  3. Subroutinepool
    anlegen eines temporären Programmes/Form-Routine, dass eine Tabelle erzeugt und zurückgibt
Die letzte Variante ist notwendig, wenn Du auf einem System kleiner 6.20 arbeitest...
ich arbeite auf 4.6c

es geht hier um die Tabelle MARA.
die erste version funktioniert nicht. wenn ich das in ( ) angebe gibt er mir ein fehler aus.
meine anweisung:

Code: Alles auswählen.

  FIELD-SYMBOLS:
         <lfs_tab>       TYPE ANY,
         <lfs_tab2>       TYPE ANY.

  DATA:  ld_tab         TYPE REF TO data,
         lt_mara        TYPE REF TO data.

  CREATE DATA ld_tab TYPE (rs_fullkey-tabname).   <--- das funktioniert
  ASSIGN ld_tab->* TO <lfs_tab>.                            <--- das funktioniert

  create data lt_mara type table of (rs_fullkey-tabname). <-- das nicht
  ASSIGN lt_mara->* TO <lfs_tab2>.
Da kommt die Fehlermeldung: "TABLE" ist nicht vollständig typisiert.

in dem Feld rs_fullkey-tabname steht 'MARA', dass Feld der Struktur rs_fullkey ist mit String typisiert.


Punkt 2 muss ich mir mal anschauen...aber extra von der mara was neues anlegen kann ja nicht sinn sein.

Punkt 3 hilft mir hierbei nicht weiter... da ich ja nix neues erstellen will. Hab da schon rumgewerkelt damit, aber hänge dann immer, weil ich den Wert nur in einer Variable stehen hab, nirgends im klartext...somit kann ichs dynamisch nicht aufbauen.

im feld rs_fullkey-tabname stehen nur tabellen drin, die im DDIC existieren.

THX 4 Help.

Gruß
Markus

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
ereglam hat geschrieben:...
Die letzte Variante ist notwendig, wenn Du auf einem System kleiner 6.20 arbeitest...
also geht bei Dir nur die Variante drei...
Du müsstest also ein Programm schreiben, das eine Form-Routine beinhaltet, die einen Typ vereinbart, dessen Felder dynamisch in den restlichen Quelltext eingefügt werden und dazu eine Tabelle anlegt. Diese Tabelle ist von der Form-Routine an den Aufrufer zurückzuliefern...

Den benötigten Quelltext müsste ich selbst erst noch entwickeln, habe aber kein 4.6C zur Verfügung...
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von MarkusW (Specialist / 406 / 5 / 0 ) »
Guten Morgen.

Danke ereglam. Werde es dann mal versuchen. hoffe es halbwegs verstanden zu haben ;)

Aber wenn ich das nun auf diese Art und Weise mache, ist es dann auf Lauffähig wenn ich das ganze auf ein 6.20 transportier oder 6.40 ... oder muss man es dann eh komplett wieder umschreiben?

Hab das noch nicht so ganz begriffen mit den Kompatabilitäten zwischen den einzelnen Systemen.

Thx.

Gruß
Markus

Beitrag von Kaiwalker (Specialist / 165 / 0 / 0 ) »
Man kann unter 4.6 auch die folgende Methode verwenden, um eine dynamische Tabelle zu erstellen.

Code: Alles auswählen.

  call method cl_alv_table_create=>create_dynamic_table
    exporting
      it_fieldcatalog           = t_fieldcat
    importing
      ep_table                  = it_ref.
Hierbei muss allerdings vorher ein Feldkatalog ( wie beim ALV ) angelegt werden.

MfG
Kaiwalker
Möge die Macht mit euch sein.

Beitrag von MarkusW (Specialist / 406 / 5 / 0 ) »
Thx Kaiwalker, aber nicht ganz das was ich benötige.

@eraglam:

Diesen Quellcode lass ich mir dynamisch erstellen:

Code: Alles auswählen.

PROGRAM /xxxx/sapfyzpv.                 
TYPES:                                   
   typ_s_MARA TYPE MARA ,                
   typ_t_MARA TYPE TABLE OF typ_s_MARA.  
DATA:                                    
   gt_MARA TYPE typ_t_MARA.              
der Quellcode hierzu:

Code: Alles auswählen.

*----------------------------------------------------------------------*
*   INCLUDE /XXXX/YZPVREPEXTER                                        *
*----------------------------------------------------------------------*

DATA: code TYPE TABLE OF rssource-line,
      s_code LIKE LINE OF code,
      prog(8) TYPE c, msg(120) TYPE c, lin(3) TYPE c,
      wrd(10) TYPE c, off(3) TYPE c, hf_string TYPE string.

CLEAR hf_string.

APPEND 'PROGRAM /xxxx/sapfyzpv.'
        TO code.
*APPEND 'FIELD-SYMBOLS:'
*        TO code.
*APPEND '   <lfs_tab>        TYPE ANY.'
*        TO code.
APPEND 'TYPES:'
        TO code.
CONCATENATE '   typ_s_' r_tabname ' TYPE '
       INTO hf_string.
CONCATENATE hf_string r_tabname ','
       INTO hf_string
       SEPARATED BY space.

APPEND hf_string
        TO code.

CLEAR hf_string.

CONCATENATE '   typ_t_' r_tabname ' TYPE TABLE OF typ_s_' r_tabname '.'
       INTO hf_string.

APPEND hf_string
        TO code.

CLEAR hf_string.

APPEND 'DATA:'
        TO code.

CONCATENATE '   gt_' r_tabname ' TYPE typ_t_' r_tabname '.'
       INTO  hf_string.

APPEND hf_string
        TO code.

CLEAR hf_string.


GENERATE SUBROUTINE POOL code NAME prog
                         MESSAGE msg
                         LINE    lin
                         WORD    wrd
                         OFFSET  off.

IF sy-subrc <> 0.
  WRITE: / 'Error during generation in line', lin,
         / msg,
         / 'Word:', wrd, 'at offset', off.
ELSE.
  SKIP 3.
  WRITE: / 'The name of the subroutine pool is', prog.
  LOOP AT code INTO s_code.
    WRITE: / s_code.
  ENDLOOP.
ENDIF.
Habe mir ein Subroutine-Pool angelegt, welcher folgenden Inhalt hat:

Code: Alles auswählen.

PROGRAM  /xxxx/sapfyzpv               .

FORM check_key USING r_tabname TYPE string.
  INCLUDE /xxxx/yzpvrepexter.
ENDFORM.
und in meinem eigentlichen Programm (Das Hauptprogramm) ist folgender Aufruf drin:

Code: Alles auswählen.

    PERFORM check_key(/xxxx/sapfyzpv) USING gf_tabname.
in gf_tabname steht z.b. MARA.

Das einzige was mich etwas irritiert ist, dass ich ja im angelegten Subroutinepool die Anweisung 'Program ....' drin hab und im generierten auch (wo es aber dabei sein MUSS)

Somit hab ich 2 subroutinepools...oder?

Aber zum eigentlichen Problem. Wie übergebe ich meinem Hauptprogramm die int. Tabelle gt_mara so dass ich diese Benutzen kann?
Bei der Perform-Anweisung mit CHANGING kann ichs ja nicht angeben, da im Hauptprogramm der dort angegebene Name existieren muss mit typ, oder?

Gruß
Markus

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
Hallo Markus,

wie ich zuvor schon schrieb, muss in dem generierten Quelltext eine Form-Routine hinein, die ein untypisiertes Feld, eben Deine Tabelle, zurückliefert.
Beispiele habe ich leider nicht.

Statt dessen solltest Du mit der Klassenmethode von Kaiwalker Dir eine Tabelle anlegen lassen. Das ist viel sauberer und genau das was Du brauchst...

Die hatte ich in 4.6C auch mal benutzt.
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von MarkusW (Specialist / 406 / 5 / 0 ) »
nungut...ich werd das mal ausprobieren.

Die Klasse von kaiwalker schau ich mir an, aber im momemt bin ich mir net sicher ob es das ist was ich brauch, da ich kein feldkatalog habe.
aber mal sehen...vllt wenn ich die routine zum generieren eines feldkatalogs und kaiwalkers klasse kombiniere...ich werd berichten wie ichs weiter geschafft hab :arrow:

Danke nochmal euch beiden

Gruß
Markus

Vergleichbare Themen

4
Antw.
2395
Views
Variablentyp dynamisch zuweisen
von Kresiquadratur » 16.07.2007 16:34 • Verfasst in ABAP® für Anfänger
2
Antw.
3537
Views
Typ dynamisch aus String zuweisen
von Talvien » 02.09.2014 12:31 • Verfasst in ABAP® für Anfänger
2
Antw.
1301
Views
Zeichformate in SmartForms dynamisch zuweisen
von schwar01 » 15.12.2005 15:17 • Verfasst in Basis
5
Antw.
8129
Views
Variablen Namen dynamisch zuweisen
von Google » 07.04.2005 09:28 • Verfasst in Dialogprogrammierung
1
Antw.
2762
Views
Buttons auf Dynpro dynamisch benennen und zuweisen
von vwaadenm » 24.08.2007 08:04 • Verfasst in Dialogprogrammierung

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

Unbeantwortete Forenbeiträge

Daten an Tabelle binden
vor 2 Tagen von Bright4.5 1 / 597
aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2226
Hilfe bei SWEC/SWE2
letzen Monat von retsch 1 / 8820