SALV einzelne Spaltenbreite optimieren

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).
9 Beiträge • Seite 1 von 1
9 Beiträge Seite 1 von 1

SALV einzelne Spaltenbreite optimieren

Beitrag von Murdock (Specialist / 115 / 55 / 8 ) »
Hi,

ich möchte in einem SALV eine einzelne Spaltenbreite "längenoptimieren". "Überall" liest man, das ginge mittels der Methode cl_salv_column->set_optimized.
Das funktioniert aber nicht. Was geht, ist alle Spaltenbreiten zu optimieren (cl_salv_columns_table->set_optimize).

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( ).


Hat jemand eine Idee dazu?

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


Re: SALV einzelne Spaltenbreite optimieren

Beitrag von wreichelt (Top Expert / 1031 / 29 / 188 ) »
Hallo,

hier ein älterer Beitrag dazu:

https://blogs.sap.com/2012/05/22/workin ... salvtable/

Gruß Wolfgang

Folgende Benutzer bedankten sich beim Autor wreichelt für den Beitrag:
Murdock


Re: SALV einzelne Spaltenbreite optimieren

Beitrag von Murdock (Specialist / 115 / 55 / 8 ) »
wreichelt hat geschrieben:
17.02.2022 09:17
Hallo,

hier ein älterer Beitrag dazu:

https://blogs.sap.com/2012/05/22/workin ... salvtable/
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.

Re: SALV einzelne Spaltenbreite optimieren

Beitrag von a-dead-trousers (Top Expert / 4285 / 214 / 1141 ) »
Ich weiß jetzt nicht, ob dir das weiterhilft oder nicht:
Wir hatten ein ähnliches Problem, dass die allgemeine Spaltenoptimierung (lr_salv_columns->set_optimize) in bestimmten Fällen im SALV nicht funktioniert. Nach einigem Debuggen bin ich dann drauf gekommen, dass das irgendwie mit dem "Nachladen" des ALV-Grid zusammenhängt.
Dieses überträgt die Daten bei großen Mengen ja nicht in einem Rutsch sondern erst wenn man in den jeweiligen Bereich scrolt. Sieht man schön z.B. in der SE16 bei großen Tabellen wenn man ganz ans Ende scrolt.
Dazu werden die Daten in Pakete aufgeteilt. Wenn nun die Datenmenge so gering ist, dass nur ein einziges Paket benötigt wird, wird aus irgendeinem unerfindlichen Grund die Spaltenoptimierung NICHT ausgeführt. Erst wenn mehr als ein Paket übertragen wurde, werden die Spalten in der Größe angepasst. Das Verhalten tritt aber auch nur beim Erstaufruf des SALV auf. Bei allen weiteren Aufrufen wird die Optimierung durchgeführt, egal wie groß die Datenmenge ist.
Daher habe ich eine Lösung entwickelt, die direkt nach dem ersten PBO des Dynpros einen (versteckten) Funktionscode auslöst (Fub SAPGUI_SET_FUNCTIONCODE). Diesen erkenne ich dann im PAI und mache nichts anderes als die Optimierung (lr_salv_columns->set_optimize) nochmal zu setzen.
Man sieht dann zwar ein kurzes "Flackern" des ALV-Grid aber die Spaltenoptimierung funktioniert danach wie erwartet.

Wie gesagt, hab ich das bislang nur für die allgemeine Spaltenoptimierung so gelöst, es würde mich aber nicht wundern, dass das auch in der individuellen Spaltenoptimierung helfen könnte.

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag (Insgesamt 3):
ewxMurdocksap_enthusiast

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: SALV einzelne Spaltenbreite optimieren

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
Ich habe das gerade mit Minidaten getestet und da funktioniert es einwandfrei.

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

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


Re: SALV einzelne Spaltenbreite optimieren

Beitrag von Murdock (Specialist / 115 / 55 / 8 ) »
ewx hat geschrieben:
17.02.2022 10:18
Ich 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.
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.

Re: SALV einzelne Spaltenbreite optimieren

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
stimmt. ohne eigenen Container funktioniert es nicht mehr.
habe das hier gefunden:
https://launchpad.support.sap.com/#/notes/1009650
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.
beschreibt aber nicht wirklich den Fehler...

Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag (Insgesamt 2):
Murdocka-dead-trousers


Re: SALV einzelne Spaltenbreite optimieren

Beitrag von a-dead-trousers (Top Expert / 4285 / 214 / 1141 ) »
SAP Note 1009650 hat geschrieben:... aus Performancegründen ...
Das sagt schon alles.
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: SALV einzelne Spaltenbreite optimieren

Beitrag von a-dead-trousers (Top Expert / 4285 / 214 / 1141 ) »
ewx hat geschrieben:
17.02.2022 11:19
stimmt. ohne eigenen Container funktioniert es nicht mehr.
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.

Die SAP hat das Ganze ja nochmal um die REUSE-Bausteine herumgebaut. 🤮
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

Seite 1 von 1

Vergleichbare Themen

1
Antw.
1163
Views
sALV einzelne Spalten unabhängig von einander optimieren
von Dominic » 20.09.2018 10:32 • Verfasst in ABAP® Core
3
Antw.
2949
Views
Spaltenbreite auf ALV Grid optimieren
von Mario » 06.10.2004 15:00 • Verfasst in ABAP® Core
3
Antw.
3935
Views
Spaltenbreite auf ALV Grid mit Methode optimieren
von Mario » 06.10.2004 17:15 • Verfasst in ABAP Objects®
6
Antw.
2853
Views
Laufzeit optimieren!
von made » 27.06.2005 11:54 • Verfasst in ABAP® Core
5
Antw.
1059
Views
Geschwindigkeit Optimieren bei Loop und Zuweisung
von autohandel7 » 15.01.2019 10:24 • Verfasst in ABAP® für Anfänger

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.