Dynamisch Bezeichner interner Tabellenfelder ausgeben

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).

Dynamisch Bezeichner interner Tabellenfelder ausgeben

Postby Matilda2566 » Tue Oct 04, 2011 2:54 pm

Hallo zusammen,

ich habe eine selbstdefinierte interne Tabelle. Ich möchte nun nicht nur die Werte der internen Tabelle in eine Datei (z.B. .txt) ausgeben. Sondern ich möchte zuvor als Spaltenüberschrift den Bezeichner (z.B. den Langtext) des jeweiligen Feldes der Struktur als Überschrift vorher ausgeben.

Es gibt doch diese ganzen CL_ABAP*DESCR-Klasssen. Damit müsste es doch gehen? (Ich krieg’s leider nicht gebacken ... :cry: )

Könnt Ihr mir vielleicht einen Hinweis oder ein kleines Beispiel geben?

Wenn ich z.B. die Struktur
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. DATA: BEGIN OF wa_tab
  2.         ,kunnr  LIKE knvv-kunnr
  3.         ,matnr  LIKE mara-matnr
  4.    ,maktx  LIKE makt-maktx
  5.    ,kbetr  LIKE konp-kbetr
  6.         ,END OF wa_tab.
  7. DATA: it_tab LIKE TABLE OF wa_tab.
  8.  
GeSHi ©

Wie käme ich dann an die hinter den Datenelementen knvv-kunnr, mara-matnr, makt-maktx und konp-kbetr liegenden Langbezeichner?
Ich frage auch deswegen, weil sich die Struktur der internen Tabelle ändern kann. Dies würde dann bei einer kleinen Anpassung in der Struktur keinen weiteren Programmieraufwand bei der Ausgabe bedeuten.

DANKE für Eure Antworten :!:
Matilda2566
...
...
 
Posts: 299
Joined: Fri Aug 24, 2007 11:47 am

Re: Dynamisch Bezeichner interner Tabellenfelder ausgeben

Postby Fiona462 » Wed Oct 05, 2011 4:15 am

KleinerEisbaer hat geschrieben:Es gibt doch diese ganzen CL_ABAP*DESCR-Klasssen. Damit müsste es doch gehen? (Ich krieg’s leider nicht gebacken ... :cry: )

Könnt Ihr mir vielleicht einen Hinweis oder ein kleines Beispiel geben?


Zeig doch erst einmal Dein Coding, was Du bisher versucht hast. :roll:
Fiona462
...
...
 
Posts: 149
Joined: Tue Dec 07, 2010 11:28 pm

Re: Dynamisch Bezeichner interner Tabellenfelder ausgeben

Postby Bilal3242 » Wed Oct 05, 2011 8:39 am

KleinerEisbaer hat geschrieben:Wie käme ich dann an die hinter den Datenelementen knvv-kunnr, mara-matnr, makt-maktx und konp-kbetr liegenden Langbezeichner?


Die bekommst du aus Tabelle DD03M, hab's gerade mal getestet:

Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. REPORT TESTLA.
  2.  
  3. TABLES: DD03M.
  4.  
  5. DATA: LANGTEXT(50).
  6.  
  7. SELECT * FROM DD03M WHERE TABNAME EQ 'KNVV' AND FIELDNAME EQ 'KUNNR' AND DDLANGUAGE EQ 'DE'.
  8.   LANGTEXT = DD03M-SCRTEXT_L.
  9. WRITE:/ LANGTEXT.
  10.  
  11. SELECT * FROM DD03M WHERE TABNAME EQ 'MARA' AND FIELDNAME EQ 'MATNR' AND DDLANGUAGE EQ 'DE'.
  12.   LANGTEXT = DD03M-SCRTEXT_L.
  13. WRITE:/ LANGTEXT.
  14.  
  15. SELECT * FROM DD03M WHERE TABNAME EQ 'MAKT' AND FIELDNAME EQ 'MAKTX' AND DDLANGUAGE EQ 'DE'.
  16.   LANGTEXT = DD03M-SCRTEXT_L.
  17. WRITE:/ LANGTEXT.
  18.  
  19. SELECT * FROM DD03M WHERE TABNAME EQ 'KONP' AND FIELDNAME EQ 'KBETR' AND DDLANGUAGE EQ 'DE'.
  20.   LANGTEXT = DD03M-SCRTEXT_L.
  21. WRITE:/ LANGTEXT.
GeSHi ©


Du müsstest die Abfrage dann halt nur dynamisch anhand von Variablen machen.

Gruß
Michael
Bilal3242
...
...
 
Posts: 400
Joined: Wed Apr 15, 2009 12:46 pm

Re: Dynamisch Bezeichner interner Tabellenfelder ausgeben

Postby Salma1291 » Fri Oct 07, 2011 12:07 pm

Hi,
versuche es mal so:

Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. DATA: BEGIN OF wa_tab
  2.         ,kunnr  LIKE knvv-kunnr
  3.         ,matnr  LIKE mara-matnr
  4.    ,maktx  LIKE makt-maktx
  5.    ,kbetr  LIKE konp-kbetr
  6.         ,END OF wa_tab.
  7. DATA: it_tab LIKE TABLE OF wa_tab.
  8. ....
  9. form test_struct .
  10.   DATA  cl_type               TYPE REF TO cl_abap_typedescr.
  11.   DATA  cl_struc              TYPE REF TO cl_abap_structdescr.
  12.   DATA  cl_elem               TYPE REF TO cl_abap_elemdescr.
  13.   FIELD-SYMBOLS <fs_comps>    TYPE abap_compdescr.
  14.   DATA  l_type_kind           TYPE abap_typekind.
  15.   DATA  l_name                TYPE string.
  16.   FIELD-SYMBOLS <fs_any>      TYPE ANY.
  17.   DATA wa_dfies               TYPE dfies.
  18.  
  19. *Prüfung welche Art die Daten sind
  20.   l_type_kind =  cl_abap_datadescr=>get_data_type_kind( p_data = wa_tab ).
  21.  
  22. * Strukturen weiter auflösen
  23.   IF l_type_kind CA 'uv'.
  24.     cl_struc ?= cl_abap_datadescr=>describe_by_data( p_data = wa_tab  ).
  25. * Jedes Element der Struktur prüfen
  26.     LOOP AT cl_struc->components ASSIGNING <fs_comps>.
  27.       ASSIGN COMPONENT <fs_comps>-name OF STRUCTURE wa_tab TO <fs_any>.
  28.       IF sy-subrc EQ 0.
  29. * Element -> Element Definition holen
  30.           cl_elem ?= cl_abap_datadescr=>describe_by_data( p_data = <fs_any>  ).
  31. * Namen des Feldes
  32.           l_name = cl_elem->get_relative_name( ).
  33. * Hier wird auf DDIC Bezug gepürft:
  34.           IF cl_elem->is_ddic_type( ) = 'X'.
  35.             TRY.
  36. * Hole die Feldinfos aus dem DDIC
  37.                 wa_dfies = cl_elem->get_ddic_field( ).
  38.                 write : / 'DDIC:',<fs_comps>-name, wa_dfies-SCRTEXT_L.
  39.               CATCH cx_root.
  40.                 CLEAR wa_dfies.
  41.                 write : / 'Fehler DDIC:', <fs_comps>-name, l_name.
  42.             ENDTRY.
  43.           ELSE.
  44. * Kein DDic Bezug -> keine Beschreibung nehme den Namen des Feldes
  45.             write : / 'Kein DDIC:', <fs_comps>-name, l_name.
  46.           ENDIF.
  47.       ENDIF.
  48.     ENDLOOP.
  49.   endif.
  50. endform.                    " test_struct
  51.  
GeSHi ©
Salma1291
...
...
 
Posts: 197
Joined: Tue Feb 27, 2007 6:26 pm

Re: Dynamisch Bezeichner interner Tabellenfelder ausgeben

Postby Ilja583 » Fri Oct 07, 2011 1:32 pm

Hallo Lars,

du kannst auch versuchen die Klasse CL_SALV_TABLE das für dich erledigen zu lassen.
Beispiel:
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.  
  2. TYPES: BEGIN OF ty_test,
  3.           matnr TYPE matnr,
  4.           werks TYPE werks_d,
  5.           datum TYPE sydatum,
  6.        END OF ty_test.
  7.  
  8. DATA: t_data TYPE STANDARD TABLE OF ty_test WITH NON-UNIQUE DEFAULT KEY.
  9.  
  10. DATA: cl_salv   TYPE REF TO cl_salv_table,
  11.       cl_cols   TYPE REF TO cl_salv_columns_table,
  12.       t_cols    TYPE salv_t_column_ref,
  13.       longtext  TYPE scrtext_l.
  14. FIELD-SYMBOLS: <col> LIKE LINE OF t_cols.
  15.  
  16.  
  17.   cl_salv_table=>factory( IMPORTING r_salv_table   = cl_salv
  18.                           CHANGING  t_table        = t_data ).
  19.  
  20.   cl_cols = cl_salv->get_columns( )."->get( ).
  21.   t_cols  = cl_cols->get( ).
  22.   LOOP AT t_cols ASSIGNING <col>.
  23.  
  24.     longtext = <col>-r_column->get_long_text( ).
  25.     WRITE:/ <col>-columnname,
  26.             longtext.
  27.  
GeSHi ©
Ilja583
.....
.....
 
Posts: 1372
Joined: Wed Jan 08, 2003 3:00 pm

Re: Dynamisch Bezeichner interner Tabellenfelder ausgeben

Postby ewx » Fri Oct 07, 2011 2:11 pm

Hi Edwin,

ich habe dein Programm noch mal angepasst, da es bei in der Struktur eingebetteten Strukturen zu einem Kurzdump kommt...
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.  
  2.  
  3. TYPES: BEGIN OF ty_test,
  4.          langu TYPE sylangu,
  5.          abcde TYPE syabcde,
  6.        END OF ty_test.
  7.  
  8. DATA: BEGIN OF wa_tab
  9.         ,kunnr  LIKE knvv-kunnr
  10.         ,matnr  LIKE mara-matnr
  11.         ,maktx  LIKE makt-maktx
  12.         ,kbetr  LIKE konp-kbetr
  13.         ,flag   TYPE c LENGTH 10 " Ohne DDIC
  14.         ,werks  TYPE werks_d     " Datenelement
  15.         ,test   TYPE ty_test        " Struktur!!
  16.      ,END OF wa_tab.
  17. DATA: it_tab LIKE TABLE OF wa_tab.
  18.  
  19. *  DATA  cl_elem               TYPE REF TO cl_abap_elemdescr.
  20.  
  21. PERFORM test_struct.
  22.  
  23.  
  24. *&---------------------------------------------------------------------*
  25. *&      Form  struc
  26. *&---------------------------------------------------------------------*
  27. FORM struc USING value(istruc).
  28.  
  29.   DATA  cl_type               TYPE REF TO cl_abap_typedescr.
  30.   DATA  cl_struc              TYPE REF TO cl_abap_structdescr.
  31.   DATA  cl_elem               TYPE REF TO cl_abap_elemdescr.
  32.   FIELD-SYMBOLS <fs_comps>    TYPE abap_compdescr.
  33.   DATA  l_type_kind           TYPE abap_typekind.
  34.   DATA  l_name                TYPE string.
  35.   FIELD-SYMBOLS <fs_any>      TYPE ANY.
  36.   FIELD-SYMBOLS <fs_any2>     TYPE ANY.
  37.   DATA wa_dfies               TYPE dfies.
  38.  
  39.   cl_struc ?= cl_abap_datadescr=>describe_by_data( p_data = istruc  ).
  40. * Jedes Element der Struktur prüfen
  41.   LOOP AT cl_struc->components ASSIGNING <fs_comps>.
  42.     ASSIGN COMPONENT <fs_comps>-name OF STRUCTURE istruc TO <fs_any>.
  43.     IF sy-subrc EQ 0.
  44.  
  45.       DESCRIBE FIELD <fs_any> TYPE l_type_kind.
  46.       IF l_type_kind = 'u'.
  47.         PERFORM struc USING <fs_any>.
  48.       ELSE.
  49.  
  50. * Element -> Element Definition holen
  51.         cl_elem ?= cl_abap_datadescr=>describe_by_data( p_data = <fs_any>  ).
  52. * Namen des Feldes
  53.         l_name = cl_elem->get_relative_name( ).
  54. * Hier wird auf DDIC Bezug gepürft:
  55.         IF cl_elem->is_ddic_type( ) = 'X'.
  56.           TRY.
  57. * Hole die Feldinfos aus dem DDIC
  58.               wa_dfies = cl_elem->get_ddic_field( ).
  59.               WRITE : / 'DDIC:',<fs_comps>-name, wa_dfies-scrtext_l.
  60.             CATCH cx_root.
  61.               CLEAR wa_dfies.
  62.               WRITE : / 'Fehler DDIC:', <fs_comps>-name, l_name.
  63.           ENDTRY.
  64.         ELSE.
  65. * Kein DDic Bezug -> keine Beschreibung nehme den Namen des Feldes
  66.           WRITE : / 'Kein DDIC:', <fs_comps>-name, l_name.
  67.         ENDIF.
  68.       ENDIF.
  69.     ENDIF.
  70.  
  71. ENDFORM.                    "struc
  72.  
  73. *&---------------------------------------------------------------------*
  74. *&      Form  test_struct
  75. *&---------------------------------------------------------------------*
  76. FORM test_struct .
  77.  
  78.   DATA  l_type_kind           TYPE abap_typekind.
  79.  
  80. *Prüfung welche Art die Daten sind
  81.   l_type_kind =  cl_abap_datadescr=>get_data_type_kind( p_data = wa_tab ).
  82.  
  83. * Strukturen weiter auflösen
  84.   IF l_type_kind CA 'uv'.
  85.     PERFORM struc USING wa_tab.
  86.   ENDIF.
  87. ENDFORM.                    " test_struct
  88.  
GeSHi ©


Dabei ist mir was Lustiges aufgefallen:
Probiert mal
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. DATA  l_type_kind           TYPE abap_typekind.
  2.  
GeSHi ©


Beim Prüfen melder der Compiler: Der Typ ABAP_TYPEKIND" ist unbekannt. :shock:

So ist das Coding wieder fehlerfrei:
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. DATA  cl_elem               TYPE REF TO cl_abap_elemdescr.
  2. DATA  l_type_kind           TYPE abap_typekind.
  3.  
GeSHi ©
ewx
.....
.....
 
Posts: 2840
Joined: Mon Aug 04, 2003 9:02 pm

Re: Dynamisch Bezeichner interner Tabellenfelder ausgeben

Postby Salma1291 » Fri Oct 07, 2011 2:36 pm

Hi,
das ist ja auch nur ein Beispiel für die Verwendung. Ein bisschen Arbeit wollte ich euch auch noch lassen. :wink:

Gruss Edwin
Salma1291
...
...
 
Posts: 197
Joined: Tue Feb 27, 2007 6:26 pm

Re: Dynamisch Bezeichner interner Tabellenfelder ausgeben

Postby Salma1291 » Fri Oct 07, 2011 3:38 pm

Hi Enno,

der Typ ABAP_TYPEKIND ist im Type-Pool Abap definiert.
durch
DATA cl_elem TYPE REF TO cl_abap_elemdescr.
zieht sich der Compiler auch "CL_ABAP_ELEMDESCR" dieser erbt von "CL_ABAP_TYPEDESCR" und in diesem ist der Type-pool ABAP eingebunden.

Nach der Definition :
DATA cl_elem TYPE REF TO cl_abap_elemdescr.
oder auch
DATA cl_type TYPE REF TO cl_abap_typedescr.
können auch die Typen aus dem Type-pool ABAP benutzt werden.

Gruss Edwin
Salma1291
...
...
 
Posts: 197
Joined: Tue Feb 27, 2007 6:26 pm

Re: Dynamisch Bezeichner interner Tabellenfelder ausgeben

Postby Matilda2566 » Fri Oct 07, 2011 9:25 pm

Hallo Leute,

vielen Dank für Eure vielen Antworten :!:

Es freut sich sehr der Kleine Eisbär :)
Matilda2566
...
...
 
Posts: 299
Joined: Fri Aug 24, 2007 11:47 am


Return to ABAP Objects®

Who is online

Users browsing this forum: No registered users and 12 guests