View previous topic :: View next topic
Author
Message
admin Администратор Joined: 01 Sep 2007 Posts: 1640
Posted: Mon Sep 03, 2007 10:21 am Post subject: ActiveX Timer Control in ABAP
For anyone interested in timer control in abap, a new approch is discussed here.
This approach is different from all known solutions. Using a new z class called ZCL_GUI_TIMER, you can program so that an OKCODE is executed periodically. In between the intervals, you can continue to work with the transaction.
From the example below, you will learn how to embed 3rd party Activex controls into SAPGUI.
Step A) Download a small freeware activex control from the following url and install it. This url is safe.
http://www.programmersheaven.com/download/17755/download.aspx
Step B) Create a z class called ZCL_GUI_TIMER. Code is given below.
Step C) Example program ZGUI_TIMER_TEST. Code is given below.
CLASS ZCL_GUI_TIMER
Code: Class:ZCL_GUI_TIMER
Inh.from:CL_GUI_CONTROL
Attribute
Privateattribute
M_OKCODE Inst TYPE SYUCOMM
M_INTERVAL Inst TYPE I
Events
Publicevents
Timer Interval reached
Methods
Publicmethods
CONSTRUCTOR DEFINITION
Description:Constructor
Instancemthd
Importingparameter
PARENT TYPE REF TO CL_GUI_CONTAINER(AbstractContainerforGUIControls)
VALUE(LIFETIME) TYPE I DEFAULT LIFETIME_DEFAULT(Lifetime)
VALUE(SHELLSTYLE) TYPE I DEFAULT LIFETIME_DEFAULT OPTIONAL(ShellStyle)
VALUE(NAME) TYPE STRING DEFAULT LIFETIME_DEFAULT OPTIONAL(Name)
Exceptions
CNTL_ERROR(Errorincntl_version_errorCallStack)
CNTL_INSTALL_ERROR(ControlIncorrectlyInstalled)
CNTL_VERSION_ERROR(InsertedControlIsObsolete)
CONSTRUCTOR IMPLEMENTATION.
DATA: clsid(80).
IF NOT activex IS INITIAL.
* SAPGUI for Windows OR HTML(www_isactive not initial) environment
clsid = 'RSTIMER.RSTimerCtrl'.
ELSEIF NOT javabean IS INITIAL.
* SAPGUI for Java environment
clsid = ''.
RAISE cntl_error.
ENDIF.
CALL METHOD super->constructor
EXPORTING
clsid = clsid
shellstyle = shellstyle
parent = parent
lifetime = lifetime
name = name
EXCEPTIONS
cntl_system_error = 2
OTHERS = 3.
CASE sy-subrc.
WHEN 0.
WHEN 2.
RAISE cntl_install_error.
WHEN OTHERS.
RAISE cntl_error.
ENDCASE.
DATA: lt_event TYPE cntl_simple_events,
l_event LIKE LINE OF lt_event.
l_event-eventid = 1.
APPEND l_event TO lt_event.
CALL METHOD set_registered_events
EXPORTING
events = lt_event
EXCEPTIONS
OTHERS = 1.
IF sy-subrc NE 0.
RAISE cntl_error.
ENDIF.
CALL METHOD set_property
EXPORTING
property = 'Enabled' "#EC NOTEXT
value = 0
EXCEPTIONS
OTHERS = 1.
IF sy-subrc NE 0.
RAISE cntl_error.
ENDIF.
CALL METHOD set_property
EXPORTING
property = 'AllTicks' "#EC NOTEXT
value = 0
EXCEPTIONS
OTHERS = 1.
IF sy-subrc NE 0.
RAISE cntl_error.
ENDIF.
ENDMETHOD.
SET_INTERVAL DEFINITION
Description:SetInterval
Instancemthd
Importingparameter
INTERVAL TYPE I(Intervalinminutes)
Exceptions
CNTL_ERROR(ControlErrorwhensettinginterval)
set_interval IMPLEMENTATION.
m_interval = interval * 1000.
ENDMETHOD.
START DEFINITION
Description:StartTimer
Instancemthd
Importingparameter
VALUE(OKCODE_TO_TRIGGER) TYPE SYUCOMM OPTIONAL(Screens,functioncodetrigger
Exceptions
CNTL_ERROR(ControlErrorwhenstartingtimer)
start IMPLEMENTATION.
SET HANDLER handle_event
FOR me.
m_okcode = okcode_to_trigger.
CALL METHOD set_property
EXPORTING
property = 'Enabled' "#EC NOTEXT
value = 1
EXCEPTIONS
OTHERS = 1.
IF sy-subrc NE 0.
RAISE cntl_error.
ENDIF.
CALL METHOD cl_gui_cfw=>flush.
CALL METHOD set_property
EXPORTING
property = 'Interval' "#EC NOTEXT
value = m_interval
EXCEPTIONS
OTHERS = 1.
IF sy-subrc NE 0.
RAISE cntl_error.
ENDIF.
ENDMETHOD.
STOP DEFINITION
Description:StopTimer
Instancemthd
Exceptions
CNTL_ERROR(ControlErrorwhenstartingtimer)
stop IMPLEMENTATION.
CALL METHOD set_property
EXPORTING
property = 'Enabled' "#EC NOTEXT
value = 0
EXCEPTIONS
OTHERS = 1.
IF sy-subrc NE 0.
RAISE cntl_error.
ENDIF.
CALL METHOD set_property
EXPORTING
property = 'Interval' "#EC NOTEXT
value = 0
EXCEPTIONS
OTHERS = 1.
IF sy-subrc NE 0.
RAISE cntl_error.
ENDIF.
CALL METHOD cl_gui_cfw=>flush.
ENDMETHOD.
Privatemethods
HANDLE_EVENT DEFINITION
Description:HandleWhentimerreachesinterval
Eventhandlerfor:ZCL_GUI_TIMER=>TIMER
Instancemthd
handle_event IMPLEMENTATION.
CALL METHOD cl_gui_cfw=>set_new_ok_code
EXPORTING
new_code = m_okcode.
ENDMETHOD.
RedefinedMethods
DISPATCH
METHOD dispatch .
CASE eventid.
WHEN 1.
RAISE EVENT timer.
WHEN OTHERS.
ENDCASE.
ENDMETHOD.
EXAMPLE PROGRAM ZGUI_TIMER_TEST
Code: REPORT ZGUI_TIMER_TEST .
DATA: g_cont TYPE REF TO cl_gui_custom_container,
g_timer TYPE REF TO zcl_gui_timer,
g_interval TYPE i,
g_okcode TYPE sy-ucomm,
g_old_okcode LIKE g_okcode,
g_no_intervals(5) TYPE n.
START-OF-SELECTION.
CALL SCREEN 100.
MODULE initialize OUTPUT.
*Create Container
SET PF-STATUS 'MAIN'.
IF g_cont IS INITIAL.
CREATE OBJECT g_cont
EXPORTING
container_name = 'G_CONT'
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5
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.
ENDIF.
*Create instance of Timer Class
IF g_timer IS INITIAL.
CREATE OBJECT g_timer
EXPORTING
parent = g_cont
EXCEPTIONS
cntl_error = 1
cntl_install_error = 2
cntl_version_error = 3
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.
ENDIF.
ENDMODULE. " initialize OUTPUT
MODULE user_command_0100 INPUT.
g_old_okcode = g_okcode.
CLEAR: g_okcode.
CASE g_old_okcode.
WHEN 'SET'.
PERFORM set_interval.
WHEN 'INTERVAL_REACHED'.
ADD 1 TO g_no_intervals.
MESSAGE s016(38) WITH
'It works! -'
g_interval
' sec interval reached -'
g_no_intervals.
WHEN 'EXIT'.
LEAVE PROGRAM.
WHEN OTHERS.
ENDCASE.
ENDMODULE. " USER_COMMAND_0100 INPUT
FORM set_interval.
CALL METHOD g_timer->set_interval
EXPORTING
interval = g_interval
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
MESSAGE i016(38) WITH
'Error setting interval on control'.
ENDIF.
CALL METHOD g_timer->start
EXPORTING
okcode_to_trigger = 'INTERVAL_REACHED'.
ENDFORM. "SET_INTERVAL
EXAMPLE PROGRAM ZGUI_TIMER_TEST SCREEN 100
Screen Elements
Code: G_INTERVAL Text 8
G_INTERVAL I/O 10
G_SET Push 12
G_CONT CCtrl 5
G_OKCODE OK 20
Screen Flow Logic
Code: PROCESS BEFORE OUTPUT.
module initialize.
PROCESS AFTER INPUT.
MODULE USER_COMMAND_0100.
Автор: Silent_Devil
Back to top
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum You cannot attach files in this forum You can download files in this forum
All product names are trademarks of their respective companies. SAPNET.RU websites are in no way affiliated with SAP AG. SAP, SAP R/3, R/3 software, mySAP, ABAP, BAPI, xApps, SAP NetWeaver and any other are registered trademarks of SAP AG. Every effort is made to ensure content integrity. Use information on this site at your own risk.