Ad blocker detected: Our website is made possible by displaying online advertisements to our visitors. Please consider supporting us by disabling your ad blocker on our website.
Jeśli programujesz, administrujesz, integrujesz i masz wątpliwość lub obawę, to właśnie najlepsze miejsce dla Ciebie. Pisz śmiało...
natanielg
Posty: 15 Rejestracja: wt kwie 12, 2022 12:42 pm
Has thanked: 4 times
Been thanked: 5 times
Post
autor: natanielg » wt mar 07, 2023 3:00 pm
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: 8071 Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1775 times
Been thanked: 1395 times
Post
autor: dominik.tylczynski » wt mar 07, 2023 3:16 pm
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: 15 Rejestracja: wt kwie 12, 2022 12:42 pm
Has thanked: 4 times
Been thanked: 5 times
Post
autor: natanielg » 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
dominik.tylczynski
Posty: 8071 Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1775 times
Been thanked: 1395 times
Post
autor: dominik.tylczynski » wt mar 07, 2023 3:55 pm
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: 15 Rejestracja: wt kwie 12, 2022 12:42 pm
Has thanked: 4 times
Been thanked: 5 times
Post
autor: natanielg » wt mar 07, 2023 4:03 pm
Dokładnie coś takiego:
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
dominik.tylczynski
Posty: 8071 Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1775 times
Been thanked: 1395 times
Post
autor: dominik.tylczynski » wt mar 07, 2023 4:19 pm
Jaki jest numer tego komunikatu? Z której metody to idzie?
natanielg
Posty: 15 Rejestracja: wt kwie 12, 2022 12:42 pm
Has thanked: 4 times
Been thanked: 5 times
Post
autor: natanielg » wt mar 07, 2023 4:24 pm
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
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
dominik.tylczynski
Posty: 8071 Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1775 times
Been thanked: 1395 times
Post
autor: dominik.tylczynski » wt mar 07, 2023 4:48 pm
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: 15 Rejestracja: wt kwie 12, 2022 12:42 pm
Has thanked: 4 times
Been thanked: 5 times
Post
autor: natanielg » wt mar 07, 2023 5:00 pm
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: 8071 Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1775 times
Been thanked: 1395 times
Post
autor: dominik.tylczynski » wt mar 07, 2023 5:14 pm
Używaj tego przycisku jak wklejasz kod:
20230307_3423.png
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
wojtas7
Posty: 1009 Rejestracja: pt mar 14, 2008 12:51 pm
Has thanked: 70 times
Been thanked: 290 times
Post
autor: wojtas7 » 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?
dominik.tylczynski
Posty: 8071 Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1775 times
Been thanked: 1395 times
Post
autor: dominik.tylczynski » wt mar 07, 2023 5:15 pm
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: 8071 Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1775 times
Been thanked: 1395 times
Post
autor: dominik.tylczynski » 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
K602
Posty: 82 Rejestracja: śr sie 24, 2022 11:50 am
Has thanked: 31 times
Been thanked: 53 times
Post
autor: K602 » śr mar 08, 2023 8:57 am
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: 15 Rejestracja: wt kwie 12, 2022 12:42 pm
Has thanked: 4 times
Been thanked: 5 times
Post
autor: natanielg » śr mar 08, 2023 9:18 am
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.