2006 Feb 02 4:08 PM
Hi all,
I'm having a problem with a dynpro created using the Screen Painter. I need an auto-refresh function (every tot seconds) but I'm not able to do it managing the PBO and PAI modules.
Can you help me, please?
Thanks in advance.
Angelo
2006 Feb 02 4:19 PM
Of course, if you are on newer version and the class does exists, then the code is a lot shorter.
report zrich_0003 .
* THIS IS A LOCAL IMPLEMENTATION OF THE CL_GUI_TIMER WHICH IS AVALIABLE
* IN WAS 6.2
*
* Add the following elements to screen 100
*SY-DATUM I/O 1 2 10 10 1 DATS
*SY-UZEIT I/O 2 2 10 10 1 TIMS
*TIMER_CONTAINER CCtrl 19 1 1 1 1
*OK_CODE OK 0 0 20 20 1 OK
*---------------------------------------------------------------------*
* CLASS lcl_event_handler DEFINITION
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
class lcl_event_handler definition.
public section.
class-methods: on_finished for event finished of lcl_gui_timer.
endclass.
data: gui_timer type ref to <b>cl_gui_timer</b>.
data: event_handler type ref to lcl_event_handler.
data: timeout type i value '3'.
data: ok_code like sy-ucomm,
save_ok like sy-ucomm.
call screen 100.
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
module status_0100 output.
set pf-status '0100'.
* SET TITLEBAR 'xxx'.
create object gui_timer.
set handler event_handler->on_finished for gui_timer.
gui_timer->interval = timeout.
call method gui_timer->run.
endmodule.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
module user_command_0100 input.
save_ok = ok_code.
case ok_code.
when 'BACK'.
leave program.
endcase.
endmodule.
*---------------------------------------------------------------------*
* CLASS lcl_event_handler IMPLEMENTATION
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
class lcl_event_handler implementation.
method on_finished.
* Start Timer again
gui_timer->interval = timeout.
call method gui_timer->run.
* cause PAI
call method cl_gui_cfw=>set_new_ok_code
exporting
new_code = 'REFR'.
endmethod.
endclass.
Please remember to award points for helpful answers and mark this post as solved when solved completely. Thanks.
Regadrds,
Rich Heilman
Of course, if you are on newer version and the class does exists, then the code is a lot shorter.
report zrich_0003 .
* THIS IS A LOCAL IMPLEMENTATION OF THE CL_GUI_TIMER WHICH IS AVALIABLE
* IN WAS 6.2
*
* Add the following elements to screen 100
*SY-DATUM I/O 1 2 10 10 1 DATS
*SY-UZEIT I/O 2 2 10 10 1 TIMS
*TIMER_CONTAINER CCtrl 19 1 1 1 1
*OK_CODE OK 0 0 20 20 1 OK
*---------------------------------------------------------------------*
* CLASS lcl_event_handler DEFINITION
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
class lcl_event_handler definition.
public section.
class-methods: on_finished for event finished of lcl_gui_timer.
endclass.
data: gui_timer type ref to <b>cl_gui_timer</b>.
data: event_handler type ref to lcl_event_handler.
data: timeout type i value '3'.
data: ok_code like sy-ucomm,
save_ok like sy-ucomm.
call screen 100.
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
module status_0100 output.
set pf-status '0100'.
* SET TITLEBAR 'xxx'.
create object gui_timer.
set handler event_handler->on_finished for gui_timer.
gui_timer->interval = timeout.
call method gui_timer->run.
endmodule.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
module user_command_0100 input.
save_ok = ok_code.
case ok_code.
when 'BACK'.
leave program.
endcase.
endmodule.
*---------------------------------------------------------------------*
* CLASS lcl_event_handler IMPLEMENTATION
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
class lcl_event_handler implementation.
method on_finished.
* Start Timer again
gui_timer->interval = timeout.
call method gui_timer->run.
* cause PAI
call method cl_gui_cfw=>set_new_ok_code
exporting
new_code = 'REFR'.
endmethod.
endclass.
Please remember to award points for helpful answers and mark this post as solved when solved completely. Thanks.
Regadrds,
Rich Heilman
2006 Feb 02 4:14 PM
Yep, check out this sample program. Here we are updating a dynpro every couple secods, we are showing the date and time. It uses the class CL_GUI_TIMER. If you are on a release eariler than 6.20, you can do as I've done here and implemnent the timer as a local class. In newer version the CL_GUI_TIMER class is global. You can of course create a "ZCL_GUI_TIMER" global class with the code from the local class in this example. Create a screen 100, and put the date and time fields. Then run it.
report zrich_0003 .
* THIS IS A LOCAL IMPLEMENTATION OF THE CL_GUI_TIMER WHICH IS AVALIABLE
* IN WAS 6.2
*
* Add the following elements to screen 100
*SY-DATUM I/O 1 2 10 10 1 DATS
*SY-UZEIT I/O 2 2 10 10 1 TIMS
*TIMER_CONTAINER CCtrl 19 1 1 1 1
*OK_CODE OK 0 0 20 20 1 OK
*---------------------------------------------------------------------*
* CLASS lcl_gui_timer DEFINITION
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
class lcl_gui_timer definition inheriting from cl_gui_control.
public section.
constants: eventid_finished type i value 1 .
class-data: interval type i value '0'.
events: finished .
methods:
cancel
exceptions
error,
constructor
importing
lifetime type i optional
value(shellstyle) type i optional
value(parent) type ref to cl_gui_container optional
exceptions
error,
run
exceptions
error,
dispatch redefinition.
endclass.
*---------------------------------------------------------------------*
* CLASS lcl_event_handler DEFINITION
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
class lcl_event_handler definition.
public section.
class-methods: on_finished for event finished of lcl_gui_timer.
endclass.
data: gui_timer type ref to lcl_gui_timer.
data: event_handler type ref to lcl_event_handler.
data: timeout type i value '3'.
data: ok_code like sy-ucomm,
save_ok like sy-ucomm.
call screen 100.
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
module status_0100 output.
set pf-status '0100'.
* SET TITLEBAR 'xxx'.
create object gui_timer.
set handler event_handler->on_finished for gui_timer.
gui_timer->interval = timeout.
call method gui_timer->run.
endmodule.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
module user_command_0100 input.
save_ok = ok_code.
case ok_code.
when 'BACK'.
leave program.
endcase.
endmodule.
*---------------------------------------------------------------------*
* CLASS lcl_event_handler IMPLEMENTATION
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
class lcl_event_handler implementation.
method on_finished.
* Start Timer again
gui_timer->interval = timeout.
call method gui_timer->run.
* cause PAI
call method cl_gui_cfw=>set_new_ok_code
exporting
new_code = 'REFR'.
endmethod.
endclass.
*---------------------------------------------------------------------*
* CLASS lcl_gui_timer IMPLEMENTATION
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
class lcl_gui_timer implementation.
method constructor.
type-pools: sfes.
data clsid(80).
data event_tab type cntl_simple_events.
data event_tab_line type cntl_simple_event.
if clsid is initial.
data: return,
guitype type i.
guitype = 0.
call function 'GUI_HAS_OBJECTS'
exporting
object_model = sfes_obj_activex
importing
return = return
exceptions
others = 1.
if sy-subrc ne 0.
raise error.
endif.
if return = 'X'.
guitype = 1.
endif.
if guitype = 0.
call function 'GUI_HAS_OBJECTS'
exporting
object_model = sfes_obj_javabeans
importing
return = return
exceptions
others = 1.
if sy-subrc ne 0.
raise error.
endif.
if return = 'X'.
guitype = 2.
endif.
endif.
case guitype.
when 1.
clsid = 'Sapgui.InfoCtrl.1'.
when 2.
clsid = 'com.sap.components.controls.sapImage.SapImage'.
endcase.
endif.
call method super->constructor
exporting
clsid = clsid
shellstyle = 0
parent = cl_gui_container=>default_screen
autoalign = space
exceptions others = 1.
if sy-subrc ne 0.
raise error.
endif.
call method cl_gui_cfw=>subscribe
exporting
shellid = h_control-shellid
ref = me
exceptions others = 1.
if sy-subrc ne 0.
raise error.
endif.
* Register the events
event_tab_line-eventid = lcl_gui_timer=>eventid_finished.
append event_tab_line to event_tab.
call method set_registered_events
exporting
events = event_tab.
endmethod.
method cancel.
call method call_method
exporting
method = 'SetTimer'
p_count = 1
p1 = -1
queue_only = 'X'
exceptions others = 1.
if sy-subrc ne 0.
raise error.
endif.
endmethod.
method run.
call method call_method
exporting
method = 'SetTimer'
p_count = 1
p1 = interval
queue_only = 'X'
exceptions others = 1.
if sy-subrc ne 0.
raise error.
endif.
endmethod.
method dispatch .
case eventid.
when eventid_finished.
raise event finished.
endcase.
endmethod.
endclass.
REgards,
Rich Heilman
2006 Feb 02 4:15 PM
hi,
check this class cl_gui_timer , it may help you.
check in the forum..
regards
vijay
2006 Feb 02 4:19 PM
Of course, if you are on newer version and the class does exists, then the code is a lot shorter.
report zrich_0003 .
* THIS IS A LOCAL IMPLEMENTATION OF THE CL_GUI_TIMER WHICH IS AVALIABLE
* IN WAS 6.2
*
* Add the following elements to screen 100
*SY-DATUM I/O 1 2 10 10 1 DATS
*SY-UZEIT I/O 2 2 10 10 1 TIMS
*TIMER_CONTAINER CCtrl 19 1 1 1 1
*OK_CODE OK 0 0 20 20 1 OK
*---------------------------------------------------------------------*
* CLASS lcl_event_handler DEFINITION
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
class lcl_event_handler definition.
public section.
class-methods: on_finished for event finished of lcl_gui_timer.
endclass.
data: gui_timer type ref to <b>cl_gui_timer</b>.
data: event_handler type ref to lcl_event_handler.
data: timeout type i value '3'.
data: ok_code like sy-ucomm,
save_ok like sy-ucomm.
call screen 100.
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
module status_0100 output.
set pf-status '0100'.
* SET TITLEBAR 'xxx'.
create object gui_timer.
set handler event_handler->on_finished for gui_timer.
gui_timer->interval = timeout.
call method gui_timer->run.
endmodule.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
module user_command_0100 input.
save_ok = ok_code.
case ok_code.
when 'BACK'.
leave program.
endcase.
endmodule.
*---------------------------------------------------------------------*
* CLASS lcl_event_handler IMPLEMENTATION
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
class lcl_event_handler implementation.
method on_finished.
* Start Timer again
gui_timer->interval = timeout.
call method gui_timer->run.
* cause PAI
call method cl_gui_cfw=>set_new_ok_code
exporting
new_code = 'REFR'.
endmethod.
endclass.
Please remember to award points for helpful answers and mark this post as solved when solved completely. Thanks.
Regadrds,
Rich Heilman
2006 Feb 02 5:14 PM
Thank you very much Rich, it works, but I need another help if you can. In my dynpro there's a dynamic document whose data is not updated after the refresh.
Any idea?
Thanks again.
Angelo
2006 Feb 02 5:18 PM
2006 Feb 02 5:34 PM
The data are re-read but if I set the parameter reuse_control (of method display_document) to 'X' I receive a dump... do you know why?
Regards.
Angelo
2006 Feb 02 5:37 PM
2006 Feb 02 5:42 PM
2006 Feb 03 4:48 AM
REPORT ZAUTO_REFRESH .
DATA: G_INIT_ONCE,
OK_CODE(20),
G_REF_FROM_TIMER.
DATA: BEGIN OF ITAB OCCURS 0,
CARRID TYPE SPFLI-CARRID,
CONNID TYPE SPFLI-CONNID,
COUNTRYFR TYPE SPFLI-COUNTRYFR,
CITYFROM TYPE SPFLI-CITYFROM,
AIRPFROM TYPE SPFLI-AIRPFROM,
COUNTRYTO TYPE SPFLI-COUNTRYTO,
CITYTO TYPE SPFLI-CITYTO,
AIRPTO TYPE SPFLI-AIRPTO,
FLTIME TYPE SPFLI-FLTIME,
DEPTIME TYPE SPFLI-DEPTIME,
ARRTIME TYPE SPFLI-ARRTIME,
DISTANCE TYPE SPFLI-DISTANCE,
DISTID TYPE SPFLI-DISTID,
FLTYPE TYPE SPFLI-FLTYPE,
PERIOD TYPE SPFLI-PERIOD,
END OF ITAB.
IF G_INIT_ONCE <> 'X'.
G_INIT_ONCE = 'X'.
CALL FUNCTION 'Z_ENQUE_SLEEP'
STARTING NEW TASK 'WAIT'
PERFORMING WHEN_FINISHED ON END OF TASK.
ENDIF.
WRITE:/ 'wait for 10 sec....'.
AT USER-COMMAND.
CASE OK_CODE.
WHEN 'FCT_R'.
SELECT * FROM SPFLI INTO CORRESPONDING FIELDS OF TABLE ITAB.
WRITE:/ SY-UZEIT.
LOOP AT ITAB.
WRITE:/ ITAB-CARRID,ITAB-CONNID.
ENDLOOP.
SY-LSIND = 0.
IF G_REF_FROM_TIMER = 'X'.
CALL FUNCTION 'Z_ENQUE_SLEEP'
STARTING NEW TASK 'INFO'
PERFORMING WHEN_FINISHED ON END OF TASK.
G_REF_FROM_TIMER = ''.
ENDIF.
ENDCASE.
*---------------------------------------------------------------------*
* FORM WHEN_FINISHED *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> TASKNAME *
*---------------------------------------------------------------------*
FORM WHEN_FINISHED USING TASKNAME.
RECEIVE RESULTS FROM FUNCTION 'Z_ENQUE_SLEEP'.
G_REF_FROM_TIMER = 'X'.
* Trigger an event to run the at user-command
SET USER-COMMAND 'FCT_R'.
OK_CODE = 'FCT_R'.
SY-UCOMM = 'FCT_R'.
ENDFORM. " WHEN_FINISHED
*************************************************************************
Function Module for refreshing the report (in SE37)
FUNCTION Z_ENQUE_SLEEP.
*"----------------------------------------------------------------------
*"*"Local interface:
*"----------------------------------------------------------------------
CALL FUNCTION 'ENQUE_SLEEP'
EXPORTING
SECONDS = 10.
ENDFUNCTION.
| User | Count |
|---|---|
| 3 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 |