Consideremos un escenario en el que el usuario haya ingresado datos en más de 30 campos y antes de guardar el contenido se haya alejado de su PC. Ahora, a la vuelta, cuando intenté guardar los datos, le aparecerá el mensaje molestoso para la mayorÃa de TIME OUT. La esencia es que la información se pierde y ahora se tendrÃa que volver a ingresar toda la información generando molestia por parte del usuario. Ahora pensemos que podamos tener 25 minutos de tiempo ideal más y asà la aplicación podrÃa ser mas amigable a esos inconvenientes de cierre de sesión.
View (Layout)
Creemos un elemento UI(TIMEDTRIGGER), que tiene 2 propiedades importantes DELAY y ONACTION, es decir, después de cada DELAY se activará ONACTION.
La vinculación de la propiedad DELAY se realiza con el nodo de contexto, cuyo valor inicial se establecerá en el método DOMODIFY y seguirá cambiando en otros métodos según el requisito.
Componentes usados de WebDynpro
Creamos un 'Component use' para WDC (Main Application Compoment) en WDC reutilizable, luego navegamos hasta la vista View (REFRESH_VIEW) Controller y agregamos la referencia de 'Component Use' (Componente de aplicación principal), navegamos hasta el Context y agregamos el Nodo de contexto (desde el Componente principal de la aplicación).
El Nodo que estamos trayendo del "Componente de aplicación principal" es el que tiene datos relacionados con la aplicación real.
Variables globales
Definimos 2 variables globales dentro de VIEW CONTROLLER.
GV_CURRENT_DATE_TIME: utilizado para almacenar la fecha actual
GV_LAST_ACTION_DATE_TIME: utilizado para almacenar la fecha de la última acción.
Context node
Creamos un Context node/Attribute, como se muestra en la captura de pantalla siguiente, que se usará para enlazar la propiedad 'Delay' del elemento TIMEDTRIGGER.
Métodos
1. WDDOBEFOREACTION:
Este método se utilizará para identificar el nombre de la acción (acción desencadenada en función de alguna acción realizada en el elemento UI), que ha desencadenado este método.
Desde WD_THIS podemos obtener API_CONTROLLER usando el método WD_GET_API ().
Desde API_CONTROLLER podemos hacer referencia a ACTION utilizando el método GET_CURRENT_ACTION_INFO ().
Aquà te incluyo el código de ACTION que ha activado este método.
METHOD wddobeforeaction .
DATA lo_api_controller TYPE REF TO if_wd_view_controller.
DATA ls_wdapi_action TYPE wdapi_action.
lo_api_controller = wd_this->wd_get_api().
ls_wdapi_action = lo_api_controller->get_current_action_info( ).
IF ls_wdapi_action-action_name NE'TIME_TO_CHECK'.
CONCATENATE sy-datum sy-uzeit INTO wd_this->gv_last_action_date_time.
ENDIF.
ENDMETHOD.
2. WDDOMODIFYVIEW:
Este método se utilizará para INICIALIZAR los valores de las variables globales y el atributo de contexto DELAY.
METHOD wddomodifyview .
DATA lo_nd_delay TYPE REF TO if_wd_context_node.
DATA lv_delay TYPE i.
IF first_time EQ abap_true.
"Setting the initial value of CURRENT TIME/LAST ACTION TIME
CONCATENATE sy-datum sy-uzeit INTO wd_this->gv_current_date_time.
CONCATENATE sy-datum sy-uzeit INTO wd_this->gv_last_action_date_time.
"Setting initial value of Delay...
"Additionally, we might have to put some condition based on application... Since this is re-usable
"component and so we have to take care of from which Application this is triggering and according
"we have to set the value of DELAY context-attribute
wd_this->get_delay(
EXPORTING
iv_triggered_from = 'INITIALIZE'
IMPORTING
ev_delay = lv_delay ).
lo_nd_delay = wd_context->get_child_node( name = wd_this->wdctx_delay ).
lo_nd_delay->set_attribute(
name = 'DELAY'
value = lv_delay ).
ENDIF.
ENDMETHOD.
Aquà te incluyo el código de ACTION que ha activado este método.
Método personalizado:
GET_DELAY:
Este método ayudará a calcular el tiempo de retardo, es decir, el tiempo que la
acción TIMEDTRIGGERD que se esta invocando
En este método, básicamente, establecerá el valor de DELAY. El método
GET_DELAY () se invoca desde el método DO_MODIFY o ONACTIONTIME_TO_CHECK. La intención aquà nuevamente es administrar el
valor de demora según algunas condiciones. Aquà puedes Cambiar el código dentro de este método según el requisito que puedas tener.
ONACTIONTIME_TO_CHECK:
Este método será responsable de calcular la diferencia de CURRENT_TIME y TIME_WHEN_LAST_ACTION_WAS_TAKEN y, en función de la diferencia, es decir, si cruza el tiempo de umbral EMAIL / NAVIGATION / AUTO-SAVE etc., lo realizará.
METHOD onactiontime_to_check.
DATA lv_last_action_date_timestamp TYPE timestamp.
DATA lv_current_date_timestamp TYPE timestamp.
DATA lv_time_difference TYPE i.
DATA lo_nd_delay TYPE REF TO if_wd_context_node.
DATA lv_delay TYPE i.
"Getting the value of CURRENT TIME and LAST ACTION TIME
lv_last_action_date_timestamp = wd_this->gv_last_action_date_time.
CONCATENATE sy-datum sy-uzeit INTO wd_this->gv_current_date_time.
lv_current_date_timestamp = wd_this->gv_current_date_time.
"Calculating difference between CURRENT TIME and LAST ACTION TIME
CALL FUNCTION 'TIMECALC_DIFF'
EXPORTING
timestamp1 = lv_last_action_date_timestamp
timestamp2 = lv_current_date_timestamp
timezone = 'UTC'
IMPORTING
difference = lv_time_difference.
"If Difference Time exceeds TIME OUT (here TIME OUT is hardcoded to 900), then we will have to
"perform some action (Navigating to some other screen/EMAIL etc…).
IF lv_time_difference GT 900
"Write Code for EMAIL or Navigation etc. --> Start
"Here you may read the context node (of Main Application (refer to section 'Used WebDynpo
"Components')) having actual application data and may prepare email body and trigger email…
"Additionally can navigate to some informative screen, which says that your application have
"TIMEDOUT and application content is forwarded to your email…
"Write Code for EMAIL or Navigation etc.--> End
"Getting value of DELAY and setting value of DELAY attribute --> Start
wd_this->get_delay(
EXPORTING
iv_triggered_from = 'TIME_TO_CHECK'
IMPORTING
ev_delay = lv_delay ).
lo_nd_delay = wd_context->get_child_node( name = wd_this->wdctx_delay ).
lo_nd_delay->set_attribute(
name = 'DELAY'
value = lv_delay ).
" Getting value of DELAY and setting value of DELAY attribute --> End
ENDIF.
ENDMETHOD.
Con ello podrás tener implementado el manejo del tiempo para tu webdynpro y asà tus usuarios tendrán menos molestias.