‎2007 Nov 19 3:20 PM
Hello,
I do an ALV with CL_SALV_TABLE. But I can't refresh it well. Only can refresh 2 times . Why?
Somebody can help me, please?
I have 2 alv with 2 containers in the same screen.
The first gr_alv goes well . When I click on one field the second alv appear.But when I click on the other field of first alv the second alv don't refresh.
I have defined a class.
CLASS LCL_HANDLER DEFINITION.
PUBLIC SECTION.
CLASS-METHODS:
ON_DOUBLE_CLICK
FOR EVENT DOUBLE_CLICK OF CL_SALV_EVENTS_TABLE
IMPORTING
ROW
COLUMN .
ENDCLASS. "LCL_HANDLER
**&---------------------------------------------------------------------*
**& Class (Implementation) LCL_HANDLER
**&---------------------------------------------------------------------*
** Text Esta en el Module double_click
**----------------------------------------------------------------------*
CLASS LCL_HANDLER IMPLEMENTATION.
METHOD ON_DOUBLE_CLICK.
CASE COLUMN.
WHEN 'PEDIDO'.
LOOP AT IT_LISTADO INTO WA_LISTADO.
AUX_PEDIDO = WA_LISTADO-PEDIDO.
IF SY-TABIX = ROW.
EXIT.
ENDIF.
ENDLOOP.
REFRESH IT_POSICION.
SELECT * FROM ZPEDIDOSPOS INTO CORRESPONDING FIELDS
OF TABLE IT_POSICION
WHERE PEDIDO = AUX_PEDIDO.
PERFORM ALV_POSICIONES.
ENDCASE.
ENDMETHOD.
FORM ALV_POSICIONES. "The problem is here, I think
IF GR_CONT2 IS INITIAL.
CREATE OBJECT GR_CONT2
EXPORTING
CONTAINER_NAME = 'MY_AREA2'
EXCEPTIONS
CNTL_ERROR = 1
CNTL_SYSTEM_ERROR = 2
CREATE_ERROR = 3
LIFETIME_ERROR = 4
LIFETIME_DYNPRO_DYNPRO_LINK = 5
OTHERS = 6.
IF SY-SUBRC NE 0.
MESSAGE E015(BC405).
ENDIF.
ELSE.
GR_ALV2->REFRESH( ).
ENDIF.
TRY.
CALL METHOD CL_SALV_TABLE=>FACTORY
EXPORTING
LIST_DISPLAY = ' '
R_CONTAINER = GR_CONT2
IMPORTING
R_SALV_TABLE = GR_ALV2
CHANGING
T_TABLE = IT_POSICION.
CATCH CX_SALV_MSG .
ENDTRY.
CALL METHOD GR_ALV2->DISPLAY.
ENDFORM.____________________________________
pbo module___________________
PROCESS BEFORE OUTPUT.
MODULE STATUS_6000.
MODULE CREAR_VER.
MODULE DOUBLE_CLICK._____________________________________
MODULE DOUBLE_CLICK OUTPUT.
DATA: LR_HANDLER TYPE REF TO LCL_HANDLER.
CREATE OBJECT LR_HANDLER.
LR_COLUMNS = GR_ALV->GET_COLUMNS( ).
LR_COLUMNS->SET_OPTIMIZE( ABAP_TRUE ).
TRY.
LR_COLUMN ?= LR_COLUMNS->GET_COLUMN( 'PEDIDO' ).
LR_COLUMN->SET_CELL_TYPE( IF_SALV_C_CELL_TYPE=>HOTSPOT ).
CATCH CX_SALV_NOT_FOUND.
ENDTRY.
LR_EVENT = GR_ALV->GET_EVENT( ).
SET HANDLER LR_HANDLER->ON_DOUBLE_CLICK FOR LR_EVENT.
GR_ALV->DISPLAY( ).
ENDMODULE.
‎2007 Nov 19 3:26 PM
Hi!
You might try out to reset the SAP buffers. Use the /$sync transaction code for it.
Regards
Tamá
‎2007 Nov 20 8:22 AM
‎2007 Nov 19 8:23 PM
Hello Ana
The sample report <b>ZUS_SDN_TWO_CL_SALV_TABLE</b> shows you how to refresh a secondary ALV list after double-clicking into the primary ALV list.
*&---------------------------------------------------------------------*
*& Report ZUS_SDN_TWO_CL_SALV_TABLE
*&
*&---------------------------------------------------------------------*
*& Screen '0100' contains no elements.
*& ok_code -> assigned to GD_OKCODE
*&
*& Flow logic:
* PROCESS BEFORE OUTPUT.
* MODULE STATUS_0100.
**
* PROCESS AFTER INPUT.
* MODULE USER_COMMAND_0100.
*&
*&---------------------------------------------------------------------*
REPORT zus_sdn_two_cl_salv_table.
DATA:
gd_okcode TYPE ui_func,
*
go_docking TYPE REF TO cl_gui_docking_container,
go_splitter TYPE REF TO cl_gui_splitter_container,
go_cell_top TYPE REF TO cl_gui_container,
go_cell_bottom TYPE REF TO cl_gui_container,
** go_grid1 TYPE REF TO cl_gui_alv_grid,
** go_grid2 TYPE REF TO cl_gui_alv_grid,
go_table1 TYPE REF TO cl_salv_table,
go_table2 TYPE REF TO cl_salv_table,
go_events TYPE REF TO cl_salv_events_table.
DATA:
gt_knb1 TYPE STANDARD TABLE OF knb1,
gt_knvv TYPE STANDARD TABLE OF knvv.
*---------------------------------------------------------------------*
* CLASS lcl_eventhandler DEFINITION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_eventhandler DEFINITION.
PUBLIC SECTION.
CLASS-METHODS:
handle_double_click FOR EVENT
if_salv_events_actions_table~double_click
OF cl_salv_events_table
IMPORTING
row
column,
handle_link_click FOR EVENT
if_salv_events_actions_table~link_click
OF cl_salv_events_table
IMPORTING
row
column.
ENDCLASS. "lcl_eventhandler DEFINITION
*---------------------------------------------------------------------*
* CLASS lcl_eventhandler IMPLEMENTATION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_eventhandler IMPLEMENTATION.
METHOD handle_double_click.
* define local data
DATA:
lo_table TYPE REF TO cl_salv_table,
lt_orders TYPE STANDARD TABLE OF bapiorders,
ls_knb1 TYPE knb1.
READ TABLE gt_knb1 INTO ls_knb1 INDEX row.
IF ( syst-subrc = 0 ).
SELECT * FROM knvv INTO TABLE gt_knvv
WHERE kunnr = ls_knb1-kunnr.
ENDIF.
cl_gui_cfw=>set_new_ok_code( 'REFRESH' ).
ENDMETHOD. "handle_double_click
METHOD handle_link_click.
ENDMETHOD. "handle_link_click
ENDCLASS. "lcl_eventhandler IMPLEMENTATION
START-OF-SELECTION.
SELECT * FROM knb1 INTO TABLE gt_knb1
WHERE bukrs = '1000'.
* Create docking container
CREATE OBJECT go_docking
EXPORTING
parent = cl_gui_container=>screen0
ratio = 90
EXCEPTIONS
OTHERS = 6.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
* Create splitter container
CREATE OBJECT go_splitter
EXPORTING
parent = go_docking
rows = 2
columns = 1
* NO_AUTODEF_PROGID_DYNNR =
* NAME =
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
* Get cell container
CALL METHOD go_splitter->get_container
EXPORTING
row = 1
column = 1
RECEIVING
container = go_cell_top.
CALL METHOD go_splitter->get_container
EXPORTING
row = 2
column = 1
RECEIVING
container = go_cell_bottom.
* Create 1st ALV grid
TRY.
CALL METHOD cl_salv_table=>factory
EXPORTING
r_container = go_cell_top
IMPORTING
r_salv_table = go_table1
CHANGING
t_table = gt_knb1.
CATCH cx_salv_msg .
ENDTRY.
* Create 2nd ALV grid
TRY.
CALL METHOD cl_salv_table=>factory
EXPORTING
r_container = go_cell_bottom
IMPORTING
r_salv_table = go_table2
CHANGING
t_table = gt_knvv. " empty !!!
CATCH cx_salv_msg .
ENDTRY.
* Link the docking container to the target dynpro
CALL METHOD go_docking->link
EXPORTING
repid = syst-repid
dynnr = '0100'
* CONTAINER =
EXCEPTIONS
OTHERS = 4.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
* Create event instance
go_events = go_table1->get_event( ).
* Set event handler
SET HANDLER:
lcl_eventhandler=>handle_double_click FOR go_events.
go_table1->display( ).
go_table2->display( ).
* NOTE: dynpro does not contain any elements
CALL SCREEN '0100'.
* Flow logic of dynpro (does not contain any dynpro elements):
*
*PROCESS BEFORE OUTPUT.
* MODULE STATUS_0100.
**
*PROCESS AFTER INPUT.
* MODULE USER_COMMAND_0100.
END-OF-SELECTION.
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
SET PF-STATUS 'STATUS_0100'. " contains push button "DETAIL"
* SET TITLEBAR 'xxx'.
ENDMODULE. " STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
CASE gd_okcode.
WHEN 'BACK' OR
'END' OR
'CANC'.
SET SCREEN 0. LEAVE SCREEN.
WHEN 'REFRESH'.
go_table2->refresh( ).
WHEN OTHERS.
ENDCASE.
CLEAR: gd_okcode.
ENDMODULE. " USER_COMMAND_0100 INPUTRegards
Uwe
‎2007 Nov 20 4:51 AM
HI
Refresh the data displayed within an ALV object grid
The following method call is used to refresh the data displayed within an ALV object grid:
CALL method gd_tree->REFRESH_TABLE_DISPLAY
CALL METHOD gd_tree->set_table_for_first_display
EXPORTING
is_layout = gd_layout
CHANGING
it_fieldcatalog = gd_fieldcat
it_sort = it_sortcat
it_outtab = it_report.
CALL method gd_tree->REFRESH_TABLE_DISPLAY.
CALL METHOD cl_gui_cfw=>flush.
‎2007 Nov 20 8:20 AM
I put this in my program
CALL method gd_tree->REFRESH_TABLE_DISPLAY
CALL METHOD gd_tree->set_table_for_first_display
EXPORTING
is_layout = gd_layout
CHANGING
it_fieldcatalog = gd_fieldcat
it_sort = it_sortcat
it_outtab = it_report.
CALL method gd_tree->REFRESH_TABLE_DISPLAY.and it doesn't refresh well . Thanks
‎2007 Nov 20 4:52 AM
HI
>********************************************************************
This report displays User's info (SM04) using the FM : *
REUSE_ALV_LIST_DISPLAY *
The list is auto-refreshed (refresh time : 5 seconds) *
----
TYPE-POOLS: slis. " ALV Global Types
DATA :
gt_user LIKE uinfo OCCURS 0 WITH HEADER LINE. " User info in SM04
----
START-OF-SELECTION.
PERFORM f_read_data.
PERFORM f_display_data.
----
Form F_LIRE_DATA
----
FORM f_read_data.
REFRESH gt_user.
Get User's info
CALL FUNCTION 'THUSRINFO'
TABLES
usr_tabl = gt_user.
Wait in a task
PERFORM f_call_rfc_wait.
ENDFORM. " F_READ_DATA
----
Form F_DISPLAY_DATA
----
FORM f_display_data.
DEFINE m_sort.
add 1 to ls_sort-spos.
ls_sort-fieldname = &1.
append ls_sort to lt_sort.
END-OF-DEFINITION.
DEFINE m_event_exit.
clear ls_event_exit.
ls_event_exit-ucomm = &1.
ls_event_exit-after = 'X'.
append ls_event_exit to lt_event_exit.
END-OF-DEFINITION.
DATA :
ls_layout TYPE slis_layout_alv,
lt_sort TYPE slis_t_sortinfo_alv,
ls_sort TYPE slis_sortinfo_alv,
lt_event_exit TYPE slis_t_event_exit,
ls_event_exit TYPE slis_event_exit.
Build Sort Table
m_sort 'ZEIT'.
Build Event Exit Table
m_event_exit '&NTE'. " Refresh
ls_layout-zebra = 'X'.
ls_layout-colwidth_optimize = 'X'.
CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
EXPORTING
i_callback_program = sy-cprog
i_callback_user_command = 'USER_COMMAND'
is_layout = ls_layout
i_structure_name = 'UINFO'
it_sort = lt_sort
it_event_exit = lt_event_exit
TABLES
t_outtab = gt_user.
ENDFORM. " F_DISPLAY_DATA
----
FORM USER_COMMAND *
----
FORM user_command USING i_ucomm TYPE syucomm
is_selfield TYPE slis_selfield. "#EC CALLED
CASE i_ucomm.
WHEN '&NTE'.
PERFORM f_read_data.
is_selfield-refresh = 'X'.
SET USER-COMMAND '&OPT'. " Optimize columns width
ENDCASE.
ENDFORM. " USER_COMMAND
----
Form F_CALL_RFC_WAIT
----
FORM f_call_rfc_wait.
DATA lv_mssg(80). "#EC NEEDED
Wait in a task
CALL FUNCTION 'RFC_PING_AND_WAIT' STARTING NEW TASK '001'
PERFORMING f_task_end ON END OF TASK
EXPORTING
seconds = 5 " Refresh time
busy_waiting = space
EXCEPTIONS
RESOURCE_FAILURE = 1
communication_failure = 2 MESSAGE lv_mssg
system_failure = 3 MESSAGE lv_mssg
OTHERS = 4.
ENDFORM. " F_CALL_RFC_WAIT
----
Form F_TASK_END
----
FORM f_task_end USING u_taskname.
DATA lv_mssg(80). "#EC NEEDED
Receiving task results
RECEIVE RESULTS FROM FUNCTION 'RFC_PING_AND_WAIT'
EXCEPTIONS
RESOURCE_FAILURE = 1
communication_failure = 2 MESSAGE lv_mssg
system_failure = 3 MESSAGE lv_mssg
OTHERS = 4.
CHECK sy-subrc EQ 0.
SET USER-COMMAND '&NTE'. " Refresh
ENDFORM. " F_TASK_END
END OF PROGRAM Z_ALV_AUTO_REFRESH *********************
<b>Reward if usefull</b>
‎2007 Nov 26 8:50 AM
SOLUTION:
IF GR_CONT2 IS INITIAL.
"create container object and link to screen area.
CREATE OBJECT GR_CONT2
EXPORTING
CONTAINER_NAME = 'MY_AREA2'
EXCEPTIONS
CNTL_ERROR = 1
CNTL_SYSTEM_ERROR = 2
CREATE_ERROR = 3
LIFETIME_ERROR = 4
LIFETIME_DYNPRO_DYNPRO_LINK = 5
OTHERS = 6.
IF SY-SUBRC NE 0.
MESSAGE E015(BC405).
ENDIF.
ENDIF.
if GR_ALV2 is INITIAL.
TRY.
CL_SALV_TABLE=>FACTORY(
EXPORTING
LIST_DISPLAY = ' '
R_CONTAINER = GR_CONT2
CONTAINER_NAME = 'MY_AREA2'
IMPORTING
R_SALV_TABLE = GR_ALV2
CHANGING
T_TABLE = it_posicion
).
CATCH CX_SALV_MSG .
ENDTRY.
else.
GR_ALV2->REFRESH(
* S_STABLE = it_posicion
* REFRESH_MODE = 2
).
endif.
CALL METHOD GR_ALV2->DISPLAY.
ENDFORM.
The position of the refresh was wrong.