sábado, 3 de mayo de 2014

¿Como añadir eventos a una pantalla de selección?

En este post vamos a ver como podemos añadir algunos eventos a una pantalla de selección.


Comenzaremos viendo como añadir una ayuda de busqyeda en un determinado campo de nuestra pantalla de selección:
 
* Oper
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_oprtor.
  PERFORM help_f4_oper USING p_oprtor.

* Flot
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_float.
  PERFORM help_f4_flot USING p_float.
 
Donde el FORM es el siguiente:
*&---------------------------------------------------------------------*
*&      Form  HELP_F4_OPER
*&---------------------------------------------------------------------*
*    Muestra una ventana con los posibles valores para el operador
*    dando la posibilidad de seleccionar uno de ellos. Devuelve en el
*    parámetro el valor seleccionado
*----------------------------------------------------------------------*
*      -->P_OPRTOR      Oper seleccionado
*----------------------------------------------------------------------*
FORM help_f4_oper  USING  p_oprtor.
* Insertamos en la tabla de campos los atributos del campo a mostrar
  REFRESH: i_fields, i_valores.
  CLEAR:   i_fields, i_valores.
  i_fields-tabname = 'CAWN'.
  i_fields-fieldname = 'ATWRT'.
  i_fields-selectflag = 'X'.
  APPEND i_fields.
  CLEAR  i_fields.
  i_fields-tabname = 'CAWNT'.
  i_fields-fieldname = 'ATWTB'.
  i_fields-selectflag = 'X'.
  APPEND i_fields.
 
* Seleccionamos los distintos valores para el campo operador
  SELECT atwrt atzhl
    INTO CORRESPONDING FIELDS OF cawn
    FROM cawn
    WHERE atinn = gv_atinn_o.
    SELECT SINGLE atwtb
    INTO i_valores-valor
    FROM cawnt
    WHERE atinn = gv_atinn_o
    AND   atzhl = cawn-atzhl
    AND   spras = sy-langu.
    APPEND i_valores.
    CLEAR  i_valores.
    i_valores-valor = cawn-atwrt.
    APPEND i_valores.
    CLEAR i_valores.
  ENDSELECT.
  CALL FUNCTION 'HELP_VALUES_GET_WITH_TABLE'
    EXPORTING
      fieldname                           = 'CAWNT'
      tabname                             = 'ATWTB'
    IMPORTING
      select_value                        = p_oprtor
    TABLES
      fields                              = i_fields
      valuetab                            = i_valores
*   EXCEPTIONS
*     FIELD_NOT_IN_DDIC                   = 1
*     MORE_THEN_ONE_SELECTFIELD           = 2
*     NO_SELECTFIELD                      = 3
*     OTHERS                              = 4
 
ENDFORM.                    " HELP_F4_OPER
Necesitamos definir las siguientes estructuras:
*-- Estructuras para matchcodes
* Tabla interna para almacenar los campos y atributos a visualizar
DATA BEGIN OF i_fields OCCURS 1.
        INCLUDE STRUCTURE help_value.
DATA END OF i_fields.
* Tabla interna par almacenar el valor de los campos a mostrar
DATA: BEGIN OF i_valores OCCURS 0,
        valor(50) TYPE c,
      END OF i_valores.
 
 

 
Si queremos tomar en la ayuda de búsqueda alguno de los parámetros de la pantalla de selección debemos utilizar la siguiente función:
DATA   DYFIELDS LIKE DYNPREAD OCCURS 1 WITH HEADER LINE.
CLEAR: DYFIELDS[], DYFIELDS.
DYFIELDS-FIELDNAME = 'P_TPLNR'.
APPEND DYFIELDS.
CALL FUNCTION 'DYNP_VALUES_READ'
  EXPORTING
    DYNAME                         = SY-CPROG
    DYNUMB                         = SY-DYNNR
*   TRANSLATE_TO_UPPER             = ' '
*   REQUEST                        = ' '
*   PERFORM_CONVERSION_EXITS       = ' '
*   PERFORM_INPUT_CONVERSION       = ' '
*   DETERMINE_LOOP_INDEX           = ' '
  TABLES
    DYNPFIELDS                     = DYFIELDS
* EXCEPTIONS
*   INVALID_ABAPWORKAREA           = 1
*   INVALID_DYNPROFIELD            = 2
*   INVALID_DYNPRONAME             = 3
*   INVALID_DYNPRONUMMER           = 4
*   INVALID_REQUEST                = 5
*   NO_FIELDDESCRIPTION            = 6
*   INVALID_PARAMETER              = 7
*   UNDEFIND_ERROR                 = 8
*   DOUBLE_CONVERSION              = 9
*   STEPL_NOT_FOUND                = 10
*   OTHERS                         = 11.
  READ TABLE DYFIELDS INDEX 1. 
Para controlar eventos sobre los controles:
*-----------------------------------------------------------------------
*     AT SELECTION-SCREEN OUTPUT
*-----------------------------------------------------------------------
AT SELECTION-SCREEN OUTPUT.
  PERFORM pantalla_seleccion.
*-----------------------------------------------------------------------
*     AT SELECTION-SCREEN
*-----------------------------------------------------------------------
AT SELECTION-SCREEN.
  PERFORM pantalla_seleccion.
 
****OPER
  IF NOT p_oprtor IS INITIAL.
    IF NOT p_mpd IS INITIAL.
      CLEAR p_oprtor.
    ELSE.
      TRANSLATE p_oprtor TO UPPER CASE.
      SELECT SINGLE atwrt INTO cawn-atwrt
             FROM cawn
             WHERE atwrt = p_oprtor
               AND atinn = gv_atinn_oaci.
      IF sy-subrc <> 0.
        MESSAGE e246 WITH p_oprtor.
      ENDIF.
    ENDIF.
  ELSEIF NOT p_mp IS INITIAL.
    MESSAGE E001(ZIMPD) WITH 'Operador'.
  ENDIF.
****FLOT
  IF NOT p_flot IS INITIAL.
    TRANSLATE p_floats TO UPPER CASE.
    SELECT SINGLE atwrt INTO cawn-atwrt
           FROM cawn
           WHERE atwrt = p_flot
             AND atinn = gv_atinn_cgrup_flot.
    IF sy-subrc <> 0.
      MESSAGE e174.
    ENDIF.
  ENDIF.
Donde el Form:
*&---------------------------------------------------------------------*
*&      Form  pantalla_seleccion
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form pantalla_seleccion .
  IF NOT p_mpd IS INITIAL.
    clear p_oprtor.
    LOOP AT SCREEN.
      IF SCREEN-NAME = 'P_OPRTOR'.
        SCREEN-INPUT = 0.
        MODIFY SCREEN.
      ENDIF.
    ENDLOOP.
 
  ELSEIF NOT p_mp  is initial.
    IF p_oprtor IS INITIAL.
      p_oprtor = gc_oper_ibe.
    ENDIF.
    LOOP AT SCREEN.
      IF SCREEN-NAME = 'P_OPRTOR'.
        SCREEN-INPUT = 1.
        MODIFY SCREEN.
      ENDIF.
    ENDLOOP.
  ENDIF.
endform.                    " pantalla_seleccion

Como siempre, cualquier comentario, sugerencia o duda hacermela llegar.
 

No hay comentarios:

Publicar un comentario