Code: Alles auswählen.
SELECT * FROM sflight INTO TABLE @DATA(lt_sflight).
TRY.
cl_salv_table=>factory(
IMPORTING
r_salv_table = DATA(lr_salv)
CHANGING
t_table = lt_sflight
).
CATCH cx_salv_msg.
ENDTRY.
DATA(lr_salv_columns) = lr_salv->get_columns( ).
DATA(lr_salv_column) = lr_salv_columns->get_column( 'PRICE' ).
* lr_salv_columns->set_optimize( if_salv_c_bool_sap=>true ). " Alle Spalten -> geht
lr_salv_column->set_optimized( if_salv_c_bool_sap=>true ). " Einzelne Spalte -> geht nicht
lr_salv->display( ).
Danke, den hatte ich schon gelesen. Da werden auch alle Spalten optimiert. Das funktioniert bei mir auch, wie oben geschrieben. Aber nur eine einzelne Spalte eben nicht.wreichelt hat geschrieben: ↑17.02.2022 09:17Hallo,
hier ein älterer Beitrag dazu:
https://blogs.sap.com/2012/05/22/workin ... salvtable/
Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag (Insgesamt 3):
ewx • Murdock • sap_enthusiast
Code: Alles auswählen.
PARAMETERS p_mat AS CHECKBOX DEFAULT space.
PARAMETERS p_net AS CHECKBOX DEFAULT space.
START-OF-SELECTION.
TYPES: BEGIN OF ts_demo,
matnr TYPE matnr,
werks TYPE werks_d,
netwr TYPE kbetr,
waerk TYPE waerk,
END OF ts_demo,
tt_demo TYPE STANDARD TABLE OF ts_demo WITH DEFAULT KEY.
DATA(demo) = VALUE tt_demo(
( matnr = 'ABCD' werks = '1000' netwr = 100 waerk = 'EUR' )
( matnr = 'XYZ' werks = '1000' netwr = 300 waerk = 'EUR' )
( matnr = 'A120' werks = '2000' netwr = 555500 waerk = 'JPY' )
( matnr = 'B130' werks = '3000' netwr = 100000 waerk = 'USD' ) ).
WRITE space.
TRY.
cl_salv_table=>factory(
EXPORTING
r_container = cl_gui_container=>screen0
IMPORTING
r_salv_table = DATA(salv)
CHANGING
t_table = demo ).
IF p_mat = abap_true.
salv->get_columns( )->get_column( 'MATNR' )->set_optimized( abap_true ).
ENDIF.
IF p_net = abap_true.
salv->get_columns( )->get_column( 'NETWR' )->set_optimized( abap_true ).
ENDIF.
salv->display( ).
CATCH cx_salv_msg cx_salv_not_found INTO DATA(lo_salv_error).
MESSAGE lo_salv_error TYPE 'E'.
ENDTRY.
Danke für Dein Beispielprogramm. Mach die Ausgabe mal ohne Container, es sieht so aus als ob es daran liegt, dass es mal gemacht wird und mal nicht.ewx hat geschrieben: ↑17.02.2022 10:18Ich habe das gerade mit Minidaten getestet und da funktioniert es einwandfrei.
Wäre also interessant, ob das Funktionieren der Spaltenoptimierung tatsächlich von der Datenmenge abhängt.
nach einem kurzen Test mit 400.000 Datensätzen funktioniert es allerdings auch einwandfrei.
beschreibt aber nicht wirklich den Fehler...SAP Note 1009650 hat geschrieben: [12] Innerhalb des ALV Grids wird aus Performancegründen nur beim ersten Aufruf die optimale Spaltenbreite berechnet.
Wird für die Gridinstanz die Methode CL_GUI_ALV_GRID->REFRESH_TABLE_DISPLAY aufgerufen, wird nicht erneut optimiert.
Um eine erneute Optimierung zu erzwingen, müssen vor dem Aufruf der Methode CL_GUI_ALV_GRID->REFRESH_TABLE_DISPLAY die Methoden CL_GUI_ALV_GRID->GET_FRONTEND_LAYOUT und CL_GUI_ALV_GRID->SET_FRONTEND_LAYOUT aufgerufen werden. Die Übergabe des Parameters CWIDTH_OPT = 'X' garantiert eine erneute Berechnung der Spaltenbreiten.
Im Objektmodell des ALV (Paket SALV_OM) muss vor dem Aufruf der Methode cl_salv_table->refresh die Spaltenoptimierung über den Aufruf der Methode cl_salv_columns->set_optimize erneut gesetzt werden.
Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag (Insgesamt 2):
Murdock • a-dead-trousers
Das sagt schon alles.SAP Note 1009650 hat geschrieben:... aus Performancegründen ...
Bei meiner Recherche damals bin ich im sog. Fullscreen Adapter des SALV (CL_SALV_FULLSCREEN_ADAPTER) fündig geworden. Ich glaub sogar mit einem Kommentar versehen, wird das CWIDTH_OPT beim Erstaufruf eben nicht an das ALV-Grid übergeben.