Creación de Field Exit

8 11 2007

Una field exit es como una user exit que se utiliza para relacionar un campo determinado de una dynpro (pantalla) con un programa determinado.

A una FIELD EXIT se le llama también EXIT DE CAMPO. Se hace a nivel del elemento de datos. En ella puedes poner tus comprobaciones para un campo en el programa que quieras. Puedes tener varias field exit para un mismo campo en distintas pantallas.

Una FIELD EXIT es una función que tiene la particularidad de que sólo tiene un parámetro de entrada INPUT y uno de salida OUTPUT.

A priori no puedes conocer ningún dato más, aunque siempre puedes utilizar otras field exits para guardar el contenido de otros campos en variables globales al grupo de función, o utilizar la función DYNP_VALUES_READ para leer valores de otros campos de la misma pantalla.

En un Field exit NO podemos usar ninguna de las siguientes instrucciones:

  • BREAK-POINT

  • CALL SCREEN

  • CALL DIALOG

  • CALL TRANSACTION

  • SUBMIT

  • COMMIT WORK

  • ROLLBACK WORK

  • MESSAGE I

NOTA: Para poder activar los Field Exits debemos tener el parámetro
abap/fieldexit = YES seteado en el servidor (Transacción RZ10).


A continuación voy a mostrar un ejemplo completo de cómo crear una field exit para el campo «Clave de periodificación» de la solapa Control de la transacción CJ20N. Donde validaremos que ese campo no este vacío.

image

image

1º) Lo primero que hay que hacer es crear un grupo de función. Para eso vamos a la transacción SE80 y creamos un nuevo grupo de función, por ejemplo: Z_ABGR_SCHL

image

2º) Luego debemos crear nuestra función FIELD EXIT desde la transacción SE37 con el nombre FIELD_EXIT_* ( * = nombre que queramos ) y asociándole el grupo de función que creamos en el paso anterior. Por ejemplo:

image

Con esto ya vamos a tener nuestra función creada con el parámetro INPUT creado en la solapa Import y con el parámetro OUTPUT en la solapa Export.

Para terminar este paso sólo resta poner nuestro código en la solapa Cód.fte. y ACTIVAR.
Como en este caso sólo queremos validar que nuestro campo no quede vacío, el código sería así:

IF INPUT IS INITIAL.

MESSAGE ‘Complete el campo Clv.periodifica’ TYPE ‘E’.

ENDIF.

3º) En este paso volvemos a la transacción SE80 para ACTIVAR y verificar que aparezca la función que creamos:

image

4º) El último paso es crear nuestra FIELD EXIT. Esto es muy sencillo, simplemente ejecutamos el reporte RSMODPRF sin parámetros desde la transacción SE38.

Allí se listarán todas las field exits existentes. Para crear la nuestra clickeamos en el menú «Exit campo» –> «Crear« e ingresamos nuestro elemento de datos, en este caso ABGR_SCHL. Veremos que nuestra field exit se agrega a la lista.

Finalmente, seleccionamos la field exit que acabamos de crear y clickeamos en el botón «Asignar prog./dynpro«. Debemos llenar los campos con el nombre del programa y el número de dynpro que queremos que nuestra field exit este asociada (Ver la primera imagen – Datos dynpro):

image

Nuestra field exit nos debería quedar así:

image

Como vemos el Status de la field es INACTIVO. Por lo tanto nos resta simplemente volver al menú «Exit campo» y clickear en la opción Activar

Con esto ya tenemos nuestra field exit creada y podemos verificar en la transacción CJ20N que si NO llenamos el campo «Clave de periodificación» nos saldrá el mensaje de error que pusimos en el paso 2º


Technorati tags:


Acciones

Information

45 responses

13 11 2007
Adolfo Gonzalez Lopez

Que tal Daniel Enrique Panaro
Viendo el articulo sobre la creación del field exit , tengo un escenario.
El usuario quiere cambiar la clase de aviso de mantenimiento con la transacción IW22, actualmente este campo esta en gris (no se puede modificar) quieren que este campo sea modificable, el nombre del campo es VIQMEL-QMART, es posible con un field exit?

Gracias anticipadas por tu ayuda

13 11 2007
Daniel Panaro

Que tal Adolfo,
Te comento que la solución correcta no sería con una FIELD EXIT sino desde CUSTOMIZING. Donde configures al campo como habilitado.

Para llegar al customizing, apretás F1 sobre el campo «Clase de aviso», vas a ver un link «Customizing para cada clase de aviso.«.
Eso te va a llevar al customizing «Definir clases de aviso», y clickeando sobre el reloj te va a permitir modificar las clases de aviso.

Saludos!!!

9 09 2009
Nieves

Hola,

He utilizado las field exit, tal como señalas, para validar varios campos con el programa RSMODPRF, para la transacción xd01 (primera dynpro).
El tema es que ahora necesito validar el campo vkbur que está en una dynpro que no es la primera (7310) y se la asigno, junto al programa antes de activar la field exit.

TABLES: zsd_agentes.
DATA: BEGIN OF itab OCCURS 0.
INCLUDE STRUCTURE zsd_agentes.
DATA: END OF itab.
DATA: wa_zsd_agentes LIKE LINE OF itab.
DATA: agente LIKE zsd_agentes-zcod_agente.
DATA: dd(2) TYPE n,
mm(2) TYPE n,
aaaa(4) TYPE n.

IF input IS NOT INITIAL.
agente = input.
IF sy-tcode = ‘xd01’.

SELECT SINGLE * FROM zsd_agentes INTO wa_zsd_agentes WHERE zcod_agente = agente.

IF sy-subrc = 0.
dd = wa_zsd_agentes-zfec_alta(2).
mm = wa_zsd_agentes-zfec_alta+2(2).
aaaa = wa_zsd_agentes-zfec_alta+4(4).

concatenate aaaa mm aaaa into wa_zsd_agentes-zfec_alta.
IF sy-datum wa_zsd_agentes-zfec_baja.
MESSAGE e023(zmd09).
else.
MESSAGE e023(zmd09).
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDFUNCTION.

Pero ni caso, no me ejecuta la field exit ni al pulsar enter ni al cambiar de pestaña.

He tenido que utilizar la field exit ZXF04U01, pero solo hace la validación al pulsar grabar, y ya me salta a otra ventana. Me muestra el mensaje, pero ya desde otra ventana.

10 09 2009
Daniel Panaro

Nieves,
Con una field exit no vas a poder validar campos de otra pantalla (dynpro).
Posiblemente la solución es utilizar User Exit.
Cualquier cosa escribime un mail….
Saludos,
Daniel.

18 11 2009
Roberto Carlos

Puedo utilizar algun field exit para validar el campo PO number VBKD-BSTKD?

19 11 2009
Daniel Panaro

Que tal Roberto,
Desde luego puedes validar el campo PO number con una field exit.
Saludos!
Daniel.

14 12 2009
Emanuel

Hola Daniel. Desde ya gracias por la información publicada. ¿Tenés alguna página, entrada de blog o manual en donde se expliquen las ampliaciones (enhancement)?
Manejo Badis, User y Field exits, pero este otro es un tema que me está costando entender y no encuentro algún manual claro.
Desde ya, muchas gracias.

15 12 2009
Daniel Panaro

Hola Emanuel,
Te dejo un par de links. El primero es un ejemplo básico de creación de ampliaciones mientras que el segundo es de SDN muy detallado y con varios documentos.
Espero te sirvan:
http://www.abap.es/centro_enhancement.htm

http://www.sdn.sap.com/irj/sdn/nw-development?rid=/webcontent/uuid/2342e1f3-0b01-0010-a186-fdd404884050

Saludos,
Daniel.

16 02 2010
Joau

Hola Daniel.
He creado un field exit para la SE16 y funciona bien; alli controlo el acceso a determinadas tablas.
Quiero hacer lo mismo para la SE16N. Creo el field exit pero no realiza la validación que deseo al parecer no pasa por alli.
Para la SE16 el elemento de datos es TABNAME y para la SE16N es otro elemento de datos.
Tengo la versión 4.6c. ¿Crees que sea por esto que no puedo tener exito con el field exit?
Saludos

17 02 2010
Daniel Panaro

Que tal Joau,
Entiendo que si los elementos de datos son distintos realizaste otro field exit separado no ?.
Por otro lado chequearía la lógica de ambas field exit. Es decir que se correspondan las variables, declaraciones, etc, para cada tipo de exit.

Espero que lo puedas solucionar,
Saludos!
Daniel.

17 02 2010
Joau

Daniel;
a continuación adjunto logica, variables y el código colocado en las field exit.

Transacción SE16
Datos tecnicos del campo al obtener ayuda con PF1
Estruct. : DATABROWSE
Nombre campo: TABLENAME
Elemento de Datos: TABNAME
Cont.elem.datos: 0
ID parámetro: DTB
Campo dynpro: DATABROWSE-TABLENAME
Programa: SAPLSETB
N° imagen: 0230

Función FIELD_EXIT_TABNAME de la TRANSACCIÓN SE16.

FUNCTION FIELD_EXIT_TABNAME.
*»———————————————————————-
*»*»Interfase local
*» IMPORTING
*» REFERENCE(INPUT)
*» EXPORTING
*» REFERENCE(OUTPUT)
*»———————————————————————-

data: begin of ti_users occurs 0.
include structure ztb_rest_tabla.
data: end of ti_users.

select *
into table ti_users
from ztb_rest_tabla
where tablename = input.

check sy-subrc = 0.

read table ti_users with key bname = sy-uname.

if sy-subrc 0.
message id ‘ZV’ type ‘E’ number ‘000’ with text-e02 input.
endif.

ENDFUNCTION.

el field exit para la TX SE16N es para el elemento de datos SE16N_TAB.
Datos tecnicos del campo al obtener ayuda con PF1
(en blanco) : SE16N_TAB
Nombre campo: (en blanco)
Elemento de Datos: SE16N_TAB
Cont.elem.datos: 0
ID parámetro: (no tiene)
Campo dynpro: GD-TAB
Programa: SAPLSE16N
N° imagen: 0100

la función FIELD_EXIT_SE16N_TAB contiene lo siguiente:

FUNCTION field_exit_se16n_tab.
*»———————————————————————-
*»*»Interfase local
*» IMPORTING
*» REFERENCE(INPUT)
*» EXPORTING
*» REFERENCE(OUTPUT)
*»———————————————————————-

DATA: BEGIN OF ti_users OCCURS 0.
INCLUDE STRUCTURE ztb_rest_tabla.
DATA: END OF ti_users.

SELECT *
INTO TABLE ti_users
FROM ztb_rest_tabla
WHERE tablename = input.

CHECK sy-subrc = 0.

READ TABLE ti_users WITH KEY bname = sy-uname.

IF sy-subrc 0.
MESSAGE ID ‘ZV’ TYPE ‘E’ NUMBER ‘000’ WITH text-e02 input.
ENDIF.

ENDFUNCTION.

luego he asignado el programa y dynpro según corresponde para TABNAME y SE16N_TAB respectivamente y los he activado.

El field exit de TABNAME funciona ok pero el field exit de SE16N_TAB no.

Por favor una ayuda y disculpa por abusar de vuestro tiempo.

18 02 2010
Daniel Panaro

Joau,
Veo que todo estaría correcto aparentemente.
Probaste de chequear si llega dato en el input, por ejemplo:
if input is not initial.
output = ‘HOLA’
endif.

Algo así como para probar,
Saludos!
Daniel.

18 02 2010
Joau

Daniel,
hize la prueba tal cual sugeriste pero no llega dato al input.

Lo raro que encuentro es que al hacer PF1 en el campo e ir a datos tecnicos para obtener el elemento de datos encuentro lo siguiente en el recuadro de ‘Datos campo’.

: SE16N_TAB
Nombre campo :
Elem.datos : SE16N_TAB
Cont.elem.datos: 0

¿crees que habrá alguna nota al respecto?

Saludos y gracias.
Joau

19 02 2010
Daniel Panaro

Bueno aparentemente el problema es que no es aplicable el field exit a dicho campo. No encontré una nota en SAP al respecto.

Espero puedas solucionarlo igualmente quedo a disposición.
Saludos,
Daniel.

24 06 2010
Cesar Sanchez

Buenas tardes Daniel, mira tengo una pregunta es muy sencilla, resulta que he hecho unas field_exit usando la explicacion que das en la pagina, muy buena por cierto, pero resulta que en el ambiente Dev, funcionan como deben ser, pero al pasarlas a QAS, no generan los mensajes, y otra field_exit no funciona en su totalidad, y te repito en Dev funcionan muy bien, comparo los MF y estan bien lo mismo que las field_exit estan activas en QAS, pero no se por que no funcionan como debe ser???, me podrias colaborar, ya verifique y por la RZ10 se encuentra la variable abap/fieldexit en yes, de antemano muchas gracias por tu colaboracion, te confirmo mi mail es cesara_sanchez@hotmail.com

30 06 2010
Daniel Panaro

Que tal Cesar,
Te propongo que me escribas un mail enviándome el código de tu field exit.
Quizás puede haber algo que cambie entre DEV y QAS.

Te recomendaría ir probando la field exit por bloques de código verificando que funcione correctamente.

Saludos y suerte.
Daniel.

21 07 2010
Aldo Sosa

Hola Daniel! por lo que veo tienes mucha experiencia en abap, yo al igual que varios pues no he trabajado mucho y quisiera saber si tu me puedes orientar de como realizar un evento o un USER EXIT en la transaccion MIGO al momento de que el usuario pulse el boton Contabiliza o luego del AFTER INPUT que yo pueda ingresar codigo para validar los costos de la Entrada de Mercancias por posicion!
Tu podrias sugerirme que tipo evento utilizo? nose si un USER EXIT, FIELD EXIT, ENHANCEMEN POINT o otra cosa! de antemano gracias…!

31 08 2010
Daniel Panaro

Hola Aldo,
Lo que tienes que utilizar son USER EXIT.
Para que por ejemplo al presionar el botón de Grabar se ejecute tu validación.
Para saber cuáles son las USER EXIT que tiene la transacción MIGO te recomiendo ejecutar el siguiente programa:

Programa que lista USER-EXITS de una transacción

Espero que te sirva.
Saludos,
Daniel.

3 08 2010
Andres Ruilova

Deseo validar las posiciones en el ingreso de un pedido de venta por la VA01. Quiero validar que segun el tipo de posicion no puedan modifcar las cantidades,
He intentado hacerlo con un Field Exit en la cantidad del pedido pero no me funciona correctamente.

Espero me puedan ayudar.

31 08 2010
Daniel Panaro

Hola Andrés,
Se me ocurre que podrías validar las posiciones al momento de grabar en la VA01 utilizando una USER-EXIT.
Para saber cuáles son las USER-EXIT permitidas para la transacción VA01 te dejo este programa:

Programa que lista USER-EXITS de una transacción

Saludos,
Daniel.

7 06 2011
Mario

Hola Daniel, el tema para el cual requiero ayuda es que deseo que para un grupo de usurios que se inhabiliten los campo Cierre técnico y Anular cierre técnico en la tx. CO02 pero que quede habilitado para otro grupo de usuarios autorizados.
No se si aplique trabajar con un user exit, field exit u otra herramienta.

8 06 2011
Daniel Panaro

Hola Mario,
La forma más prolija de manejar eso, de ser posible, sería con seguridad desde BASIS.
En caso contrario se podría llegar a solucionar con una User o Field Exit.

Saludos,
Daniel.

22 12 2011
Edwin

Hola Daniel, veo en los comentarios que manejas Badis, User y Field exits.
Yo ya e intentado sin éxito con User exit, BTE y BAdIs crear una modificación a un campo que se encuentra en las transacciones FV60, FB60, MIRO y MIR7, nunca intente con field exit por que tengo que hacer un cambio antes de que se muestre el campo(o sea proponer un valor por defecto) y tengo entendido que los field exit solo se ejecuta luego, quiero saber si esto es totalmente cierto, y de ser así que me recomiendas que no se me ocurre nada mas que hacer.

26 12 2011
Daniel Panaro

Hola Edwin,
Efectivamente los field exits se ejecutan luego de un input.

No se qué es lo que tenés que hacer específicamente. Pero una alternativa puede ser realizar una validación/sustitución de FI.
Hay muchas guías e instructivos dando vueltas por internet.

Espero lo puedas solucionar.
Saludos cordiales,
Daniel.

26 12 2011
Edwin

Gracias Daniel, estoy eso de la validación/sustitución espero me funcione, saludos.

19 01 2012
Camila

Hola Daniel,
Hace mucho tiempo que no trabajo con Field-Exits dado que SAP las ha tratado de «quitar del mapa» ya que ahora utilizamos los enhancements. El punto es que estoy haciendo una modificación en una versión anterior a los ENH y no me queda otra que utilizar Field-Exit.
Tengo que validar en la transacción VK11 un dato que se encuentra en una tabla de la 3er pantalla. En la 1er pantalla se completa la Cond de Precio, en la segunda se elije la clave para dicha condición y en la 3era se cargan los datos. Es el campo FECHA HASTA de la tabla.
Lo que no recuerdo es cómo manejar los datos de una tabla, de una línea puntual (al menos la primera) desde un Field-Exit.
Desde ya muchas gracias por tu tiempo y por tu ayuda.
Cordialmente,
Camila.

7 02 2013
Yamila

Hola Daniel

El manual sirvio muchisimo! Te cuento que necesito validar que para una determinada sociedad, el campo KDKG1 sea obligatorio. El field exit sirvió pero necesito que se valide al grabar ya que el campo está en datos adicionales y si el usuario no accede a esa dynpro no queda validado. Tenes idea que user exit puedo utilizar?

Muchas gracias

Yamila

8 02 2013
Daniel Panaro

Hola Yamila,
Tendrías que ver si la transacción en cuestión tiene una USER-EXIT al momento de grabar.
Así vas a poder validar que el campo KDKG1 tenga datos.

Saludos,
Daniel.

24 02 2014
Jose Luis Soriano Garcia

Que tal compañeros, tengo un problema, me pidieron crear un nuevo tab o pestaña en la transacción CJ20N, de casualidad alguien sabes que tengo que hacer para podérsela incluir.
Saludos……

25 02 2014
Daniel Panaro

Hola Jose,
Tenes que crear un enhancement. Tenes que guiarte con la nota 522581.
Espero te sirva, saludos!

23 05 2014
reinel rojas diaz

Daniel, interesante tu conocimiento en abap, no soy abap sino funcional y utilizo una transacción QPRI crear documentos de calidad muestra, necesito adicionar unos nuevos campos para ingreso de datos bajo formato de fecha y tiempo y texto . con el field exit se puede hacerse, cual es su recomendación para hacerlo ? gracias

Reinel R

26 05 2014
Daniel Panaro

Reinel,
Las field exit sirven para realizar validaciones en los campos existentes.

Como en tu caso necesitas crear nuevos campos. Entonces deberás utilizar Enhancement:
http://www.abap.es/centro_enhancement.htm

Saludos,
Daniel.

8 09 2014
Kenny Junior Mercedes Rojas

HOLA COMO PODRIA HACER EL CAMPO TEXTO OBLIGATORIO EN LA MIRO

12 09 2014
Daniel Panaro

Hola Kenny,
Proba con lo siguiente:
1) Ingresar a la transacción OB41 y seleccionar el «posting key 31».
2) Click en «Maintain Field Status», elegir «General data»
3) Y en la siguiente pantalla tildar el campo «Text» como obligatorio (Required entry).
4) Guardar los datos y listo.

Saludos,
Daniel.

6 10 2014
David_abap

Hola Daniel!!

Te quería realizar una consulta. ¿Conoces alguna manera de saber que ID tiene un parámetro que aprentemento no tiene al buscar con F1?

Necesito este ID para pasar el parámetro antes de realizar un CALL TRANSACTION…

Gracias y un saludo,

David.

7 10 2014
Daniel Panaro

Hola David,
Al ver los datos técnicos del elemento debería figurar el dato del ID.
En caso de estar vacío, es posible que se sea un dato Z.
Por lo tanto deberás crearlo.

Saludos,
Daniel.

4 09 2015
Raul

Hola David,
Tengo un problema cuando quiero modificar un acreedor desde la transacción fk02 quiero que el campo Iban_val y el campo swift no estén vacíos. Como podría controlar esto con una user exit y si es el caso cual o por el contrario cual seria la solución.

4 09 2015
Daniel Panaro

Raul,
Podés probar con la User-Exit «SAPMF02K».

Espero te sirva.
Saludos,
Daniel.

18 02 2016
Karla

Hola, tengo un problema, en mi pais ahora hay algunos NIF 1 que comienzan con «C», pero SAP a traves del estándar no permite guardarlo, pero conozco otra empresa donde implementaron un fiel exit que hace todas las validaciones y le permite guardar RIF que comienzan con C pero no se como hicieron para deshabilitar el programa de sap que valida esto, tienen idea? ya que yo implemente el field_exit y hace las validaciones que yo coloque en mi fiel_exit del campo rif pero tambien ejecuta el la validacion que hace sap

20 01 2017
Haiian Joel D'Onofrio

Hola, estoy realizando un requerimiento en el cual solicitan un field-exit para el campo Contrato Marco(KONNR) de la tx ME52N, ya realice el field-exit pero al momento de cambiar el dato del campo y darle enter no pasa nada. Podria ser que en vez de un field-exit deba usar un user-exit.
Saludos y espero la respuesta.

20 01 2017
Daniel Panaro

Que tal,
Una alternativa podría ser una user-exit.
Pero la field-exit debería funcionar también. Probá de hacer un debug y asegurate de estar devolviendo el dato a la estructura/campo de salida correcta.

Saludos,
Daniel.

27 03 2017
Ernesto Lara

Buenos días Daniel,

Te felicito por ser una persona de calidad y gentileza al apoyar a tantos con tus conocimientos.

Yo quisiera utilizar un field exit para realizar una validación a un campo, si ésta es exitosa quisiera actualizar otros campos de la misma dynpro. Traté utilizando la función dynp_values_update pero no los actualizó. He visto user exits donde lo están usando pero no field exits. Me podrías de favor comentar si es factible su uso para este caso?

27 03 2017
Daniel Panaro

Que tal Ernesto,
Recomiendo que busques una user-exit que te permita hacer todo junto (validar el campo y actualizar otros).

Muchas gracias por tus palabras!!!
Saludos,
Daniel.

27 03 2017
Ernesto Lara

Buenos días Daniel,

Muchas gracias!, me fue muy grato recibir tu pronta respuesta.

Buscaré un user exit donde pienso al igual que tú que esa sería la solución.

Saludos cordiales.

16 06 2019
Anónimo

Buenas tardes Daniel,

Por favor me puedes indicar ¿Como puedo visualizar el número o codigo que tiene el mensaje de error asociado a un field exit en la transacción XD01?

Deja un comentario