PDA

Ver la Versión Completa : User Exit Me51n


Paola79
25/05/09, 20:54:02
Hola a todos,

No estoy muy puesta en las USER EXIT y megustaría a ver si alguién me puede echar una mano:

La USER EXIT la he encontrado, o eso creo, la necesito para lo siguiente: Según el GRUPO DE ARTICULOS saltrá automaticamente el GRUPO DE COMPRAS, me gustaría saber como encontrar la USER EXIT y como activarla y poder ponerle los break points para ponerle el código en el lugar conrrespondiente.

Un saludo y gracias de antemano,

DavidXD_XD
25/05/09, 20:56:41
Hola Paola, falto lo mas importante ... a q transaccion quieres aplicar el user exit?

Paola79
25/05/09, 21:02:23
Perdona david la ME51N

DavidXD_XD
25/05/09, 21:33:12
jejeje, toy voladazo, mas bien disculpame tu por no fijarme bien, lo que quieres huele a una BADI, no he tenido experiencia con ellos dentro de esa transaccion pero puedes que pruebes con el metodo PROCESS_ITEM de la clase ME_PROCESS_PO, para poder encontrar las BADI's no es tan complicado ... vas a la transaccion que quieres y ahi le das en Status->Info del Sistema y recuperas el nombre del programa y ahi le das doble click, cuando te encuentres en el programa activa la "visualizar lista de objetos" que es un boton que se encuentra en el menu y dentro de ese tree dale en el boton que dice Lista de Objetos Superior, ahi aparecera una carpeta con descripcion "Ampliaciones" y dentro de ella "Badis Clasicos" ahi hay una BADI que controla los items que se maqnejan para las solicitudes de pedido

Paola79
25/05/09, 21:37:12
Muchas gracias David, mañana o probare en el trabajo y te cuento...

luis999
25/05/09, 21:44:26
Hola Paola Primero debes estar segura del USER-EXIT a modificar, puedes usar este programa para dar con el nombre del user-exit: http://danielpanaro.wordpress.com/2007/11/06/zuser_exit-programa-que-lista-user-exits-de-una-transaccin/

Una vez que tienes identificado la user-exit vas a la tx. se37, le pones el nombre, ahi tendra un include, le das doble click y tendras un programa Z donde tendras que insertar la lógica que deseas que maneje tu tx. en la posición que creas conveniente. :)

Paola79
26/05/09, 14:38:51
Buenas tardes,

Ya tengo la BADI la cual me hace el chequeo es la ME_CCP_ACTIVE_CHECK, pero no se como implementarla en la ME51N y luego como meter el código, alguien me puede ayudar,

Muchas gracias,

Saludos

PD es la primera vez que implemento una cosa de estas

DavidXD_XD
28/05/09, 15:07:19
Hola Pao, pasame tu correo para alcanzarte un PDT que t puede servir, tbm hay un link que resume como implementarlo, aunq el PDT tiene imagenes q ayudaran aun mas

http://www.sapdev.co.uk/enhance/enhance_badi.htm

torrescano
28/05/09, 17:43:26
David, me puedes pasar el PDT q mencionas, mi correo es vladimir.torrescano@gmail.com

muchas gracias, saludos.

Paola79
29/05/09, 07:17:55
Buenos días David,

mi correo es pfslamadrid79@gmail.com, al final esa BADI no me vale, necesito algo que recorra mi tabla Z y que me compare el grupo de articulos con el grupo de compras y si no pertece ese grupo de compras a ese grupo de articulos que de un error.

Muchas gracias

Paola79
01/06/09, 09:33:51
Muchas gracias david, ya lo recibi pero la badi no hace lo que quiero yo...

Necesito solo meter un mensaje que diga que el grupo de compras no corresponde al grupo de articulos introducido, he mirado todo de arriba a bajo y no me vale nada y hay una user exit pero no me para en la ME51N...

Alguien me puede ayudar.

Saludos,

ballan
01/06/09, 09:47:51
Tienes que implementar la BADI ME_PROCESS_REQ_CUST

1.- Vas a la transaccion SE19 marcas el flag de badi clasico y metes el nombre ME_PROCESS_REQ_CUST

2.- Le das al boton implementar y le asignas un nombre a tu implementacion (por ejemplo ZME_PROCESS_REQ_CUST)

3.- Una vez que la hayas implementado dispones de los metodos PROCESS_HEADER y PROCESS_ITEM que se disparan cada vez que se produce un cambio en un campo de cabecera o posicion, tambien dispones del metodo check salta antes de la creacion y tambien cuando el usuario pulsa el boton de verificar

Paola79
01/06/09, 10:09:51
Muchas gracias,

Tengo que hacer la comprobación en una tabla z creada por mi y si no se corresponde darle el error, donde pudo encontrar los datos cargados por pantalla en esta BADI.

Saludos,

ballan
01/06/09, 11:32:19
Por ejemplo

El metodo process_header te da un parametro llamado IM_HEADER, tu podrias hacer lo siguiente

data: ls_header type MEREQ_HEADER.

ls_header = im_header->get_data( ).

*ahora en ls_header tendrias los datos de cabecera

En el metodo process_item seria lo mismo solo que te da el parametro IM_ITEM en lugar del IM_HEADER

data: ls_item type mereq_item.

ls_item = im_item->get_data( ).

*ahora en ls_item tendrias los datos de la posicion



En el metodo check tienes el objeto cabecera (IM_HEADER), tambien dispones del parametro CH_FAILED que lo puedes utilizar para que el pedido sea invalido

Por ejemplo

data: lt_items type MMPUR_REQUISITION_ITEMS.

data: ls_item like line of lt_items.

data: ls_pr_item type mereq_item.

*Con esto obtengo una tabla con todos los objetos posicion
lt_items = im_header->get_items( ).

loop at lt_items into ls_item.

*Ahora en ls_pr_item tendria los datos de posicion (algo parecido a los *campos de la eban)
ls_pr_item = ls_item->get_data( ).

if ls_pr_item-menge <= 0.

*Con esto introduciria el mensaje de error correspondiente en el colector
mmpur_message sy-msgty sy-msgid sy-msgno sy-msgv1 sy-msgv2
sy-msgv3 sy-msgv4.

ch_failed = mmpur_yes.
endloop.

Paola79
02/06/09, 09:53:06
BALLA muchisimas gracias ya lo tengo funcioando, una pregunta podría utlizar la misma badi para hacer una validación en la ME21N.

Un saludoa

ballan
02/06/09, 10:13:44
Para los pedidos dispones de la badi ME_PROCESS_PO_CUST en lugar de la ME_PROCESS_REQ_CUST que es para solicitudes de pedido

El funcionamiento es exactamente el mismo en las dos badis solo que evidentemente una te proporcionara informacion de la EBAN y la otra de la EKKO/EKPO

Paola79
02/06/09, 10:36:02
Gracias BALLAN tengo una duda el ls_items de que tipo lo creo¿?...

Saludos

ballan
02/06/09, 10:51:39
La cabecera seria de tipo MEPOHEADER y la posicion del tipo MEPOITEM

De todas formas para poder saber eso yo hago lo siguiente:

Haciendo un resumen muy superficial una BADI es una INTERFAZ que se puede ver a traves de la transaccion SE24 (si miramos la definicion de la badi a traves de la SE18 veremos que la badi ME_PROCESS_PO_CUST tiene definida la interfaz IF_EX_ME_PROCESS_PO_CUST)

Si miramos la IF_EX_ME_PROCESS_PO_CUST en la SE24 veremos todos los metodos de la badi, al ser una interfaz solo vienen las definiciones y los parametros de los metodos DENTRO NO TIENE CODIGO

Si nos vamos al metodo PROCESS_ITEM por ejemplo veremos que como parametro recibe el parametro IM_ITEM cuyo tipo es otra interfaz IF_PURCHASE_ORDER_ITEM_MM si vamos a ver esa interfaz por la SE24 veremos que en dicha interfaz existe un metodo llamado GET_DATA que si miramos los parametros veremos que devuelve una estructura del tipo MEPOITEM

Bueno no se si he aclarado algo o lo he liado mas pero espero que se me entienda

Paola79
02/06/09, 10:51:39
Le he puesto el BREAK para ver si me para donde quiero yo porque el chequeo que quiero es que si el importe es superior a 3.000 que de error...

Muchas gracias

Paola79
02/06/09, 10:54:23
Muchas gracias BALLAR, me ah quedado claro, porque yo y las badis no nos llevabamos hasta ahora pero el problema como te he expuesto anteriormente no me para el break donde quiero.

Un saludo

ballan
02/06/09, 11:16:16
A ver ni balla ni ballar es ballan :P

Si quieres chequear si el pedido tiene mas de 3000 euros y dar un mensaje

Implementa la badi que te he dicho y utiliza el metodo check, en este metodo se para cuando pulsas el boton verificar del pedido o bien cuando le das al boton de grabacion primero verifica y luego graba

El codigo seria algo por el estilo

data: lt_items type PURCHASE_ORDER_ITEMS.

data: lt_item like line of lt_items,
ls_po_item type mepoitem.

data: lv_importe type mepoitem-menge.

clear: lv_importe.

lt_items = im_header->get_items( ).

loop at lt_items into ls_item.

ls_po_item = ls_item->get_data( ).

add ls_po_item-menge to lv_importe.

endloop.

if lv_importe > 3000.

mmpur_message ... aqui iria el mensaje
ch_failed = 'X'.

endif.

Paola79
02/06/09, 11:21:52
No me para en ningun lado el break que puede ser he revisado que este todo activado y es correcto... Pero no para... Para ver cual es el dato del precio...



Me podrias dar una pistilla...

Muchas gracias y siento ser tan pesada...

Paola79
02/06/09, 11:27:38
Perdon por lo del nombre. Ya esta...

Un saludo ygraicas

Paola79
15/06/09, 14:47:15
Hola buenas tardes,

Ya me funciona la validación correctamente, desde hace ya días, el consultor ha echo pruebas, y le salta en el resto de tipo de pedidos, y solo queremos que salga en un determinado tipo de pedidos.

La validación la estoy haciendo en las items, ya que es ahi que el importe no sea superior a 3000, pero ahi no tengo la clase de pedido, que en mi caso será tipo de pedido SD, ya que se encuentra este dato en la cabecera (header).

Mi pregunta es: ¿Cómo puedo pasar el tipo de pedido en la BADI a las posiciones para que solo me salga en ese tipo de pedido?

Muchas gracias

torrescano
18/08/09, 13:14:53
buen dia Ballan.

vi tus post's, resulta q tengo q hacer una validacion en la ME51N en la solicitud de pedido con imputacion a un centro de costo.

implemente la bdai ME_PROCESS_REQ_CUST en el metodo CHECK,
tengo el siguiente codigo:

METHOD if_ex_me_process_req_cust~check.
break vandrade.
DATA: lt_items TYPE mmpur_requisition_items.
DATA: ls_item LIKE LINE OF lt_items.
DATA: ls_pr_item TYPE mereq_item.
DATA: ls_po_item TYPE mepoitem.

lt_items = im_header->get_items( ).

LOOP AT lt_items INTO ls_item.

ls_po_item = im_item->get_data( ).

IF ls_po_item-kostl NE '223'. "este es mi CeCo
*mensaje
ENDIF.
ENDLOOP.
ENDMETHOD.

bueno pues resulta q no puedo activar el metodo pues me dice el sigueinte error.

Clase ZCL_IM_ME_PROCESS_REQ_CUST,Método IF_EX_ME_PROCESS_REQ_CUST~CHECK
The field "IM_ITEM" is unknown, but there is a field with the similar
name "LS_ITEM" . . . .

si me pudieras orientar por favor, muchas gracias, saludos.

torrescano
21/08/09, 15:12:30
saludos foro. pos aki de nuevo, ya resolvi mi problema.

pues resulto q el metodo fue process_account.

aki le sdejo el codigo por si alguien le sirrviera.

METHOD if_ex_me_process_req_cust~process_account.

DATA: ls_item TYPE mepoitem,
ls_exkn TYPE exkn.
DATA: v_kostl TYPE kostl.

break vandrade.

ls_item = im_account->get_exknx( ).

ls_exkn = im_account->get_exkn( ).

CHECK NOT ls_exkn-kostl IS INITIAL.

* MOVE: ls_exkn-kostl TO v_kostl.

AUTHORITY-CHECK OBJECT 'Z_MM_CECO' "'K_CSKS'
ID 'ACTVT' FIELD '03'
ID 'KOSTL' FIELD ls_exkn-kostl.

IF sy-subrc NE 0.
MESSAGE 'Verificar Centro de Costo' TYPE 'E'.
ENDIF.


ENDMETHOD.