ALV Feldkatalog automatisch generieren

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

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

ALV Feldkatalog automatisch generieren

Beitrag von Pinguincommander (ForumUser / 88 / 62 / 2 ) »
Hallo alle miteinander,

ich bin auf der Suche nach einem Baustein oder einer Methode die mir einen Feldkatalog anhand einer Tabelle oder Struktur generiert,
könnt ihr mir da weiterhelfen ? ich habe die SUFU schon stark darum bemüht jedoch bin ich vorallem auf den FuBA:
REUSE_ALV_FIELDCATALOG_MERGE
gestoßen, welcher bei mir nicht funktionieren will, zur info:
meine ergebnisstabelle bezieht ihre daten aus mehrere tabellen 90% der felde sind mit like deklariert nur ein paar technische Felder nicht,
ich möchte mir meinen Feldkatalog nicht jedesmal von hand zusammenbauen, im übrigen benutze ich das ALV aus der klasse cl_gui_alv_grid.

Ich hoffe irgendwer von euch kann mir sagen wie man das ganze ordentlich macht, dazu noch der Quellcode, für den Fall das ich das ganze einfach nur falsch aufrufe.

Code: Alles auswählen.

CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
   EXPORTING
     i_program_name               = sy-repid
     i_internal_tabname           = 'I_DATA1'
*   I_STRUCTURE_NAME             =
   I_CLIENT_NEVER_DISPLAY       = 'X'
     i_inclname                   = 'ZRFT_FEHLTEILE_GESAMT_DATA'
*   I_BYPASSING_BUFFER           =
*   I_BUFFER_ACTIVE              =
    CHANGING
      ct_fieldcat                  = t_fieldcat_slis
   EXCEPTIONS
     inconsistent_interface       = 1
     program_error                = 2
     OTHERS                       = 3
            .
Grüße Pingu

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


Re: ALV Feldkatalog automatisch generieren

Beitrag von a-dead-trousers (Top Expert / 4399 / 223 / 1182 ) »
hi!

Ich kenn nur die Variante über den CL_SALV_TABLE, damit man eine im Programm definierte Tabelle angezeigt bekommt.
Du könntest dir aber auch die benötigten Teile aus der Klasse CL_SALV_DATA_DESCR herausholen und anstatt der Instanzierung eines CL_SALV_COLUMNS Objektes einen Feldkatalog zusammenstellen.
In dieser Klasse wird mittels RTTI die Struktur der Tabelle zur Laufzeit analysiert und damit der Feldkatalog (heißt hier CL_SALV_COLUMNS) befüllt.

lg ADT

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
Pinguincommander

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: ALV Feldkatalog automatisch generieren

Beitrag von ewx (Top Expert / 4849 / 313 / 642 ) »
Der Baustein hatte einen saublöden Fehler. Eine über TYPE STANDARD TABLE OF definierte Tabelle wird nicht "erkannt". Sie muss mit "WITH HEADER LINE OCCURS 0" definiert sein. Oder so ähnlich... Ich würde mir mal anschauen, was ADT geschrieben hat. das führt wahrscheinlich schneller zum Ziel.

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


Re: ALV Feldkatalog automatisch generieren

Beitrag von jensschladitz (Specialist / 417 / 0 / 56 ) »
Sali,

... data ls_structure type mard.
data it_comp_tab type standard table of abap_compdescr.

ref_structdescr ?= cl_abap_structdescr=>describe_by_data( p_data = ls_structure ).
it_comp_tab = ref_structdescr->components.

Gruss Jens

Folgende Benutzer bedankten sich beim Autor jensschladitz für den Beitrag:
Pinguincommander

thanks Jens

Re: ALV Feldkatalog automatisch generieren

Beitrag von a-dead-trousers (Top Expert / 4399 / 223 / 1182 ) »
hi!

Die Methode GET_COMPONENTS von CL_ABAP_STRUCTDESCR ist empfehlenswerter als nur auf das Attribut COMPONENTS abzufragen, weil man damit für jede Teilkomponente der Struktur einen weiteren DATADESCR erhält.
Den kann man dann (meistens) in einen ELEMDESCR casten ( ?= ) und mit diesem dann die DDIC Informationen direkt lesen (GET_DDIC_FIELD).

Siehe auch die Methode CL_SALV_DATA_DESCR=>READ_STRUCTDESCR. Als Ergebnis kriegt man hier eine Liste aller Felder zurück die man dann nur noch in einen Feldkatalog umwandeln muss.

lg ADT

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
Pinguincommander

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: ALV Feldkatalog automatisch generieren

Beitrag von Dele (Specialist / 307 / 4 / 47 ) »
wir haben uns dafür bereits vor vielen Jahren einen eigenen Funktionsbaustein geschrieben, der aus beliebigen in programmen definierte Strukuren einen ALV Feldkatalog aufbaut. Das hat den Vorteil, dass man nicht für jedes kleine Programm immer wieder DDIC-Strukturen anlegen muss.
Ausserdem verwenden wir diesen Baustein, um die Feldlisten für Selects aufzubauen.

gruß dele

Folgende Benutzer bedankten sich beim Autor Dele für den Beitrag:
Pinguincommander


Re: ALV Feldkatalog automatisch generieren

Beitrag von Alexander D. (Expert / 682 / 30 / 84 ) »
hallo dele,

darfst/magst du diesen Baustein hier im Forum posten?

Folgende Benutzer bedankten sich beim Autor Alexander D. für den Beitrag:
Pinguincommander

schöne Grüße
Alexander

ECC 6.0 EHP 7

Re: ALV Feldkatalog automatisch generieren

Beitrag von ewx (Top Expert / 4849 / 313 / 642 ) »
Dele hat geschrieben:wir haben uns dafür bereits vor vielen Jahren einen eigenen Funktionsbaustein geschrieben, der aus beliebigen in programmen definierte Strukuren einen ALV Feldkatalog aufbaut. Das hat den Vorteil, dass man nicht für jedes kleine Programm immer wieder DDIC-Strukturen anlegen muss.
Ausserdem verwenden wir diesen Baustein, um die Feldlisten für Selects aufzubauen.

gruß dele
Ein firmeneigenes Repository...! Respekt!! :up: (und das meine ich nicht ironisch!!)

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


Re: ALV Feldkatalog automatisch generieren

Beitrag von Dele (Specialist / 307 / 4 / 47 ) »
Hallo ewx,

@Repository
der Funktionsbaustein baut den Feldkatalog dynamisch zur Laufzeit auf. Es wird nichts in irgendwelchen DB-Tabellen gespeichert.
Der Funktionsbaustein speichert die Ergebnisse aus Performance Gründen im Shared Memory (macht ALV auch). Es wird bei Aufruf per Timestamp verglichen, ob das Programm sich zwischenzeitlich geändert hat. Wenn ja, dann wird der Feldkatalog aus der aktuellen Programmstrukur neu aufgebaut. Wenn nein, dann werden die Informationen aus dem SHM zurückgegeben.

mfg dele

p.s.
Für die Interessierten: die Strukturen werden nicht per RTTI ausgewertet, sondern mit der "internen" Variante des DESCRIBE Befehls: DESCRIBE ... INTO ....
Hat hauptsächlich historische Gründe, denn das RTTI gab es zum Zeitpunkt der Erstellung des Funktionsbausteines nicht nicht.

Folgende Benutzer bedankten sich beim Autor Dele für den Beitrag:
Pinguincommander


Re: ALV Feldkatalog automatisch generieren

Beitrag von Pinguincommander (ForumUser / 88 / 62 / 2 ) »
Hallo Leute erstmal fettes Danke an alle abschliesend auch nochmal den Quellcode damit mann dei Lösung auch mal sieht :-)

Code: Alles auswählen.

FORM create_fieldcat USING ls_structure
                     CHANGING ls_fieldcat TYPE lvc_s_fcat
                              lt_fieldcat TYPE lvc_t_fcat.

  DATA: ref_structdescr TYPE REF TO cl_abap_structdescr,
        lt_fields       TYPE        ddfields.
  DATA: lv_col_i TYPE i VALUE 0.
  FIELD-SYMBOLS: <fs_fields> TYPE line of ddfields.

  ref_structdescr ?= cl_abap_structdescr=>describe_by_data(
                                          p_data = ls_structure
                                          ).

  CALL METHOD cl_salv_data_descr=>read_structdescr
    EXPORTING
      r_structdescr = ref_structdescr
    RECEIVING
      t_dfies       = lt_fields.
  
  LOOP AT lt_fields ASSIGNING <fs_fields>.
    ls_fieldcat-fieldname  = <fs_fields>-fieldname.  "Feldname
    ls_fieldcat-tabname    = <fs_fields>-tabname.    "LVC-Tabname ?
    ls_fieldcat-scrtext_l  = <fs_fields>-scrtext_l.  "feldbezeichner L
    ls_fieldcat-scrtext_m  = <fs_fields>-scrtext_m.  "feldbezeichner M
    ls_fieldcat-scrtext_s  = <fs_fields>-scrtext_s.  "feldbezeichner s
    ls_fieldcat-ref_field  = <fs_fields>-reffield.   "referenzfeld
    ls_fieldcat-ref_table  = <fs_fields>-reftable.   "referenztabelle
  ENDLOOP.
ENDFORM.

Re: ALV Feldkatalog automatisch generieren

Beitrag von Alexander D. (Expert / 682 / 30 / 84 ) »
Pinguincommander hat geschrieben:Hallo Leute erstmal fettes Danke an alle abschliesend auch nochmal den Quellcode damit mann dei Lösung auch mal sieht :-)
danke für das Beispiel! Für 4.7 ist das Beispiel leider nicht zu verwenden, cl_salv_data_descr ist dort nicht vorhanden :(
schöne Grüße
Alexander

ECC 6.0 EHP 7

Re: ALV Feldkatalog automatisch generieren

Beitrag von Tron (Top Expert / 1327 / 35 / 332 ) »
Sei nicht traurig Alex :wink:

Eine 4.7 Version:

Code: Alles auswählen.

*&---------------------------------------------------------------------*
*& Report  ZDEBUG2                                                     *
*&                                                                     *
*&---------------------------------------------------------------------*
*&                                                                     *
*&                                                                     *
*&---------------------------------------------------------------------*

REPORT  zdebug2                                                     .

DATA tgfld TYPE rfieldlist OCCURS 0 WITH HEADER LINE.
DATA tgstr TYPE rstrucinfo OCCURS 0 WITH HEADER LINE.
DATA ls_fcat TYPE lvc_s_fcat .
DATA lt_fcat TYPE TABLE OF lvc_s_fcat.

DATA :
t0 TYPE TABLE OF sflight WITH HEADER LINE,
t1 TYPE TABLE OF sflight ,
t3 TYPE sflight.

* gesuchte Tabellen Namen
DATA s1(10) VALUE 'T1'.
DATA s2(10) VALUE 'T1[]'.

FIELD-SYMBOLS: <li> TYPE ANY.
DATA dref TYPE REF TO data.

FIELD-SYMBOLS: <itab> TYPE ANY TABLE.




ASSIGN t1 TO <itab>.





* Read all used Var-names of the CALLER
CALL FUNCTION 'GET_GLOBAL_SYMBOLS'
  EXPORTING
    program      = sy-repid
*      NAME_PATTERN = '*'
*      NAME_PATTERN = %VAR
  TABLES
    fieldlist    = tgfld.

* Check Object is a Structure or Table
CHECK NOT tgfld[] IS INITIAL.


LOOP AT tgfld WHERE type = 'h' AND ( name = s1 OR name = s2 ).

* Workaround für Headerlose ITABs
  CREATE DATA dref LIKE LINE OF <itab>.
  ASSIGN dref->* TO <li>.

  CALL FUNCTION 'GET_COMPONENT_LIST'
    EXPORTING
      program    = sy-repid
      fieldname  = '<LI>'
    TABLES
      components = tgstr.
  EXIT.
ENDLOOP.


LOOP AT tgstr.
  CLEAR ls_fcat.
  ls_fcat-row_pos   = sy-tabix.
  ls_fcat-tabname   = tgfld-name.
  ls_fcat-fieldname = tgstr-compname.
*         ls_fcat-inttype   = 'C'.
  ls_fcat-inttype   = tgstr-type.
  ls_fcat-intlen    = tgstr-leng.
  ls_fcat-coltext   = tgstr-compname.
*         ls_fcat-scrtext_s = ls_fcat-fieldname.
*         ls_fcat-scrtext_m = ls_fcat-fieldname.
*         ls_fcat-scrtext_l = ls_fcat-fieldname.
  APPEND ls_fcat TO lt_fcat.

ENDLOOP.

break sapuser.
gruß Jens
@ewx
Der Baustein hatte einen saublöden Fehler. Eine über TYPE STANDARD TABLE OF definierte Tabelle wird nicht "erkannt". Sie muss mit "WITH HEADER LINE OCCURS 0" definiert sein. Oder so ähnlich...
Ein ähnliches Problem hat der FUBA 'GET_COMPONENT_LIST' auch, aber siehe workaround im coding !
Genaugenommen verarbeitet GET_COMPONENT_LIST nur Strukturen, daher muß man sich eine Zeile der ITAB erzeugen.

Folgende Benutzer bedankten sich beim Autor Tron für den Beitrag:
Alexander D.

<:: XING-Gruppe Tricktresor::>
Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen –
Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

Re: ALV Feldkatalog automatisch generieren

Beitrag von Alexander D. (Expert / 682 / 30 / 84 ) »
danke, Jens, das geht schon mal in die richtige Richtung. Leider zieht GET_COMPONENT_LIST die Beschreibung der Datenelemente nicht. Mein Ansatz war hierbei diese über die Tabelle dd04t nachzulesen, das scheitert daran, dass GET_COMPONENT_LIST mir nur die Feldnamen, aber nicht die dazu passenden Datenelemente liefert...
schöne Grüße
Alexander

ECC 6.0 EHP 7

Re: ALV Feldkatalog automatisch generieren

Beitrag von Tron (Top Expert / 1327 / 35 / 332 ) »
Moin,
das stimmt, allerdings erfährt man aus der tgfld-REFTYPELOC, ob es DDIC-Bezug hat und welches die Ref-Tabelle ist.

Code: Alles auswählen.

NAME	C	30 	T0
TYPE	C	1 	u
LENG	N	5 	00080
OLEN	N	3 	000
DECS	N	3 	000
FLITL	C	1 	                                                                                
REFTYPELOC	C	4 	DDIC
REFTYPENAM	C	61 	SFLIGHT
So DDIC - Bezug existiert, kann man z.B. mit CALL FUNCTION 'DDIF_FIELDINFO_GET' den Rest ermitteln.
Interssant wird es bei Selbst zusammengestellten ITABS. Hier ist eine genaue Typisierung erforderlich.
Z.B.

Code: Alles auswählen.

 data mat type mara-matnr
und nicht

Code: Alles auswählen.

 data mat(18)
Wie es sein sollte:

Code: Alles auswählen.

NAME	C	30 	MAT
TYPE	C	1 	C
LENG	N	5 	00018
OLEN	N	3 	018
DECS	N	3 	000
FLITL	C	1 	                                                                                
REFTYPELOC	C	4 	DDIC
REFTYPENAM	C	61 	MARA-MATNR
Hier kann man dann aus der Tabelle dd04t lesen.

(DDIC kann ja jeder :wink: )
gruß Jens
<:: XING-Gruppe Tricktresor::>
Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen –
Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

Re: ALV Feldkatalog automatisch generieren

Beitrag von Alexander D. (Expert / 682 / 30 / 84 ) »
irgendwie stehe ich bei diesem Thema auf dem Schlauch...

interne Tabellen definiere ich meisstens in dieser Art hier:

Code: Alles auswählen.

    TYPES: BEGIN OF t_mara,
      matnr LIKE mara-matnr,
      ersda TYPE ersda,
      ernam LIKE mara-ernam,
      maktx TYPE maktx,
    END OF t_mara.

    DATA: t1 TYPE STANDARD TABLE OF t_mara WITH DEFAULT KEY.
in der tgfld habe ich damit noch keinen DDIC-Bezug, dieser könnte ja eigentlich erst sichtbar werden, wenn ich mir das Ergebnis von GET_COMPONENT_LIST (tgstr) anschaue. Der Baustein liest aber den Bezug nicht aus...
schöne Grüße
Alexander

ECC 6.0 EHP 7

Vergleichbare Themen

1
Antw.
3178
Views
3
Antw.
15236
Views
IBAN automatisch generieren
von Gast » 31.01.2005 16:14 • Verfasst in Financials
17
Antw.
22445
Views
Feldkatalog für ALV
von Kerstin » 17.08.2007 10:03 • Verfasst in ABAP Objects®
16
Antw.
4598
Views
Feldkatalog -> Spaltenüberschriften
von Bugfix13 » 06.08.2014 08:43 • Verfasst in ABAP® für Anfänger
7
Antw.
4861
Views
ALV: Refresh Feldkatalog
von khr » 27.09.2013 10:06 • Verfasst in ABAP® Core

Über diesen Beitrag


Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

Regex in where
vor 2 Stunden von edwin 7 / 162
Daten an Tabelle binden
vor 16 Stunden von Bright4.5 3 / 1486

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

Regex in where
vor 2 Stunden von edwin 7 / 162
Daten an Tabelle binden
vor 16 Stunden von Bright4.5 3 / 1486

Unbeantwortete Forenbeiträge

aRFC im OO-Kontext
vor 5 Wochen von ralf.wenzel 1 / 3261
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9821