FuBA die Struktur mitgeben (dynamisch)

Getting started ... Alles für einen gelungenen Start.
37 Beiträge • Seite 1 von 3 (current) Nächste
37 Beiträge Seite 1 von 3 (current) Nächste

FuBA die Struktur mitgeben (dynamisch)

Beitrag von L0w-RiDer (Expert / 535 / 83 / 2 ) »
Hallo nochmal! :)

So ich wäre nun dran für mein vorheriges Casting-Problem einen Funktionsbaustein zu erstellen. Bei diesem hätte ich nun das Problem, dass ich ihm eine Struktur mitgebe, welche unterschiedliche Strukturtypen hat (je nach Struktur), welche ich in dem FUBA verarbeiten möchte. Weiß das vielleicht jemand locker aus der Hüfte geschossen? :)

ls_struc = string.

ich gebe ls_struc sowie string dem Funktionsbaustein mit und ls_struc kann natürlich unterschiedliche Strukturtypen haben, je nachdem was es für eine Struktur ist.

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


Re: FuBA die Struktur mitgeben (dynamisch)

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
TYPE ANY

Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
L0w-RiDer



Re: FuBA die Struktur mitgeben (dynamisch)

Beitrag von L0w-RiDer (Expert / 535 / 83 / 2 ) »
Hallo,

nachdem ich das Problem mit dem Unicode gelöst habe(Siehe Coding 1), bin ich ja nun gerade dabei einen Funktionsbaustein zu schreiben. Hier soll die Struktur natürlich dynamisch mitgegeben werden. Hab soweit auch einen Fuba geschrieben, funktioniert bloß leider nicht. Das Feldsymbol <fs_structure> bekommt immer den Wert Char 1, ich versteh bloß nicht wieso :/.

Erkennt jemand den Fehler? (Siehe Coding 2)

RESULT ist natürlich die Struktur und String ist der String.

Code: Alles auswählen.

loop at lt_fkkdefrev assigning <ls_fkkdefrev>.
    clear sy-subrc.
        while sy-subrc = 0.
            assign component sy-index of structure <ls_fkkdefrev> to field-symbol(<ld_feld>).
            check sy-subrc = 0.
            gr_descr ?= cl_abap_typedescr=>describe_by_data( p_data = <ld_feld> ).
            CASE gr_descr->type_kind.
            WHEN  'P'.
            field-SYMBOLS <fs> TYPE any.
            assign <ld_feld> to <fs> CASTING TYPE C.
            <ld_feld> = <fs>.
            ENDCASE.
        ENDWHILE.
endloop.
---

Code: Alles auswählen.

FUNCTION Z_UNICODE_TEST.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*"  EXPORTING
*"     REFERENCE(STRING) TYPE  ANY
*"  CHANGING
*"     REFERENCE(RESULT) TYPE  ANY
*"----------------------------------------------------------------------

**

DATA: gr_descr TYPE REF TO cl_abap_typedescr.

FIELD-SYMBOLS: <fs_structure> TYPE RESULT.
FIELD-SYMBOLS: <fs_hilf> TYPE RESULT.

ASSIGN STRING to <fs_structure> CASTING.

RESULT = <fs_structure>.

*APPEND STRUKTUR to lt_hilf.

*LOOP at lt_hilf ASSIGNING <fs_hilf>.
*  clear sy-subrc.
    while sy-subrc = 0.
      ASSIGN COMPONENT sy-index of STRUCTURE <fs_structure> to FIELD-SYMBOL(<ld_feld>).
      check sy-subrc = 0.
      gr_descr ?= cl_abap_typedescr=>describe_by_data( p_data = <ld_feld> ).
      case gr_descr->type_kind.
      WHEN 'P'.
      FIELD-SYMBOLS <fs> TYPE any.
      ASSIGN <ld_feld> to <fs> CASTING TYPE C.
      <ld_feld> = <fs>.
      ENDCASE.
    ENDWHILE.
*ENDLOOP.


ENDFUNCTION.

Re: FuBA die Struktur mitgeben (dynamisch)

Beitrag von DeathAndPain (Top Expert / 1795 / 213 / 396 ) »
Du legst Dich selber auf's Kreuz, indem Du vordefinierte ABAP-Schlüsselwörter und DDIC-Datenelementnamen als Variablennamen verwendest. STRING ist ein eingebauter Datentyp, also ein ganz schlechter Name für ein Feld (vor allem dann, wenn jenes Feld dann nicht einmal vom Typ STRING ist). Was Dir hier konkret um die Ohren fliegt, ist die Tatsache, dass RESULT ein Datenelement vom Typ CHAR(1) ist, wie Du Dich mit der SE11 leicht überzeugen kannst. Tja, und wenn Du dann schreibst:

Code: Alles auswählen.

FIELD-SYMBOLS: <fs_structure> TYPE RESULT.
dann definierst Du Dein Feldsymbol als genau von diesem Typ.

Vermutlich könntest Du Dich retten, wenn Du stattdessen

Code: Alles auswählen.

FIELD-SYMBOLS: <fs_structure> LIKE RESULT.
schreiben würdest.

Ich finde es ja gut, wenn Du auf die blöde ungarische Notation verzichtest, aber das tust Du ja noch nicht mal, sondern nutzt sie im ganzen restlichen Programm und nur bei den beiden Importparametern Deines Fubas nicht. Das ist inkonsequent. Wenn man ungarisch macht, dann kenne ich das so, dass man vor deren Namen dann IV_ stellt. Dann biste auch auf der sicheren Seite, dass Du keine DDIC-Elemente oder vordefinierte ABAP-Schlüsselwörter triffst.

Inkonsequent ist übrigens auch, dass Du vor jede Feldsymboldefinition einzeln den Befehl FIELD-SYMBOLS schreibst, aber dann trotzdem Doppelpunkte verwendest. Besser wäre entweder so:

Code: Alles auswählen.

FIELD-SYMBOLS <fs_structure> TYPE RESULT.
FIELD-SYMBOLS <fs_hilf> TYPE RESULT.
oder (IMHO noch besser) so:

Code: Alles auswählen.

FIELD-SYMBOLS: <fs_structure> TYPE RESULT,
               <fs_hilf> TYPE RESULT.

Re: FuBA die Struktur mitgeben (dynamisch)

Beitrag von L0w-RiDer (Expert / 535 / 83 / 2 ) »
hmm also mit LIKE hat es leider nicht funktioniert. Ich möchte den Feldsymbolen den Typ mitgeben, welche die Struktur hat, diese kann natürlich unterschiedlich sein. Hättest du da ne Idee?

Re: FuBA die Struktur mitgeben (dynamisch)

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
ewx hat geschrieben:TYPE ANY
Die Zuweisung erfolgt dann typgerecht beim ASSIGN

Re: FuBA die Struktur mitgeben (dynamisch)

Beitrag von L0w-RiDer (Expert / 535 / 83 / 2 ) »
Da bekomm ich leider immer bei dieser Stelle ein Problem:

ASSIGN TEST to <fs_structure> CASTING.

--> Hier kommt die Fehlermeldung dann: Das Feldsymbol "<FS_STRUCTURE>" muss entweder voll typisiert sein oder einen der generischen Typen C, N, P oder X tragen.

Re: FuBA die Struktur mitgeben (dynamisch)

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
Kannst du mal ein vollständiges und lauffähiges Beispiel posten, bei dem man nachvollziehen kann, was nicht funktioniert?

Re: FuBA die Struktur mitgeben (dynamisch)

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
Und warum muss es ein Funktionsbaustein sein? Warum nimmst du keine Klasse/ Methode?

Re: FuBA die Struktur mitgeben (dynamisch)

Beitrag von DeathAndPain (Top Expert / 1795 / 213 / 396 ) »
Was hat das denn mit der Frage zu tun, ob er einen FB oder eine Klasse nutzt?

Effektiv will er ein Datenobjekt übergeben, dessen Struktur zu Programmbeginn noch nicht bekannt ist. Ich habe da früher auch versucht, mit ASSIGNs und CASTs was zu basteln, aber so funktioniert es nicht.

Low_rider, was Du in dem Fall brauchst, ist ein namenloses Datenobjekt, das per TYPE REF TO DATA referenziert wird. Diese Referenz kannst Du dann Deinem FB übergeben, denn damit hast Du ja eine klare Typisierung Deines Parameters (nämlich REF TO DATA). Zur Laufzeit musst Du dann mit CREATE DATA ein Datenobjekt des benötigten Typs erzeugen und darauf dann castend Feldsymbole einrichten. Das ist sehr abstrakte Programmierung, aber in dem Fall leider unumgänglich.

Re: FuBA die Struktur mitgeben (dynamisch)

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
DeathAndPain hat geschrieben:Was hat das denn mit der Frage zu tun, ob er einen FB oder eine Klasse nutzt?
weil man mit einer Klasse einfach ein Demoprogramm schreiben und posten kann. Ein Funktionsbaustein mit Funktionsgruppe und Report ist deutlich umständlicher.

Re: FuBA die Struktur mitgeben (dynamisch)

Beitrag von edwin (Specialist / 300 / 9 / 68 ) »
Hi,
hier mal ein Beispiel zu Casts, aber als Form und nicht FB, spielt aber keine Rolle

Code: Alles auswählen.

...
  DATA p_vbak TYPE vbak.
  p_vbak-vbeln = '9876543210'.
  p_vbak-mandt = sy-mandt.

  PERFORM check_cast CHANGING p_vbak.


  DATA p_mara TYPE mara.
  p_mara-matnr = '012345678901234567'.
  p_mara-mandt = sy-mandt.
  p_mara-ntgew = '2345.678'.

  PERFORM check_cast CHANGING p_mara.

....
FORM check_cast  CHANGING p_rec TYPE any.
  FIELD-SYMBOLS <any>     TYPE any.
  FIELD-SYMBOLS <field>   TYPE any.
  FIELD-SYMBOLS <xany>    TYPE x.
  FIELD-SYMBOLS <cany>    TYPE c.
  DATA gr_descr           TYPE  REF TO cl_abap_typedescr.
  DATA dfies             	TYPE dfies_tab.


  ASSIGN p_rec TO <any>.

  gr_descr ?= cl_abap_typedescr=>describe_by_data( p_data = <any> ).

  WRITE : / gr_descr->absolute_name.

  ASSIGN ('<any>-mandt') TO <field>.
  IF sy-subrc EQ 0. WRITE : / 'MANDT', <field>. ENDIF.

  ASSIGN COMPONENT 'VBELN' OF STRUCTURE <any> TO <field>.
  IF sy-subrc EQ 0.
    WRITE : / 'Feld VBELN ist enhalten'.
  ENDIF.

  ASSIGN ('<any>-vbeln') TO <field>.
  IF sy-subrc EQ 0. WRITE : / 'VBELN', <field>. ENDIF.

  ASSIGN p_rec TO <xany> CASTING.

  WRITE : / <xany>.

  ASSIGN p_rec TO <cany> CASTING.

  WRITE : / <cany>.

  ASSIGN COMPONENT 'NTGEW' OF STRUCTURE <any> TO <field>.
  IF sy-subrc EQ 0.
    WRITE : / 'Feld NTGEW ist enhalten gehen wir mal davon aus - es ist die MARA'.
    CALL FUNCTION 'DDIF_FIELDINFO_GET'
      EXPORTING
        tabname        = 'MARA'
      TABLES
        dfies_tab      = dfies
      EXCEPTIONS
        not_found      = 1
        internal_error = 2
        OTHERS         = 3.

* Wo steht NTGEW ?
    READ TABLE dfies ASSIGNING FIELD-SYMBOL(<dfies>) WITH KEY fieldname = 'NTGEW'.
    IF sy-subrc EQ 0.
* Assign mit Namen
      ASSIGN ('<any>-ntgew') TO <field>.
      IF sy-subrc EQ 0. WRITE : / 'NTGEW', <field>. ENDIF.
* das ist der ganze Satz Hex
      ASSIGN p_rec TO <xany> CASTING.
      WRITE : / <xany>.
* Jetzt mit offset und Länge das ist ein Packed Decimals als Hex :
      ASSIGN <xany>+<dfies>-offset(<dfies>-intlen) TO <field>.
      WRITE : / <field>.
* und das ein p mit offset länge und gecastet
      ASSIGN <xany>+<dfies>-offset(<dfies>-intlen) TO <field> CASTING TYPE p DECIMALS <dfies>-decimals.
      WRITE : / <field>.
    ENDIF.
  ENDIF.

  ASSIGN ('<any>-matnr') TO <field>.
  IF sy-subrc EQ 0. WRITE : / 'MATNR', <field>. ENDIF.
ENDFORM.
/Edwin

Re: FuBA die Struktur mitgeben (dynamisch)

Beitrag von DeathAndPain (Top Expert / 1795 / 213 / 396 ) »
ewx hat geschrieben:weil man mit einer Klasse einfach ein Demoprogramm schreiben und posten kann. Ein Funktionsbaustein mit Funktionsgruppe und Report ist deutlich umständlicher.
Er will ja sicherlich kein "Demoprogramm", sondern hat eine produktive Anwendung im Auge. Und einen Funktionsbaustein kann man auch einfach in der SE37 "testen", wenn es nur darum geht.

Re: FuBA die Struktur mitgeben (dynamisch)

Beitrag von edwin (Specialist / 300 / 9 / 68 ) »
Hi,
DeathAndPain hat geschrieben:Und einen Funktionsbaustein kann man auch einfach in der SE37 "testen", wenn es nur darum geht.
na dann viel Spass beim Testen in der SE37 mit einem 'ANY' Parameter.
/Edwin

Folgende Benutzer bedankten sich beim Autor edwin für den Beitrag:
ewx


Vergleichbare Themen

13
Antw.
10546
Views
Struktur dynamisch bearbeiten
von isp » 02.08.2018 15:28 • Verfasst in ABAP Objects®
6
Antw.
1723
Views
Struktur dynamisch auslesen / schreiben
von Ingo » 04.08.2021 09:52 • Verfasst in ABAP® Core
4
Antw.
4051
Views
Feldzugriff auf Struktur dynamisch gestalten
von JohnLocklay » 07.11.2017 11:57 • Verfasst in ABAP® Core
3
Antw.
4288
Views
Dynamisch Struktur und Tabelle generieren und füllen
von Kresiquadratur » 16.07.2007 14:32 • Verfasst in ABAP® für Anfänger
7
Antw.
5982
Views
Feldkatalog von einer dynamisch erzeugten Struktur/Tabelle
von MarkusW » 08.11.2007 18:06 • Verfasst in ABAP® Core

Aktuelle Forenbeiträge

Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 64
Interne Tabelle
vor 5 Tagen von black_adept 2 / 133
MaLo-Checker in ABAP
vor einer Woche von A6272 6 / 254

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.

Aktuelle Forenbeiträge

Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 64
Interne Tabelle
vor 5 Tagen von black_adept 2 / 133
MaLo-Checker in ABAP
vor einer Woche von A6272 6 / 254

Unbeantwortete Forenbeiträge

Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 64
Group Items auf einer Filterbar
vor einer Woche von Bright4.5 1 / 107
tRFC Transaktionen SM58
vor 4 Wochen von A6272 1 / 140