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.
Soy nuevo en esto y un poco desmemoriado, por lo que este tipo de consultas sacan del apuro muy rapido.
saludos
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.
Muchas gracias por el aporte Juan.
Saludos,
Daniel.
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!!
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.
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
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.
¿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?
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.
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
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.
hola! un matchcode para que se puedan cargar arcihvos desde la computadora al servidor ? porfavor
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.