Interrelación entre Matchcodes (F4) (ABAP)

Hay veces en que nos piden la creación de 2 Matchcodes o ayudas de búsqueda, pero que estas se encuentren interrelacionadas, es decir que cuando yo coloque un código en el primer matchcode, en el segundo solo filtre los sub-codigos respectivos al código señalado anteriormente, en imagenes sería de la siguiente forma:

En la pantalla principal tenemos nuestro parametro de Budget Category en donde se encuentran algunos códigos, estos códigos tienen a su vez subcodigos que se hallan en el parámetro Sub-Budget Category, primero veamos que seleccionamos el Budget Category 0002

14-Jun-2013 12-40-55 p-m-

Y ahora cuando presionamos el matchcode para el parámetro Sub-Budget Category veremos que solo nos muestra los sub-códigos adecuados para lo anterior señalado

14-Jun-2013 12-41-06 p-m-¿Cómo logramos realizar esta validación?, pues para ello realizaremos los siguientes pasos:

1- Para la realización de este procedimiento se debera crear el matchcode mediante código (tutorial aquí) para ello emplearemos el evento: AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_BUDCAT-LOW. En donde notaremos que al final del evento hacemos mención del parámetro o el select-options (para nuestro caso de ejemplo).

OJO: Para el caso de los Select-options hay que tener en cuenta que se debe hacer de manera independiente este código tanto para el valor LOW como para el valor HIGH.

2- Tras colocar el evento VALUE-REQUEST empezaremos a colocar el código para la lectura de la tabla y la generación de nuestro matchcode, con la indicación del retorno del parámetro seleccionado:

AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_BUDCAT-LOW.

*Se realizan las búsquedas y se anexan los valores a la tabla interna
  SELECT ZBUDCAT ZBUDCAT_TXT INTO CORRESPONDING FIELDS OF TABLE IT_ZBUDCAT
    FROM ZBUDCAT.

*Se hace uso de la función que convoca al matchcode y transforma nuestra tabla interna
  CALL FUNCTION ‘F4IF_INT_TABLE_VALUE_REQUEST’
    EXPORTING
      RETFIELD        = ‘ZBUDCAT’
      WINDOW_TITLE    = ‘Categoría de presupuesto’
      VALUE_ORG       = ‘S’
    TABLES
      VALUE_TAB       = IT_ZBUDCAT
      RETURN_TAB      = IT_MATCH
    EXCEPTIONS
      PARAMETER_ERROR = 1
      NO_VALUES_FOUND = 2
      OTHERS          = 3.
*Si todo es correcto
  IF SY-SUBRC EQ 0.

*Leemos lo que obtenermos y se lo pasamos a nuestro parámetro
    READ TABLE IT_MATCH INDEX 1.
    MOVE IT_MATCH-FIELDVAL TO S_BUDCAT-LOW.
  ENDIF.

3- Lo diferente al tutorial anterior y lo que nos importa en este presente tutorial, es el hecho de validar el parámetro que se ingreso una vez se seleccione el valor solicitado en el matchcode, en otras palabras, lo que buscamos es almacenar la variable que se ingresa y con ella emplear la búsqueda para nuestro siguiente matchcode, pero ello no lo podemos lograr sin que se presione antes la tecla enter, sin embargo ¿Cómo simulamos un enter? para ello debemos copiar y pegar el código que esta lineas abajo, este código debe encontrarse seguidamente después de lo anterior indicado y el único valor que deben declarar en el TOP es la variable d_gui, la cual es del tipo C (char de 1) [la declaración debe ser de la siguiente manera: DATA: d_gui TYPE C. ]

    CALL FUNCTION ‘SAPGUI_SET_FUNCTIONCODE’
      EXPORTING
        functioncode           = ‘##PAI##’
      EXCEPTIONS
        function_not_supported = 1
        OTHERS                 = 2.
    IF sy-subrc EQ 0.
      d_gui = ‘X’. “<– Inicializar flag indicativo del proceso
    ENDIF.

    IF NOT d_gui IS INITIAL.
      CALL FUNCTION ‘SAPGUI_SET_FUNCTIONCODE’
        EXPORTING
          functioncode           = ‘=’
        EXCEPTIONS
          function_not_supported = 1
          OTHERS                 = 2.
      CLEAR d_gui.
      EXIT. “<– para salir del evento
    ENDIF.

4- Una vez colocado el código procedemos a crear nuestro segundo matchcode del sub-código y al momento de realizar la búsqueda en la tabla correspondiente podremos emplear el valor del parámetro anteriormente obtenido, continuando con el ejemplo seria de la siguiente forma:

AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_SUBUCA-LOW.

*Se realizan las búsquedas y se anexan los valores a la tabla interna
  SELECT B~ZSUBUCA B~ZSUBUCA_TXT INTO CORRESPONDING FIELDS OF TABLE IT_ZSUBUCA
    FROM ZBUDCAT AS A
    INNER JOIN ZSUBUCA AS B ON A~ZBUDCAT = B~ZBUDCAT
    WHERE A~ZBUDCAT IN S_BUDCAT.

*Se hace uso de la función que convoca al matchcode y transforma nuestra tabla interna
  CALL FUNCTION ‘F4IF_INT_TABLE_VALUE_REQUEST’
    EXPORTING
      RETFIELD        = ‘ZSUBUCA’
      WINDOW_TITLE    = ‘Sub-categoría de presupuesto’
      VALUE_ORG       = ‘S’
    TABLES
      VALUE_TAB       = IT_ZSUBUCA
      RETURN_TAB      = IT_MATCH
    EXCEPTIONS
      PARAMETER_ERROR = 1
      NO_VALUES_FOUND = 2
      OTHERS          = 3.
*Si todo es correcto
  IF SY-SUBRC EQ 0.

*Leemos lo que obtenermos y se lo pasamos a nuestro parámetro
    READ TABLE IT_MATCH INDEX 1.
    MOVE IT_MATCH-FIELDVAL TO S_SUBUCA-LOW.
  ENDIF.

Listo una vez terminado de colocar el código procedemos a activar y a probar.

OJO: Tener presente que para que la acción del enter funcione los campos obligatorios deben estar llenos, pues en caso no esten llenos nos indicara que debemos llenarlos y cuando presionemos en el sub-matchcode no nos saldra filtrado sino todos en general, esto tenerlo muy presente para indicarlo al usuario.

14-Jun-2013 03-09-55 p-m-

14-Jun-2013 03-10-06 p-m-

* Como se puede ver en la imagen anterior, al ingresar nuestro código principal nos ha saltado un mensaje de error por no llenar el parámetro obligatorio y cuando a pesar del error queremos seleccionar el sub-código, notaremos que nos trae todos los valores, sin filtrarlo como lo habiamos programado. Tener mucho cuidado con ello.

OJO: Para trabajar el caso en dynpros, se debe emplear con el evento: PROCESS ON VALUE-REQUEST y emplear los mismos códigos en los module respectivos.

14-Jun-2013 03-04-26 p-m-

Ejemplo en module ENTRA:

14-Jun-2013 03-07-06 p-m-

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

w

Conectando a %s