Dynamischer Typ

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

Dynamischer Typ

Beitrag von Mrs. Hilflos (Specialist / 225 / 0 / 0 ) »
Hallo zusammen,

ich soll auf einem Selektionsbild eine Struktur p_struct angeben können.
Im Programm brauche ich dann eine itab, welche type standard table of p_struct sein soll. Die Tabelle muss vom Typ Standard Table sein, da ich sie an einen FuBa übergebe, der die Tabelle in der Tables-Anweisung stehen hat.
Ich habe mir die Beiträge zu dynamischen Tabellen hier angeschaut. Komme damit aber leider nicht zurecht. :cry:
Habe in dieser Richtung noch überhaupt keine Erfahrungen.

Mein Coding:

Code: Alles auswählen.

parameters:    p_struct like dd02d-strname   obligatory.
data:              dref      type ref to data.
field-symbols:  <fs>    type table.

create data dref type (p_struct). 
assign dref->* to <fs>.

      call function 'BAPI_AR_ACC_GETOPENITEMS'
           exporting
                companycode  = ls_bukrs
                customer         = ls_kunnr
                keydate          = p_date
                noteditems      = ' '
           importing
                return             = gs_err
           tables
               lineitems          = <fs>.
Dann bekomme ich immer einen Dump:
Typkonflikt beim ASSIGN im Programm....

Fehleranalyse:
Es wurde versucht, einem typisierten Feldsymbol ein Feld zuzuweisen,
das nicht den erforderlichen Typ besitzt.

Übrigens: Ich arbeite mit Release 46C.

Viele Grüße
Mrs. Hilflos

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


Beitrag von Haubi (Expert / 625 / 20 / 30 ) »
Hi Mrs. Hilflos.

Tabellen lassen sich unter 46C nicht mittels CREATE DATA dynamisch erstellen, das geht erst mit dem Web AS. Du kannst mittels der Methode CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE eine Tabelle dynamisch erstellen.

Guckst Du hier: http://www.abapforum.com/viewtopic.php?t=108

Gruss,
Haubi
Das ABAP Kochbuch ab sofort bei Amazon...

I'd rather write code that writes code than write code...

Beitrag von Mrs. Hilflos (Specialist / 225 / 0 / 0 ) »
Hallo Haubi,

danke für deinen Hinweis. Werde ich mal ausprobieren.

Gruß
Mrs. Hilflos

Beitrag von Mrs. Hilflos (Specialist / 225 / 0 / 0 ) »
Hallo Haubi,

Code: Alles auswählen.

PARAMETERS: p_struct LIKE dd02d-strname   OBLIGATORY
                  DEFAULT 'BAPI3007_2'.

DATA: lt_dfies LIKE STANDARD TABLE OF dfies,
      ls_dfies LIKE LINE OF lt_dfies,
      ls_fieldcatalog TYPE lvc_s_fcat,
      lt_fieldcatalog LIKE STANDARD TABLE OF ls_fieldcatalog.

DATA: my_table TYPE REF TO data.

CALL FUNCTION 'DDIF_NAMETAB_GET'
     EXPORTING
          tabname     = p_struct
*         ALL_TYPES   = ' '
*         LFIELDNAME  = ' '
*         GROUP_NAMES = ' '
*    IMPORTING
*         X030L_WA    =
*         DTELINFO_WA =
*         TTYPINFO_WA =
*         DDOBJTYPE   =
*         DFIES_WA    =
     TABLES
*         X031L_TAB   =
          dfies_tab   = lt_dfies.
*    EXCEPTIONS
*         NOT_FOUND   = 1
*         OTHERS      = 2
.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

LOOP AT lt_dfies INTO ls_dfies.
  IF ls_dfies-inttype EQ 'P'.
    ls_fieldcatalog-datatype = 'QUAN'.
    ls_fieldcatalog-inttype = ls_dfies-inttype.
    ls_fieldcatalog-intlen = ls_dfies-intlen.
    ls_fieldcatalog-decimals = ls_dfies-decimals.
  ELSE.
    ls_fieldcatalog-ref_table = ls_dfies-tabname.
    ls_fieldcatalog-ref_field = ls_dfies-fieldname.
  ENDIF.

  ls_fieldcatalog-fieldname  = ls_dfies-fieldname.
  APPEND ls_fieldcatalog TO lt_fieldcatalog.
ENDLOOP.

* Tabelle mit Feldkatalog erstellen
CALL METHOD cl_alv_table_create=>create_dynamic_table
  EXPORTING
    it_fieldcatalog = lt_fieldcatalog
   IMPORTING
     ep_table        = my_table
    .


CALL FUNCTION 'BAPI_AR_ACC_GETOPENITEMS'
     EXPORTING
          companycode = '1000'
          customer    = '9999999999'
          keydate     = sy-datum
          noteditems  = ' '
*     IMPORTING
*          return      = gs_err
     TABLES
                lineitems   = my_table.

Die Übergabe an den letzten FuBa funktioniert noch nicht richtig.
Ich bekomme immer den Fehler: my_table ist keine interne Tabelle.

Weißt du Rat?

Gruß
Mrs. Hilflos

Beitrag von Haubi (Expert / 625 / 20 / 30 ) »
Hi Mrs. Hat-Hilfe-Bekommen.

Du musst noch dereferenzeiren:

Code: Alles auswählen.

FIELD-SYMBOLS: <lt_table> TYPE ANY TABLE.

[...]
CALL METHOD cl_alv_table_create=>create_dynamic_table...
[...]

ASSIGN my_table->* TO <lt_table>.
Anschließend mussu das Feldsymbol als Tabellenparameter des BAPI's übergeben, dann sollte es funzen.

Gruss,
Haubi

P.S.: eigentlich müßtest Du den Feldkatalog mittels FuBa REUSE_ALV_FIELDCATALOG_MERGE erstellen können, dann sparst Du Dir Tipparbeitund es sieht übersichtlicher aus.
Das ABAP Kochbuch ab sofort bei Amazon...

I'd rather write code that writes code than write code...

Beitrag von Mrs. Hilflos (Specialist / 225 / 0 / 0 ) »
Hi Haubi,

danke für deine Geduld.
Leider dumpt das ganze jetzt wieder:

Typkonflikt bei Aufruf eines Funktionsbausteins (Feldlänge)
Der Aufruf des Funktionsbausteins "BAPI_AR_ACC_GETOPENITEMS" ist nicht korrekt:
In der Schnittstelle des Funktionsbausteins wurde festgelegt, daß
unter "LINEITEMS" nur Felder eines bestimmten Typs und einer bestimmten Länge mitgegeben werden dürfen. Das aktuell mitgegebene Feld " " hat zwar den richtigen Typ, nicht aber die richtige Länge.

???
Kannst du noch mal helfen?

Gruß
die hoffnungsvolle Mrs. Hilflos

Beitrag von Steff (Site Admin / 386 / 0 / 1 ) »
Hallo,

ich denke mal das Problem ist hier ähnlich wie in diesem Beitrag. Da hatten u.a. Haubi und ich eine ähnliche Diskussion. Schau mal, ob Dir das weiterhilft:
http://www.abapforum.com/viewtopic.php?t=108
Ich vermute mal, du hast ebenfalls ein 46*-Release, oder?

Gruß,
Steff

Beitrag von Haubi (Expert / 625 / 20 / 30 ) »
Hmmm,

der Tables-Parameter muss die Zeilenstruktur BAPI3007_1 haben. Das ist bei Deinem Parameter die Default-Einstellung. Das von Dir gepostete Coding kann natürlich nur funzen, wenn Du diesen Wert beibehältst. Wenn Du einen anderen Strukturnamen eingibst (etwa MARA oder so) bekommst Du automatisch einen Dump.

Ansonsten würde ich mal probieren, den Feldkatalog automatisch erzeugen zu lassen, ggf. stimmen die Feldlängen der erzeugten Tabelle nicht mit den erwarteten Feldlänge überein...

Gruss,
Haubi
Das ABAP Kochbuch ab sofort bei Amazon...

I'd rather write code that writes code than write code...

Beitrag von Mrs. Hilflos (Specialist / 225 / 0 / 0 ) »
Hallo Steff,
ja ich habe Release 46C.
Den Beitrag habe ich mir schon angeschaut wie am Coding wahrscheinlich erkennbar :-)

Es funktioniert auch alles hübsch, außer die Übergabe des Feldsymbols als interne Tabelle. Er erkennt jetzt wohl den Typ, der sei richtig. Die Länge stimmt wohl noch nicht und ich weiß nicht wieso.

Problem ist, dass ich ein Programm brauche, bei dem auf der Selektionsmaske eine bestimmte Struktur ausgewählt werden kann. Die Strukturen werden entsprechend den Schnittstellenwünschen von Kunden angelegt.

Über den FuBa BAPI_AR_ACC_GETOPENITEMS lese ich alle entsprechenden OPs aus in eine Itab (vom Typ BAPI3007_2) Hier stehen alle Felder noch drin. Danach möchte ich die itab an eine weitere itab2 (abgespeckte Struktur von BAPI3007_2) übergeben welche als Grundlage, die auf dem Selektionsbild angegebene Sturktur hat.

Bei der Deklaration von itab2 tu ich mich schwer.
Deshalb das ganze mit der Dynamik.

Vielleicht hat auch jemand einen ganz anderen Weg ?

Gruß
Mrs. Hilflos

Beitrag von Steff (Site Admin / 386 / 0 / 1 ) »
Hallo,

aber warum willst Du dann die Tabelle, die Du an den BAPI übergibst dynamisch aufbauen? Das verstehe ich dann nicht. Die Struktur musst Du fest definiert an den Baustein übergeben, ansonsten gibt das immer einen Dump. Das wirst Du mit einer dynamischen Tabelle nicht hinbekommen (eben aufgrund der Probleme mit den gepackten Feldern, dann stimmt nämlich die Länge der Struktur nicht mehr -> das ist genau die Fehlermeldung die Du bekommst).

Deine Zieltabelle (itab2) kannst Du dynamisch per Feldkatalog erstellen. Die füllst Du dann mittels move-corresponding über einen loop der Tabelle, die Dir der Baustein 'BAPI_AR_ACC_GETOPENITEMS' zurückliefert. Wie gesagt diese Tablle aber fest definiert:

data: item_table type BAPI3007_2 occurs 0.

Also in der Art:

Code: Alles auswählen.

loop at tab_lineitems into wa_lineitems.
   move-corresponding wa_lineitems to wa_itab2.
   insert wa_itab2 into table <itab2>.
endloop.
.

Gruß,
Steff

Beitrag von Mrs. Hilflos (Specialist / 225 / 0 / 0 ) »
Hallo Steff,

ich glaube ich sehe jetzt den Wald vor lauter Bäumen nicht mehr.
Ich besorge mir jetzt über den FuBa BAPI_AR_ACC_GETOPENITEMS die OPs. Die stehen in der itab gt_op vom Typ

Code: Alles auswählen.

gt_op LIKE STANDARD TABLE OF bapi3007_2 WITH HEADER LINE.
Danach erstelle ich mir meine Tabelle mit Feldkatalog über

Code: Alles auswählen.

  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog = lt_fieldcatalog
     IMPORTING
       ep_table        = my_table
      .

  ASSIGN my_table->* TO <lt_table>.
... dazugehörige Definition:

Code: Alles auswählen.

DATA: my_table TYPE REF TO data.

FIELD-SYMBOLS: <lt_table> TYPE STANDARD TABLE.
Dann loope ich über die itab gt_op.

Code: Alles auswählen.

  LOOP AT gt_op INTO gs_op.
    MOVE gs_op TO <fs>.
   insert <fs> into table <lt_table>.
  ENDLOOP.
...dazugehörige Definition:

Code: Alles auswählen.

FIELD-SYMBOLS: <fs> TYPE ANY.
Mir wäre auch ein MOVE-CORRESPONDING lieber. Dann kommt aber die Meldung, dass <fs> keine Struktur oder itab mit Kopfzeile ist.

Jetzt dumpt das Ganze, da Zeilentyp der itab nicht mit dem Arbeitsbereich kompatibel ist.
:-(

Weißt du Rat?

Gruß
die hoffnungsvolle Mrs. Hilflos

Beitrag von Steff (Site Admin / 386 / 0 / 1 ) »
Hallo,

Dein Feldsymbol <fs> ist vom Typ any, muss aber vom Typ der Zeilendefinition der dynamischen Tabelle sein, d.h. den Zeilentyp musst Du ebenfalls noch generisch erzeugen.

Probier mal folgendes:

Code: Alles auswählen.

field-symbols:  <fs>    type any. 

create data dref type (p_struct). 
assign dref->* to <fs>. 
und dann:

Code: Alles auswählen.

  LOOP AT gt_op INTO gs_op. 
    MOVE-CORRESPONDING gs_op TO <fs>. 
   insert <fs> into table <lt_table>. 
  ENDLOOP. 
Gruß,
Steff

Beitrag von Mrs. Hilflos (Specialist / 225 / 0 / 0 ) »
Hallo Steff,

dann bekomme ich für die Zeile mit Move-Corresponding folgenden Fehler:
<fs> ist keine Struktur oder itab mit Kopfzeile.

Gruß
Mrs. Hilflos

Beitrag von Steff (Site Admin / 386 / 0 / 1 ) »
Hallo,

kannst Du Dein Coding mal in ganzer Pracht und Schönheit hier reinposten? Oder schicken an:
webmaster@abapforum.com
Werd das mal selbst testen in einem 46C. Danke.

Gruß,
Steff

Beitrag von Steff (Site Admin / 386 / 0 / 1 ) »
Hallo,

der move-corresponding mit den erst zur Laufzeit typisierten Strukturen funktioniert erst ab 6.10.
Ich werd mir was überlegen und Dir per mail zuschicken. Sicherlich lösbar über subroutine-pool (generiert).

Gruß,
Steff

Vergleichbare Themen

13
Antw.
11129
Views
Dynamischer Selection Screen mit dynamischer Suchhilfe
von Johnny11 » 26.03.2014 08:19 • Verfasst in ABAP® Core
2
Antw.
4430
Views
Dynamischer Methodenaufruf mit dynamischer Tabelle
von mark.thk » 12.12.2018 10:34 • Verfasst in ABAP Objects®
5
Antw.
7598
Views
Dynamischer Methodenaufruf mit dynamischer Tabelle
von Tommy Nightmare » 08.09.2017 13:23 • Verfasst in ABAP Objects®
3
Antw.
9847
Views
Dynamischer Klassenaufruf
von Krypt1k0n » 19.04.2023 11:51 • Verfasst in ABAP Objects®
8
Antw.
16822
Views
dynamischer Selektionsscreen
von eddi89 » 05.11.2009 15:13 • Verfasst in ABAP® für Anfänger

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