Manejo del tiempo de espera en una Webdynpro Abap

0
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.

Tags

Publicar un comentario

0Comentarios
Publicar un comentario (0)