Problem z optymalizacją kolumn w ALV.

Jeśli programujesz, administrujesz, integrujesz i masz wątpliwość lub obawę, to właśnie najlepsze miejsce dla Ciebie. Pisz śmiało...
natanielg
Posty: 16
Rejestracja: wt kwie 12, 2022 12:42 pm
Has thanked: 4 times
Been thanked: 5 times

Problem z optymalizacją kolumn w ALV.

Post autor: natanielg »

Cześć, tak jak w temacie od dłuższego czasu borykam się z problemem że ALV które tworzę nie dostosowuje szerokości kolumny do najszerszego rekordu. Czy jest ktoś w stanie przeanalizować kod który wkleję i powiedzieć mi co robię źle?

Kod: Zaznacz cały

*&---------------------------------------------------------------------*
*& Include          ZTM_CUSTOMER_ZONE_VIEW
*&---------------------------------------------------------------------*
CLASS lcl_view DEFINITION FINAL.
  PUBLIC SECTION.
    CONSTANTS mc_dynnr  TYPE sy-dynnr VALUE '0100'.
    DATA: mr_alv TYPE REF TO cl_gui_alv_grid,
          mr_cc  TYPE REF TO cl_gui_custom_container.
    DATA: mt_fcat TYPE lvc_t_fcat.
    METHODS:
      constructor    IMPORTING it_data TYPE tt_alv, 
      display,
      build_alv      IMPORTING iv_dynnr      TYPE sy-dynnr,
      run_scr_module IMPORTING iv_mod        TYPE char3,
      refresh_alv.
    METHODS:
      handle_toolbar      FOR EVENT toolbar OF cl_gui_alv_grid IMPORTING e_object e_interactive,
      handle_user_command FOR EVENT user_command OF cl_gui_alv_grid IMPORTING e_ucomm.
  PROTECTED SECTION.
  PRIVATE SECTION.
    DATA: mt_data TYPE tt_alv. " 
    METHODS:
      build_fcat IMPORTING it_data_structure TYPE ANY TABLE
                 EXPORTING et_fieldcat       TYPE lvc_t_fcat,
      set_layout EXPORTING es_layout TYPE lvc_s_layo,
      modify_fieldcatalog CHANGING ct_fieldcat TYPE lvc_t_fcat,
      run_pbo,
      run_pai    RETURNING VALUE(ev_ucomm) TYPE syucomm.
ENDCLASS.
CLASS lcl_view IMPLEMENTATION.
  METHOD constructor.
    mt_data[] = it_data[].
  ENDMETHOD.                    "constructor
  METHOD display.
    CALL SCREEN 0100. "mc_dynnr.
  ENDMETHOD.
  METHOD run_scr_module.
    CASE iv_mod.
      WHEN 'PBO'.
        run_pbo( ).
      WHEN 'PAI'.
        run_pai( ).
    ENDCASE.
  ENDMETHOD.                    "run_scr_module
  METHOD run_pbo.
***********************************************************
* PBO
***********************************************************
    SET PF-STATUS 'STATUS_0100'.
    SET TITLEBAR 'TITLE_0100'.
    build_alv( mc_dynnr ).
  ENDMETHOD.                    "run_pbo
  METHOD run_pai.
***********************************************************
*  PAI - ev_ucomm: user command
**********************************************************
    CASE sy-ucomm.
      WHEN 'BACK' OR 'CANCEL'.
        LEAVE TO SCREEN 0.
      WHEN 'EXIT'.
        LEAVE PROGRAM.
      WHEN OTHERS.
        ev_ucomm = sy-ucomm.
    ENDCASE.
  ENDMETHOD.                    "run_pai
  METHOD build_alv.
***********************************************************
* Print ALV
***********************************************************
    DATA: "lt_fcat   TYPE lvc_t_fcat,
      ls_layo   TYPE lvc_s_layo,
      lv_title  TYPE lvc_title,
      ls_layout TYPE disvariant.
    DATA: ls_stable TYPE lvc_s_stbl.
    CLEAR ls_stable.
    FIELD-SYMBOLS: <lt_tab>  TYPE ANY TABLE.
    ASSIGN mt_data TO <lt_tab>.
    CHECK sy-subrc = 0.
    IF mr_cc IS NOT BOUND.
      CREATE OBJECT mr_cc
        EXPORTING
          container_name = 'CC_0100'
        EXCEPTIONS
          OTHERS         = 99.
      IF sy-subrc = 0.
        CREATE OBJECT mr_alv
          EXPORTING
            i_parent = mr_cc
*           i_appl_events = 'X'
          EXCEPTIONS
            OTHERS   = 99.
        IF sy-subrc = 0.
          SET HANDLER handle_toolbar      FOR mr_alv.
          SET HANDLER handle_user_command FOR mr_alv.
          REFRESH mt_fcat.
          build_fcat( EXPORTING it_data_structure = <lt_tab>
                      IMPORTING et_fieldcat = mt_fcat ).
          modify_fieldcatalog( CHANGING ct_fieldcat = mt_fcat ).
          set_layout( IMPORTING es_layout = ls_layo ).
          ls_layout-report = sy-repid.
          ls_layout-username = sy-uname. "To jest ważne
          ls_layout-handle = 'AML'. "To jest ważne
          "CALL METHOD mr_alv_new->set_table_for_first_display
          CALL METHOD mr_alv->set_table_for_first_display
            EXPORTING
              is_variant      = ls_layout
              is_layout       = ls_layo
              i_save          = 'A'
            CHANGING
              it_outtab       = <lt_tab>
              it_fieldcatalog = mt_fcat
            EXCEPTIONS
              OTHERS          = 99.
          ls_stable-row = 'X'.
          ls_stable-col = 'X'.
          CALL METHOD mr_alv->set_ready_for_input
            EXPORTING
              i_ready_for_input = 0.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDMETHOD.                    "build_alv
  METHOD build_fcat.
    CLEAR: et_fieldcat[].
    CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
      EXPORTING
        i_structure_name       = 'ZTM_CUSTOMER_ZONE_ALV_ST' "
        i_client_never_display = 'X'
      CHANGING
        ct_fieldcat            = et_fieldcat[].
  ENDMETHOD.                    "build_fcat
  METHOD set_layout.
*    es_layout-grid_title = TEXT-003.
    es_layout-cwidth_opt = 'X'.
   es_layout-col_opt = 'X'.
    es_layout-zebra = 'X'.
    es_layout-no_keyfix = 'X'.
    "es_layout-no_rowmark = 'X'.
    es_layout-sel_mode = 'A'.
*    es_layout-info_fname = 'ROWCOLOR'.
*     es_layout-ctab_fname = 'CELLCOLOR'.
  ENDMETHOD.                    "set_layout
  METHOD modify_fieldcatalog.
    FIELD-SYMBOLS: <lf_fcat> TYPE lvc_s_fcat,<fs_temp> TYPE any,<fs_text> TYPE any.
    DATA: lv_message(8),
          lv_index(10).
* modyfikacja ALV
    LOOP AT ct_fieldcat ASSIGNING <lf_fcat>.
*      <lf_fcat>-col_opt = 'X'.
      CASE <lf_fcat>-fieldname.
        WHEN 'ORT01'.<lf_fcat>-style = 4.
        WHEN 'STRAS'.<lf_fcat>-style = 4.
        WHEN OTHERS.
      ENDCASE.
    ENDLOOP.
  ENDMETHOD.                    "modify_fieldcatalog
  METHOD refresh_alv.
    mr_alv->refresh_table_display( ).
  ENDMETHOD.                    "refresh_alv
  METHOD handle_toolbar.
  ENDMETHOD.
  METHOD handle_user_command.
  ENDMETHOD.
ENDCLASS.
dominik.tylczynski
Posty: 8326
Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1915 times
Been thanked: 1474 times
Kontakt:

Re: Problem z optymalizacją kolumn w ALV.

Post autor: dominik.tylczynski »

Zobacz notę 1009650 - Consulting: Standard behavior in the ALV
[12] Within the ALV Grid, the system calculates the optimal column width only during the first call due to performance reasons.
If the method CL_GUI_ALV_GRID->REFRESH_TABLE_DISPLAY is called for the grind instance, the system does not optimize the grid again.
To force a new optimization, the methods CL_GUI_ALV_GRID->GET_FRONTEND_LAYOUT (GET_FRONTEND_FIELDCATALOG) and CL_GUI_ALV_GRID->SET_FRONTEND_LAYOUT (SET_FRONTEND_FIELDCATALOG) must be called before the call of the method CL_GUI_ALV_GRID->REFRESH_TABLE_DISPLAY. The transfer of the parameter CWIDTH_OPT = 'X' (COL_OPT = 'X') ensures that the optimized column widths are recalculated.
natanielg
Posty: 16
Rejestracja: wt kwie 12, 2022 12:42 pm
Has thanked: 4 times
Been thanked: 5 times

Re: Problem z optymalizacją kolumn w ALV.

Post autor: natanielg »

Już próbowałem to robić ale coś w moim kodzie jest nie tak, bo po wywołaniu metody REFRESH_TABLE_DISPLAY zwraca mi błąd programu :(
dominik.tylczynski
Posty: 8326
Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1915 times
Been thanked: 1474 times
Kontakt:

Re: Problem z optymalizacją kolumn w ALV.

Post autor: dominik.tylczynski »

natanielg pisze: wt mar 07, 2023 3:35 pm Już próbowałem to robić ale coś w moim kodzie jest nie tak, bo po wywołaniu metody REFRESH_TABLE_DISPLAY zwraca mi błąd programu :(
Jaki błąd zwraca?
natanielg
Posty: 16
Rejestracja: wt kwie 12, 2022 12:42 pm
Has thanked: 4 times
Been thanked: 5 times

Re: Problem z optymalizacją kolumn w ALV.

Post autor: natanielg »

Dokładnie coś takiego:
Załączniki
84d32980-0e73-4ab4-866d-32d9112c3f52.jpg
84d32980-0e73-4ab4-866d-32d9112c3f52.jpg (12.77 KiB) Przejrzano 311 razy
dominik.tylczynski
Posty: 8326
Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1915 times
Been thanked: 1474 times
Kontakt:

Re: Problem z optymalizacją kolumn w ALV.

Post autor: dominik.tylczynski »

Jaki jest numer tego komunikatu? Z której metody to idzie?
natanielg
Posty: 16
Rejestracja: wt kwie 12, 2022 12:42 pm
Has thanked: 4 times
Been thanked: 5 times

Re: Problem z optymalizacją kolumn w ALV.

Post autor: natanielg »

dominik.tylczynski pisze: wt mar 07, 2023 4:19 pm Jaki jest numer tego komunikatu? Z której metody to idzie?
Komunikat wygląda tak jak w załączniku.

Klasa jest lokalna i kod wygląda następująco:

deklaracja klasy ...

CLASS lcl_view DEFINITION DEFERRED.
DATA: lo_alv TYPE REF TO lcl_view.

wywołanie ...

CREATE OBJECT lo_alv EXPORTING it_data = gt_alv.
lo_alv->display( ).

Wyrzuca błąd po wejściu w metodę refresh_alv
Załączniki
38cb64f6-8556-4db6-8c4b-1b54e393d236.jpg
38cb64f6-8556-4db6-8c4b-1b54e393d236.jpg (16.14 KiB) Przejrzano 305 razy
dominik.tylczynski
Posty: 8326
Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1915 times
Been thanked: 1474 times
Kontakt:

Re: Problem z optymalizacją kolumn w ALV.

Post autor: dominik.tylczynski »

Spróbuj zmienić:

Kod: Zaznacz cały

          CALL METHOD mr_alv->set_table_for_first_display
            EXPORTING
              is_variant      = ls_layout
              is_layout       = ls_layo
              i_save          = 'A'
            CHANGING
              it_outtab       = <lt_tab>
              it_fieldcatalog = mt_fcat
            EXCEPTIONS
              OTHERS          = 99.

na:

Kod: Zaznacz cały

          CALL METHOD mr_alv->set_table_for_first_display
            EXPORTING
              is_variant      = ls_layout
              is_layout       = ls_layo
              i_save          = 'A'
            CHANGING
              it_outtab       = mt_data
              it_fieldcatalog = mt_fcat
            EXCEPTIONS
              OTHERS          = 99.
natanielg
Posty: 16
Rejestracja: wt kwie 12, 2022 12:42 pm
Has thanked: 4 times
Been thanked: 5 times

Re: Problem z optymalizacją kolumn w ALV.

Post autor: natanielg »

Niestety ale nadal ten sam problem. Wrzucam kod gdzie wywołuję metodę refresh

Kod: Zaznacz cały

METHOD build_alv.
***********************************************************
* Print ALV
***********************************************************
    DATA: "lt_fcat   TYPE lvc_t_fcat,
      ls_layo   TYPE lvc_s_layo,
      lv_title  TYPE lvc_title,
      ls_layout TYPE disvariant.
    DATA: ls_stable TYPE lvc_s_stbl.

    CLEAR ls_stable.

    FIELD-SYMBOLS: <lt_tab>  TYPE ANY TABLE.
    ASSIGN mt_data TO <lt_tab>.
    CHECK sy-subrc = 0.
    IF mr_cc IS NOT BOUND.

      CREATE OBJECT mr_cc
        EXPORTING
          container_name = 'CC_0100'
        EXCEPTIONS
          OTHERS         = 99.
      IF sy-subrc = 0.

        CREATE OBJECT mr_alv
          EXPORTING
            i_parent = mr_cc
*           i_appl_events = 'X'
          EXCEPTIONS
            OTHERS   = 99.
        IF sy-subrc = 0.

          SET HANDLER handle_toolbar      FOR mr_alv.
          SET HANDLER handle_user_command FOR mr_alv.
          REFRESH mt_fcat.
          build_fcat( EXPORTING it_data_structure = <lt_tab>
                      IMPORTING et_fieldcat = mt_fcat ).
          modify_fieldcatalog( CHANGING ct_fieldcat = mt_fcat ).
          set_layout( IMPORTING es_layout = ls_layo ).

          refresh_alv( ).
*          ls_layout-report = sy-repid.
*          ls_layout-username = sy-uname. "To jest ważne
*          ls_layout-handle = 'AML'. "To jest ważne

          CALL METHOD mr_alv->set_table_for_first_display
            EXPORTING
              is_variant      = ls_layout
              is_layout       = ls_layo
              i_save          = 'A'
            CHANGING
              it_outtab       = mt_data
              it_fieldcatalog = mt_fcat
            EXCEPTIONS
              OTHERS          = 99.

*          ls_stable-row = 'X'.
*          ls_stable-col = 'X'.

          CALL METHOD mr_alv->set_ready_for_input
            EXPORTING
              i_ready_for_input = 0.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDMETHOD.                    "build_alv
dominik.tylczynski
Posty: 8326
Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1915 times
Been thanked: 1474 times
Kontakt:

Re: Problem z optymalizacją kolumn w ALV.

Post autor: dominik.tylczynski »

Używaj tego przycisku jak wklejasz kod:
20230307_3423.png
20230307_3423.png (683 Bajtów) Przejrzano 285 razy
wojtas7
Posty: 1058
Rejestracja: pt mar 14, 2008 12:51 pm
Has thanked: 71 times
Been thanked: 313 times

Re: Problem z optymalizacją kolumn w ALV.

Post autor: wojtas7 »

wygląda na problem widzialności tabeli wewnętrznej mt_data.

Kod: Zaznacz cały

  PRIVATE SECTION.
    DATA: mt_data TYPE tt_alv. " 
musi być w PRIVATE?
dominik.tylczynski
Posty: 8326
Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1915 times
Been thanked: 1474 times
Kontakt:

Re: Problem z optymalizacją kolumn w ALV.

Post autor: dominik.tylczynski »

Po co robisz tutaj refresh_alv()?

Kod: Zaznacz cały

          set_layout( IMPORTING es_layout = ls_layo ).

          refresh_alv( ).
*          ls_layout-report = sy-repid.
*          ls_layout-username = sy-uname. "To jest ważne
*          ls_layout-handle = 'AML'. "To jest ważne
dominik.tylczynski
Posty: 8326
Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1915 times
Been thanked: 1474 times
Kontakt:

Re: Problem z optymalizacją kolumn w ALV.

Post autor: dominik.tylczynski »

wojtas7 pisze: wt mar 07, 2023 5:15 pm wygląda na problem widzialności tabeli wewnętrznej mt_data.

Kod: Zaznacz cały

  PRIVATE SECTION.
    DATA: mt_data TYPE tt_alv. " 
musi być w PRIVATE?
Powinno być w PUBLIC moim zdaniem
K602
Posty: 135
Rejestracja: śr sie 24, 2022 11:50 am
Has thanked: 60 times
Been thanked: 86 times
Kontakt:

Re: Problem z optymalizacją kolumn w ALV.

Post autor: K602 »

Oczywiście. Problemem jest dostęp do obiektu. Co do optymalizacji szerokości, to trzeba pamiętać, aby po zmianach np. wypełnieniu danymi wew. tabeli, ponownie wywołać optymalizatora szerokości kolumn.
SAP ABAP Certified Developer
natanielg
Posty: 16
Rejestracja: wt kwie 12, 2022 12:42 pm
Has thanked: 4 times
Been thanked: 5 times

Re: Problem z optymalizacją kolumn w ALV.

Post autor: natanielg »

dominik.tylczynski pisze: wt mar 07, 2023 5:15 pm
wojtas7 pisze: wt mar 07, 2023 5:15 pm wygląda na problem widzialności tabeli wewnętrznej mt_data.

Kod: Zaznacz cały

  PRIVATE SECTION.
    DATA: mt_data TYPE tt_alv. " 
musi być w PRIVATE?
Powinno być w PUBLIC moim zdaniem

Zmieniłem to na Public i nadal mam ten sam błąd. W takim razie metoda refresh, gdzie powinna być wywoływana? Przepraszam za tak z pozoru głupie pytania, cały czas się uczę i nie chcę więcej popełniać błędów.
ODPOWIEDZ