Hallo zusammen.
Nachdem ich nun schon des Öfteren über Programme gestolpert bin, in denen versucht wird die Vorteile des SALV (einfaches Handling) mit denen des ALV (Editierbarkeit) zu verbinden, die aber nach meinem Verständnis eher schlecht als recht implementiert wurden, hier eine kurze Hilfestellung wie man es besser machen kann.
Ein Hauptproblem beim ALV, zumindest für mich, ist das möglichst effiziente Generieren des Feldkatalogs. Als ein Entwickler der von der Pieke auf mit Klassen gearbeitet hat, war mir die Verwendung von Funktionsbausteinen schon immer sehr suspekt. Von daher ist meine Abneigung zu LVC_FIELDCATALOG_MERGE oder wie die ganzen Funktionsbausteine zu dem Thema auch heißen mögen, die intern noch dazu mit GENERATE SUBROUTINE POOL arbeiten, hoffentlich verständlich.
Was also tun?
Der Dreh- und Angelpunkt der Spalten im SALV generell ist die Klasse CL_SALV_COLUMNS und für den SALV-Table im Speziellen ist es die Klasse CL_SALV_COLUMNS_LIST. Die kann man auch außerhalb der FACTORY-Methode instanzieren und so für eigene Zwecke verwenden. Bleiben noch die Fragen wie man die Instanz möglichst effizient mit Daten befüllen kann und wie man daraus einen Feldkatalog kreiert bekommt. Bei ersterer hilft die FACTORY-Methode des SALV bzw. die dort aufgerufene Methode SET_DATA sehr gut weiter. Die kleine, unscheinbare aber nicht minder mächtige Klasse CL_SALV_DATA_DESCR wird dort für die Erzeugung der Spalten verwendet. Bleibt noch die Frage wie man im Anschluss daraus den Feldkatalog erzeugen kann. Nun, der SALV verwendet intern zur Darstellung der Daten ein gewöhnliches ALV. Von daher muss es doch irgendwo eine Methode geben die den Feldkatalog für das ALV generiert, oder? Bingo. CL_SALV_CONTROLLER_METADATA.
Wenn man nun diese drei Klassen kombiniert erhällt man einen brauchbaren Feldkatalog:
Code: Alles auswählen.
FORM get_fieldcat USING ut_table TYPE ANY TABLE
CHANGING ct_fieldcat TYPE lvc_t_fcat.
DATA:
lr_table TYPE REF TO data,
lr_aggregations TYPE REF TO cl_salv_aggregations,
lr_columns TYPE REF TO cl_salv_columns_list.
GET REFERENCE OF ut_table INTO lr_table.
CREATE OBJECT lr_columns EXPORTING r_data = lr_table.
cl_salv_data_descr=>describe_table( r_columns = lr_columns
r_table = lr_table ).
ct_fieldcat = cl_salv_controller_metadata=>get_lvc_fieldcatalog( r_columns = lr_columns
r_aggregations = lr_aggregations ).
ENDFORM.
Zum allgemeinen Verständnis hab ich die Implementierung in einer FORM-Routine und in der "klassischen" Syntax ausgeführt. Natürlich spricht nichts dagegen, aus dem Codeschnippsel eine Methode zu machen und mit weiteren Goodies anzureichern.
Die Instanz von CL_SALV_AGGREGATIONS wird hier nur als Platzhalter verwendet, weil die Schnittstelle von GET_LVC_FIELDCATALOG den Parameter zwingend verlangt.
so long.
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