Field Symbols

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

Field Symbols

Beitrag von Trulchen (Specialist / 241 / 4 / 1 ) »
Hallo,

ich bin auf Kriegsfuß mit Field Symbols.

Ich will eine mir unbekannte Sturkur in ein fieldsymbol schreiben und einem Event übergeben und weiß nicht ob ich Richtig denke...
Kann ich ein Fieldsymbol einem Event übergeben ? Oder muss ich es erst in eine Strukur schreiben?
Welcher Datentyp kann ich der Strukur dann übergeben wenn es absolut generisch ist?
Bin mir nicht sicher der Debugger springt ab Assign komplett an das Ende der Methode...

Code: Alles auswählen.

method IF_FPM_GUIBB_FORM~FLUSH.

DATA: lo_fpm TYPE REF TO if_fpm,
        lo_event TYPE REF TO cl_fpm_event,
        ls_structure TYPE  SPFLI .

FIELD-SYMBOLS: <structure> TYPE ANY.
ASSIGN is_data->* To <structure>.

MOVE-CORRESPONDING <structure> TO ls_structure.
CREATE OBJECT lo_event
        EXPORTING
          iv_event_id = 'DIALOG_OK'.
      lo_event->mo_event_Data->set_value( iv_key = 'STRUCTURE_DIALOG'
      iv_value = ls_structure ).


      lo_fpm = cl_fpm_factory=>get_instance( ).
      lo_fpm->raise_event( io_event = lo_event ).


endmethod.
Zuletzt geändert von Trulchen am 04.07.2014 10:02, insgesamt 2-mal geändert.

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


Re: Field Symbols

Beitrag von Pyro (Specialist / 121 / 14 / 18 ) »
Guten Morgen,

verstehe ich das richtig, dass es hier primär um die dynamische Struktur geht?
In diesem fall müsstest du via

Code: Alles auswählen.

FIELD-SYMBOLS: <ls_Struc> type any.
DATA: ls_struc TYPE REF TO data.

CREATE DATA  ls_struc TYPE ddictype.

ASSIGN ls_struc->* to <ls_struc>.
eine dynamische Struktur erstellen und diese über das FS referenzieren. Dieses FS solltset du dann normal an die Methode übergeben können (wenn diese natürlich als Parameter eine solche Struktur erwartet;) )

Gruß
Pyro

Re: Field Symbols

Beitrag von Trulchen (Specialist / 241 / 4 / 1 ) »
Ja es geht um eine dynamische Strukur.
DIe Strukur wird übergeben vom Floorplan manager und ich will sie in ein Feldsymbol packen.

Und danach am besten in eine Membervariable / Klassenattribut das ich es an einer anderen Stelle innerhalb der Klasse wieder verwenden kann...
Hab aber keine Ahnung wie ich es machen soll :(
Mein Versuch Funktioniert nicht.... ms structure ist die membervariable / das klassen attribut.
is_data ist zur Laufzeit gefüllt (Struktur) vom TYPE REF TO DATA.

Code: Alles auswählen.

FIELD-SYMBOLS <structure> TYPE any.
DATA : lo_event TYPE REF TO cl_fpm_event,
         lo_fpm TYPE REF TO if_fpm.

ASSIGN is_data->* TO <structure>.


MOVE-CORRESPONDING <structure> to  ms_structure.



Re: Field Symbols

Beitrag von Pyro (Specialist / 121 / 14 / 18 ) »
Ah, ok, verstehe ich das richtig, dass du quasi eine Membervariable mit dynamischer Struktur willst ? ....

In diesem Fall wäre es möglich, wenn du ein Klassenattribut MS_STRUCTURE vom Typ [TYPE REF TO data] machst. Im Constructor machst du dann ein [ CREATE DATA ms_structure TYPE dyn_struc ] und kannst diese dann aus jeder Methode wie immer über:

Code: Alles auswählen.

FIELD-SYMBOLD: <fs> TYPE any.

ASSIGN ms_structure->* to <fs>.

<fs>-col = 'wasauchimmer'.
ansprechen.

Oder willst du zwingend das <fs> / die Referenz als Attribut haben?

Gruß
Pyro

Re: Field Symbols

Beitrag von Thanatos82 (Expert / 699 / 32 / 123 ) »
Hi,

wenn is_data vom Typ REF TO data ist, wird der Move-Corresponding auch so nicht funktionieren.
Da müsstest du jede Komponente der Struktur <fs_structure> an das zugehörige Feld der Struktur ms_structure übergeben. Dann sollte das funktionieren.

Als Tipp: Wenn du es flexibel halten möchtest gibt es die Möglichkeit sich die Namen der Felder einer Struktur tabellarisch ausgeben zu lassen.
Dann kannst du über diese Tabelle loopen und mit assign component jedes Feld der struktur <fs_structure> zuweisen. Dann musst du dir das dazugehörige Feld in der ms_structure mit dem gleichen Befehl zuweisen, den Feldwert übergeben und dann sollte das so funktionieren wie du möchtest.
Gruß,
der Matze

Re: Field Symbols

Beitrag von Trulchen (Specialist / 241 / 4 / 1 ) »
Thanatos82 hat geschrieben: Als Tipp: Wenn du es flexibel halten möchtest gibt es die Möglichkeit sich die Namen der Felder einer Struktur tabellarisch ausgeben zu lassen.
Dann kannst du über diese Tabelle loopen und mit assign component jedes Feld der struktur <fs_structure> zuweisen. Dann musst du dir das dazugehörige Feld in der ms_structure mit dem gleichen Befehl zuweisen, den Feldwert übergeben und dann sollte das so funktionieren wie du möchtest.
Wie heißt diese Möglichkeit ?
Oh man ichv versteh nur Bahnhof :( ich hasse field-symbols.
Mein jetziger stand ist der, das ich über ein Event gehe.... aber das ist das unschöne :( besser wäre es die "unbekannte" strukur in eine membervariable zu schreiben und dann in einer anderen Methode wieder "abzurufen" und zu verarbeiten...

Aber jetzt geht mein Assign nicht mehr weil ein Typ konflikt vor liegt ... obowhl <strucutre> von typ ref to data und is_data auch...
FIELD-SYMBOLS <structure> TYPE ref to data.


DATA: lv_string TYPE string,
lo_event TYPE REF TO cl_fpm_event,
lo_fpm TYPE REF TO if_fpm.

ASSIGN is_data->* TO <structure>.

CREATE OBJECT lo_event
EXPORTING
iv_event_id = 'DIALOG_OK'.
lo_event->mo_event_data->set_value( iv_key = 'STRUCTURE_DIALOG'
iv_value = <structure> ).

lo_fpm = cl_fpm_factory=>get_instance( ).
lo_fpm->raise_event( io_event = lo_event ).

Re: Field Symbols

Beitrag von Pyro (Specialist / 121 / 14 / 18 ) »
Trulchen hat geschrieben:besser wäre es die "unbekannte" strukur in eine membervariable zu schreiben und dann in einer anderen Methode wieder "abzurufen" und zu verarbeiten...
Diese Möglichkeit hatte ich eigentlich oben beschrieben, wie es funktioniert. Ging das etwa nicht?
Trulchen hat geschrieben: Aber jetzt geht mein Assign nicht mehr weil ein Typ konflikt vor liegt ... obowhl <strucutre> von typ ref to data und is_data auch...
FIELD-SYMBOLS <structure> TYPE ref to data.


DATA: lv_string TYPE string,
lo_event TYPE REF TO cl_fpm_event,
lo_fpm TYPE REF TO if_fpm.

ASSIGN is_data->* TO <structure>.

CREATE OBJECT lo_event
EXPORTING
iv_event_id = 'DIALOG_OK'.
lo_event->mo_event_data->set_value( iv_key = 'STRUCTURE_DIALOG'
iv_value = <structure> ).

lo_fpm = cl_fpm_factory=>get_instance( ).
lo_fpm->raise_event( io_event = lo_event ).
<structure> darf hier nicht type ref to data sein, sondern in diesem fall am "besten" dann type any (da es jede mögliche Struktur annehmen können muss)

Folgende Benutzer bedankten sich beim Autor Pyro für den Beitrag:
Trulchen


Re: Field Symbols

Beitrag von Trulchen (Specialist / 241 / 4 / 1 ) »
nein mit der member variable ging nicht ...
Hab versucht im cons

Code: Alles auswählen.

  FIELD-SYMBOLS: <structure> TYPE ANY  ,
                 <test> TYPE REF TO data.

BREAK-POINT.

  DATA:  lv_string TYPE string,
         lo_event TYPE REF TO cl_fpm_event,
          lo_fpm TYPE REF TO if_fpm.

  ASSIGN is_data->* TO <structure>.
ms_structure = <structure>.
Da gibt es dann einen typkonflikt zwischen ms_structure and <structure>

Re: Field Symbols

Beitrag von Pyro (Specialist / 121 / 14 / 18 ) »
nein, ich hatte gemeint die Membervariable (in diesem Fall ms_structure) muss in der Klasse unter Attribute als [ TYPE REF TO data ] angelegt werden. Im Constructor wird diese dann mit [ CREATE DATA ms_structure TYPE übergebener_datentyp_bzw_struktur ] erstellt und diese kann dann über ein [FIELD-SYMBOLS <fs> TYPE any ] mit [ ASSIGN ms_structure->* to <fs> ] angesprochen, bearbeitet und verändert werden.

D.h. zusammengefasst:
1. Membervariable mit TYPE REF TO data erstellen
2. Im Constructor beim erstellen des Objekts das Datenelement wie folgt erstellen:

Code: Alles auswählen.

METHOD Constructor.
     
   CREATE DATA ms_structure TYPE dyn_datatype.
   "Das funktioniert so natürlich nur, wenn dyn_datatype ein echter ddic-Datentyp ist. Wenn dem Constructor hier ein String übergeben wird, in welchem der DDIC_Typ als Text drin steht, muss es glaube ich wie folgt erstellt werden:
   CREATE DATA ms_structure TYPE (dyn_datatype_string).

ENDMETHOD.
3. Diese ms_structure ist dann wie folgt aus jeder Methode aufrufbar:

Code: Alles auswählen.

METHOD jede_methode.

    FIELD-SYMBOLS: <fs> TYPE any.

    ASSIGN ms_structure->* TO <fs>.

ENDMETHOD.
Das habe ich mit einem Testprogramm getestet und das funktioniert auch, wenn man es genau so macht;)
Außer natürlich ich habe deine Anforderung falsch verstanden, aber du hattest ja gesagt, dass du eine Membervariable mit dynamischer Struktur, die erst zur Laufzeit bekannt wird bzw. pro Objekt anders sein kann.

Gruß
Pyro

Re: Field Symbols

Beitrag von Trulchen (Specialist / 241 / 4 / 1 ) »
Hallo ....

ich kämpfe immer noch mit den Feldsymbol.

Ich will jetzt Wert aus einer Feldtabelelle auslesen und verändern.
Mein Coding funktioniert leider nicht :(

Code: Alles auswählen.

 mt_result = lr_data.

    FIELD-SYMBOLS: <data> TYPE ANY TABLE.
    FIELD-SYMBOLS: <f_line> TYPE any.
    FIELD-SYMBOLS: <fs_value> TYPE any.
    DATA data_line TYPE REF TO data.

    ASSIGN mt_result->* TO <data>.

    CREATE DATA data_line LIKE LINE OF <data>.

    ASSIGN data_line->* TO <f_line>.
    DATA:
       lt_field_cat_attr  TYPE REF TO cl_abap_structdescr,
       lt_fields          TYPE ddfields,
       ls_field           TYPE dfies,
       ls_test TYPE c.

*** Parameterstruktur eingetragen
*** Ermitteln der Komponenten der Parameterliste
    lt_field_cat_attr ?= cl_abap_structdescr=>describe_by_data(  <f_line> ).
    lt_fields = lt_field_cat_attr->get_ddic_field_list( ).


    LOOP AT <data> ASSIGNING <f_line> WHERE <f_line>.
      LOOP AT lt_fields INTO ls_field.

        IF ls_field-fieldname = 'RESPONSIBLE_USER'.
          ASSIGN COMPONENT 'RESPONSIBLE_USER' OF STRUCTURE <f_line> TO <fs_value>.
          WRITE <fs_value>  TO ls_test USING EDIT MASK '==ZUSER'.
          <fs_value> = ls_test.

          UNASSIGN   <fs_value>.
          INSERT <f_line>  INTO TABLE <data>.
        ENDIF.
        CLear ls_field.
        clear <f_line>.

      ENDLOOP.
ENDLOOP.

Re: Field Symbols

Beitrag von a-dead-trousers (Top Expert / 4271 / 213 / 1140 ) »
Lass mich raten: Im Ergebnis steht in der Spalte nur ein Zeichen drinnen und die Zeilen werden zweimal angezeigt?
1) Die Variable LS_TEST hat keine Längenangabe somit wird automatisch Länge 1 angenommen.
2) Das INSERT am Ende kannst du dir sparen, da du mit LOOP AT ... ASSIGNING bereits auf die aktuelle Zeile zugreifst.
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: Field Symbols

Beitrag von Trulchen (Specialist / 241 / 4 / 1 ) »
a-dead-trousers hat geschrieben:Lass mich raten: Im Ergebnis steht in der Spalte nur ein Zeichen drinnen und die Zeilen werden zweimal angezeigt?
1) Die Variable LS_TEST hat keine Längenangabe somit wird automatisch Länge 1 angenommen.
2) Das INSERT am Ende kannst du dir sparen, da du mit LOOP AT ... ASSIGNING bereits auf die aktuelle Zeile zugreifst.
So geht es :)

Code: Alles auswählen.

    mt_result = lr_data.
    FIELD-SYMBOLS: <data> TYPE ANY TABLE.
    FIELD-SYMBOLS: <f_line> TYPE any.
    FIELD-SYMBOLS: <fs_value> TYPE zsit_responsible_name.
    DATA data_line TYPE REF TO data.
    ASSIGN mt_result->* TO <data>.

    CREATE DATA data_line LIKE LINE OF <data>.

    ASSIGN data_line->* TO <f_line>.
    DATA:
       lt_field_cat_attr  TYPE REF TO cl_abap_structdescr,
       lt_fields          TYPE ddfields,
       ls_field           TYPE dfies,
       ls_test TYPE zsit_responsible_name.

**** Parameterstruktur eingetragen
**** Ermitteln der Komponenten der Parameterliste
*    lt_field_cat_attr ?= cl_abap_structdescr=>describe_by_data(  <f_line> ).
*    lt_fields = lt_field_cat_attr->get_ddic_field_list( ).


    LOOP AT <data> ASSIGNING <f_line>.

      Data l_name TYPE zsit_responsible_name.
      ASSIGN COMPONENT 'RESPONSIBLE_USER' OF STRUCTURE <f_line> TO <fs_value>.
      WRITE  <fs_value> TO ls_test USING EDIT MASK '==ZUSER'.
      <fs_value> = ls_test.

    ENDLOOP.

Re: Field Symbols

Beitrag von Trulchen (Specialist / 241 / 4 / 1 ) »
Hab noch ne frage weil es bei mir einfach nicht funktioniert ...

Ich habe einen aufruf:

Code: Alles auswählen.

 CALL METHOD lo_event_data->get_value
        EXPORTING
          iv_key   = 'SELECTED_LINE'
        IMPORTING
          ev_value = <selected_line>.
Typ <selected_line> wurde als typ any definiert und zur Laufzeit ist es vom Typ "Z_ST_BE_RESULT" (Struktur)

Diese Selected line will ich nun einer Variable übergebn vom gleichen Typ (ZSIT_ST_BE_REMovSULT).
Klappt aber nicht.

versucht habe ich diese beide Möglichkeiten:

Code: Alles auswählen.

Move Coresponding <selected line> to variable. 
variable = <selected_line>

Re: Field Symbols

Beitrag von a-dead-trousers (Top Expert / 4271 / 213 / 1140 ) »
Hi!
Trulchen hat geschrieben:Typ <selected_line> wurde als typ any definiert und zur Laufzeit ist es vom Typ "Z_ST_BE_RESULT" (Struktur)
Diese Selected line will ich nun einer Variable übergebn vom gleichen Typ (ZSIT_ST_BE_REMovSULT).
Entweder hast du dich hier im Forum verschrieben oder die Strukturen sind nicht "kompatibel".

MOVE-CORRESPONDING arbeitet "per Name" sprich alle Felder die Links vorkommen werden nach Rechts kopiert.
MOVE (=) arbeitet bei flachen Strukturen per OFFSET.
Flache Struktur bedeutet nur Zeichenfelder. Die Variablen werden intern dann als ein langes Zeichenfeld behandelt.

In allen anderen Fällen kommt es bei inkombatiblen Strukturen zu einem Fehler.
(Siehe dazu auch die ABAP Hilfe zu MOVE und den Konvertierungen die ABAP intern dabei vornimmt)

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

Seite 1 von 1

Vergleichbare Themen

13
Antw.
11881
Views
Field-Symbols
von cschmoel » 23.08.2012 09:21 • Verfasst in ABAP® für Anfänger
7
Antw.
2833
Views
field symbols
von bohne » 20.10.2006 15:07 • Verfasst in ABAP® für Anfänger
3
Antw.
1836
Views
field symbols
von Riceman » 20.03.2006 15:08 • Verfasst in ABAP® Core
10
Antw.
4007
Views
FIELD-SYMBOLS
von kostonstyle » 15.08.2008 08:07 • Verfasst in ABAP® für Anfänger
7
Antw.
2872
Views
field-symbols definierung
von dimes » 12.07.2005 14:24 • Verfasst in ABAP® für Anfänger

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.