Crear Matchcodes (ayudas) con una tabla interna.

28 11 2007

El próximo ejemplo sirve para crear ayudas (matchcodes) con una tabla interna de nuestro programa.
Así de simple, hacemos una búsqueda a alguna tabla y el resultado lo guardamos en una tabla interna que se la pasamos a la función F4IF_INT_TABLE_VALUE_REQUEST que nos va a mostrar la ayuda.

Quiero agradecer esta forma de crear ayudas a mi compañero y amigo Rodrigo (http://ramgv-sap.blogspot.com).


*En este ejemplo creo un select-option para un material. Cuya ayuda será *el nº de material para VBELN =  ‘0000000001’ y POSNR = ‘000010’.

TABLES: VBAP,
             DDSHRETVAL.

DATA: BEGIN OF IT_MATNR OCCURS 0,
               MATNR LIKE VBAP-MATNR,
               ARKTX LIKE VBAP-ARKTX,
           END OF IT_MATNR.

DATA: BEGIN OF IT_MATCH OCCURS 0,  «Esta tabla nos devuelve la ayuda
               SHLPNAME  LIKE DDSHRETVAL-SHLPNAME,
               FIELDNAME LIKE DDSHRETVAL-FIELDNAME,
               RECORDPOS LIKE DDSHRETVAL-RECORDPOS,
               FIELDVAL  LIKE DDSHRETVAL-FIELDVAL,
               RETFIELD  LIKE DDSHRETVAL-RETFIELD,
           END OF IT_MATCH.

SELECTION-SCREEN BEGIN OF BLOCK BLQ1 WITH FRAME TITLE TEXT-T01.
  SELECT-OPTIONS: S_MATNR FOR VBAP-MATNR NO-EXTENSION NO INTERVALS.
SELECTION-SCREEN END OF BLOCK BLQ1.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_MATNR-LOW.
  SELECT MATNR
              ARKTX
      FROM VBAP
        INTO TABLE IT_MATNR
        WHERE VBELN EQ ‘0000000001’ AND
                    POSNR EQ ‘000010’.

  CALL FUNCTION ‘F4IF_INT_TABLE_VALUE_REQUEST’
    EXPORTING
      RETFIELD        = ‘MATNR’
      WINDOW_TITLE    = ‘Material’
      VALUE_ORG       = ‘S’
    TABLES
      VALUE_TAB       = IT_MATNR
      RETURN_TAB      = IT_MATCH
    EXCEPTIONS
      PARAMETER_ERROR = 1
      NO_VALUES_FOUND = 2
      OTHERS          = 3.

  IF SY-SUBRC EQ 0.
    READ TABLE IT_MATCH INDEX 1.
    MOVE IT_MATCH-FIELDVAL TO S_MATNR-LOW.
  ENDIF.


Technorati tags:


Acciones

Information

13 responses

16 01 2008
lucas

Soy nuevo en esto y un poco desmemoriado, por lo que este tipo de consultas sacan del apuro muy rapido.

saludos

2 10 2008
Juan

Daniel, útil esto del match code; le hice alguna modificacion al programa para que me trajera del maetro de materiales. Te lo ajunto. saludos.

REPORT ZPRUEBA1.
*——————————————————————————–*
*Este reporte sirve para generar un matchcode con referencia a una tabla interna.*
*——————————————————————————–*

TABLES: DDSHRETVAL,
BKPF,
MARA.

DATA: BEGIN OF IT_MATNR OCCURS 0,
MATNR LIKE MARA-MATNR,
MAKTG LIKE MAKT-MAKTG,
END OF IT_MATNR.

*“Esta tabla nos devuelve la ayuda
DATA: BEGIN OF IT_MATCH OCCURS 0,
SHLPNAME LIKE DDSHRETVAL-SHLPNAME,
FIELDNAME LIKE DDSHRETVAL-FIELDNAME,
RECORDPOS LIKE DDSHRETVAL-RECORDPOS,
FIELDVAL LIKE DDSHRETVAL-FIELDVAL,
RETFIELD LIKE DDSHRETVAL-RETFIELD,
END OF IT_MATCH.

SELECTION-SCREEN BEGIN OF BLOCK BLQ1 WITH FRAME TITLE TEXT-T01.
*Este primer select-options usa la TABLA INTERNA para busqueda debido a (++)
SELECT-OPTIONS: S_MATNR FOR MARA-MATNR NO-EXTENSION NO INTERVALS.

*Este segundo select-options usa la búsqueda estándar
SELECT-OPTIONS: S_BUKRS FOR BKPF-BUKRS NO-EXTENSION NO INTERVALS.

*Este tercer select-options usa la búsqueda estándar
SELECT-OPTIONS: S_MATNR2 FOR MARA-MATNR NO-EXTENSION NO INTERVALS.
SELECTION-SCREEN END OF BLOCK BLQ1.

** (++) debido a la sentencia siguiente que afecta sólo a S_MATNR
AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_MATNR-LOW.

SELECT MATNR MAKTG
INTO TABLE IT_MATNR
FROM MAKT
WHERE SPRAS EQ ‘S’.

CALL FUNCTION ‘F4IF_INT_TABLE_VALUE_REQUEST’
EXPORTING
RETFIELD = ‘MATNR’
WINDOW_TITLE = ‘MATERIAL’
VALUE_ORG = ‘S’
TABLES
VALUE_TAB = IT_MATNR
RETURN_TAB = IT_MATCH
EXCEPTIONS
PARAMETER_ERROR = 1
NO_VALUES_FOUND = 2
OTHERS = 3.

IF SY-SUBRC EQ 0.
READ TABLE IT_MATCH INDEX 1.
MOVE IT_MATCH-FIELDVAL TO S_MATNR-LOW.
ENDIF.

4 10 2008
Daniel Panaro

Muchas gracias por el aporte Juan.
Saludos,
Daniel.

17 09 2009
Gabriela

Hola Daniel!

Una consulta nomás, muy bueno el topico, el unico cambio que le haria seria la declaracion de it_match:
types: ty_match type ddshretval. » Tal como figura en la funcion
data: ti_match type standard table of ty_match
data: st_match type ty_match.

Cambiaria el read por esto:
read ti_match into st_match INDEX 1
move st_match-fieldval to S_MATNR-LOW.

Mi duda es.. porque el INDEX es 1? .. perdona si es obvia la pregunta, pero no comprendo porque debe ser 1.

Gracias!!

18 09 2009
Daniel Panaro

Que tal Gabriela,
Luego que aparece el listado del matchcode siempre se elige una sola opción. Por lo que la tabla it_match va a tener sólo un registro. Y es por eso que se lee con index 1 para que lea ese primer registro.

Saludos,
Daniel.

24 09 2009
zrivera

Hola, tengo una duda… si quisiera limitar la busqueda del select a algún material que desee el usuario para que el matchcode no muestre tantos resultados, como le puedo hacer? Por ejemplo si el usuario captura el material «00000*» que el matchcode solo muestre los materiales que inician con 5 ceros:

SELECT MATNR MAKTG
INTO TABLE IT_MATNR
FROM MAKT
WHERE MATNR LIKE S_MATNR-LOW.

Lo he intentado, pero al llamar al evento AT…ON VALUE-REQUEST el campo de la pantalla S_MATNR-LOW no tiene ningun valor.

Alguien sabe alguna forma de hacerlo?

Saludos

27 09 2009
Daniel Panaro

Que tal Rivera,
Si en la variable s_matnr-low recibes por parte del usuario el valor “00000*”, lo que debes hacer antes del select es cambiar el * por % antes de hacer el select.
Mira este link: https://danielpanaro.wordpress.com/?s=patron
Espero te que te sirva, saludos!
Daniel.

14 07 2011
Salvador Gil

¿Esto se puede aplicar en cualquier trx?,
por ejemplo cambiar los valores del MatchCode de Clase de Documento en la F-48.

¿En que momento se indicaría que al dar F4 se utilizaria nuestro nueva ayuda?

15 07 2011
Daniel Panaro

Salvador,
Esto lo se puede aplicar en programas Z. La transacción F-48 es estándard y por lo tanto no permite la modificación del código.

A partir de la sentencia «AT SELECTION-SCREEN ON VALUE-REQUEST FOR…» se indica que se utilizará la ayuda.

Saludos cordiales,
Daniel Panaro.

23 09 2011
Daniel Avalos

Hola esta buena la forma del matchcode, pero lo que yo ando buscando es la forma de armar un «arbol» de busqueda, tal y como lo hace la RH_OBJID_REQUEST. sabes como hacerlo?

muchas gracias

1 12 2017
Rosa Bolívar

Hola me copie tu código y me da error, cuando lo ejecuto porque me dice que la tabla interna que cree, no tiene la longitud correcta y no sé a que se refiere. te adjunto el código.DATA: BEGIN OF ti_busq OCCURS 0, «Esta tabla nos devuelve la ayuda
material LIKE ZMATE_BAJA_ROT-cod_mat,
cuota LIKE ZMATE_BAJA_ROT-cuota,
MONTO LIKE ZMATE_BAJA_ROT-monto,
FECHA_ini LIKE ZMATE_BAJA_ROT-fecha_ini,
FECHA_FIN LIKE ZMATE_BAJA_ROT-fecha_fin,
GRUPO LIKE ZMATE_BAJA_ROT-grupo,
END OF ti_busq.

DATA: BEGIN OF ti_resul OCCURS 0, «Esta tabla es donde almacenamos los resultados
material LIKE makt-matnr,
END OF ti_resul.

PARAMETERS: T_GRU TYPE MATNR.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR T_GRU.
SELECT COD_MAT
INTO TABLE ti_resul
FROM Zmate_baja_rot
WHERE GRUPO EQ ‘X’.

* llamamos a la funcion que nos inserta la ayuda de busqueda, en esta le marcamos el campo
* que exporta y le pasamos la tabla de resultados que queremos que nos muestre y una tabla de retorno
CALL FUNCTION ‘F4IF_INT_TABLE_VALUE_REQUEST’
EXPORTING
retfield = ‘COD_MAT’
«window_title = ‘Ayuda de busqueda’
«value = ‘*’
«value_org = ‘S’
TABLES
value_tab = ti_resul
return_tab = ti_busq
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.

IF sy-subrc EQ 0.
READ TABLE ti_busq INDEX 1.
MOVE ti_busq-material TO T_GRU.
ENDIF.

7 03 2018
Vanessa

hola! un matchcode para que se puedan cargar arcihvos desde la computadora al servidor ? porfavor

8 03 2018
Daniel Panaro

Hola Vanesa,
Para elegir archivos de tu pc a traves del matchcode podés utilizar la función WS_FILENAME_GET en la sección de AT SELECTION-SCREEN

Ejemplo:
PARAMETERS: P_FILE LIKE RLGRAP-FILENAME DEFAULT ‘C:\’.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.

CALL FUNCTION ‘WS_FILENAME_GET’
EXPORTING
DEF_PATH = P_FILE
TITLE = ‘Elegir archivo’

IMPORTING
FILENAME = P_FILE

EXCEPTIONS
INV_WINSYS = 1
NO_BATCH = 2
SELECTION_CANCEL = 3
SELECTION_ERROR = 4
OTHERS = 5.

Deja un comentario