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: sdn blogger

Add me to your del.icio.us
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: http://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