PDA

Ver la Versión Completa : Commit Work en User Exit


c_quintero
12/11/07, 22:47:30
buenas tardes a todos

tengo un problema existencial

este es el problema , tengo una user exit para la creacion y modificacion de materiales , ahora , esa user exit por si sola no me trae los valores que ocupo para la clasificacion del material que se este creando , entonces opte por poner un commit work al entrar al exit de esa forma puedo llamar a unas funciones estardar que me trae todos los valores de las caracteristicas y de la clase del material pero he leido en muchos foros que nunca se deben poner commits en los user exit , por cuestiones de performance y no se que otras cosas

pero mi duda es , acaso importa en realidad? , es decir , el user exit que estoy usando se activa cuando le doy GRABAR , entonces , que no daria lo mismo ? , lo unico que hago es adelantar el commit , o acaso se hacen muchas otras cosas despues de llamar al user exit?

espero me puedan resolver mi duda
de antemano gracias

ballan
13/11/07, 07:50:55
Seguramente a esto habra tantas respuestas como personas pero al poner un commit en una user te arriesgas a perder la modificaciones que se hagan posteriormente, por eso intentaria ponerlo en la user mas cercana a la grabacion fisica del documento, por otra parte debes considerar la posibilidad de que un commit colocado en un sitio erroneo puede provocar dump como por ejemplo si pones un commit dentro de un bucle select endselect (u otras operaciones que impliquen el uso de cursores)

En principio si te funciona no hay problema pero piensa que para grabar los datos en tablas de diccionario previamente tienen que estar almacenados en tablas internas asi que seguramente hay alguna tabla interna que tiene los datos que tu buscas

Ignatius
13/11/07, 13:21:19
c_quintero,

El problema con los COMMIT dentro de un user exit es, como te dice ballan, que podés llegar a perder información en el momento de actualizar ya que estás modificando el orden estándar.
Yo te diría que evites a toda costa poner un COMMIT, porque quizás quede algo mal en la actualización y no te des cuenta.
Por qué estás haciendo el commit? Necesitás algún valor que todavía no está creado?
Podés probar crear una función Z y llamarla IN UPDATE TASK... a veces esto sirve para hacer una grabación y obtener algún valor que en el momento en que se ejecuta el exit no está disponible.
Otra opción que tenés es utilizar memoria ABAP y usar 2 exits en lugar de uno (y que uno le pase la información que necesites a otro).

Avisanos si sirvió!

Saludos

c_quintero
13/11/07, 15:33:05
buenos dias

gracias por sus respuestas ya me quedo mas claro

Ignatius , como que una funcion Z y llamarla IN UPDATE TASK? podrias darme un ejemplo de como se hace y como funciona? eso podria ayudarme mucho mas

y pues los datos que ocupo son los de clasificacion de un material en las tx mm01 o mm02

normalmente esos datos los triago con una serie de funciones las cuales son estas:

CALL FUNCTION 'CLMA_CLASS_READ'
CALL FUNCTION 'CLAF_CLASSIFICATION_OF_OBJECTS'
CALL FUNCTION 'CLME_FEATURES_OF_CLASS'
CALL FUNCTION 'CLA2_GET_ALL_ALLOCATIONS'

pero obviamente no puedo usar esas funciones en la user exit porque el material aun no esta grabado, por eso queria usar el commit al momento de entrar en la user exit la cual , repito , se activa cuando le doy SAVE a la tx , y por mas que debugueo no encuentro la tabla interna donde guarda esos valores

igual y si se han topado con algo como esto y lograron solucionarlo porfavor diganme

saludos

Ignatius
13/11/07, 17:41:33
c_quintero,

Lo que te digo de llamar a una función IN UPDATE TASK es lo siguiente:

Creás un módulo de funciones Z con el código que pusiste en el User Exit, y en el Exit lo que hacés es llamar a la función así:

CALL FUNCTION 'tu_funcion' IN UPDATE TASK...

Eso lo que hace es poner la llamada en la cola de actualización. Cuando se ejecuta el COMMIT se va a ejecutar esta función que llamaste.

En las funciones que llamás, tenés que poner el número de material?

Me podés decir el User Exit que estás usando para poder ubicarme un poco mejor en lo que necesitás?

Saludos

c_quintero
13/11/07, 20:11:57
esta es la user exit que uso

MGA00001
EXIT_SAPLMGMU_001

y si , en esas funciones ocupo el numero del material , de hecho es lo unico que ocupo se van llenando los campos necesarios unas a otras

pero ya con lo que me dices me di una buena idea de como hacerlo

de todas formas te paso el codigo de las funciones por si acaso

esto es lo que haria normalmente si corriera algun programa Z una vez guardados los datos

* Busco las categorías de clase para cada material.
SELECT * FROM KSSK
INTO CORRESPONDING FIELDS OF TABLE TI_KLART
WHERE OBJEK = wmara-MATNR AND
MAFID = 'O'.

LOOP AT TI_KLART.
CLEAR WA_CLASS.
* Busco el nombre de la clase actual.
CALL FUNCTION 'CLMA_CLASS_READ'
EXPORTING
CLASSNUMBER = TI_KLART-CLINT
LANGUAGE = SY-LANGU
IMPORTING
CLASSNAME = WA_CLASS-CLASS
CLASSTYPE = WA_CLASS-KLART
DESCRIPTION = WA_CLASS-KSCHL
LANGUAGE = WA_CLASS-SPRAS
EXCEPTIONS
CLASS_NOT_FOUND = 1
OTHERS = 2.



* Busco las caracteríticas de la clase actual. Necesito esta funcion
* para las caracteristicas que tengan valor numerico.
OBJEK = TI_MAT-MATNR.
CALL FUNCTION 'CLAF_CLASSIFICATION_OF_OBJECTS'
EXPORTING
CLASS = WA_CLASS-CLASS
CLASSTEXT = 'X'
CLASSTYPE = TI_KLART-KLART
CLINT = TI_KLART-CLINT
FEATURES = 'X'
LANGUAGE = SY-LANGU
OBJECT = OBJEK
OBJECTTABLE = 'MARA'
KEY_DATE = SY-DATUM
INITIAL_CHARACT = 'X'
* NO_VALUE_DESCRIPT =
CHANGE_SERVICE_CLF = 'X'
* INHERITED_CHAR = ' '
TABLES
T_CLASS = TI_CLASS
T_OBJECTDATA = TI_CARACT
EXCEPTIONS
NO_CLASSIFICATION = 1
NO_CLASSTYPES = 2
INVALID_CLASS_TYPE = 3
OTHERS = 4.

*Busco las caracteristicas. Esta funcion es para obtener el n° de cada
*caracteristica ATINN e indexar la tabla TI_VALUES, para obtener los
*valores no numericos.
CALL FUNCTION 'CLME_FEATURES_OF_CLASS'
EXPORTING
CLASS = WA_CLASS-CLASS
CLASSTYPE = TI_KLART-KLART
LANGUAGE = SY-LANGU
KEY_DATE = SY-DATUM
* CHANGE_NUMBER = ' '
TABLES
TFEATURES = ti_features
* EXCEPTIONS
* CLASS_NOT_FOUND = 1
* NO_AUTHORITY = 2
* OTHERS = 3
.
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

* Busco todas las características y valores para la categoría de clase.
CALL FUNCTION 'CLA2_GET_ALL_ALLOCATIONS'
EXPORTING
OBJECT = objek
CLASS_TYPE = WA_CLASS-KLART
ALLOC_ID = 'O'
TABLE = 'MARA'
KEY_DATE = SY-DATUM
TABLES
VALUES = TI_VALUES
* allocations =
EXCEPTIONS
INVALID_CLASS_TYPE = 1
INVALID_OBJECT = 2
OTHERS = 3.

CLEAR: TI_ARCH.
IF TI_FEATURES[] IS INITIAL.
MOVE: TI_MAT-MATNR TO TI_ARCH-MATNR,
TI_KLART-KLART TO TI_ARCH-KLART,
WA_CLASS-CLASS TO TI_ARCH-CLASS.
APPEND TI_ARCH.
ELSE.
LOOP AT TI_FEATURES.
READ TABLE TI_VALUES WITH KEY ATINN = TI_FEATURES-ATINN.
READ TABLE TI_CARACT with key ATNAM = TI_FEATURES-ATNAM.

MOVE: TI_MAT-MATNR TO TI_ARCH-MATNR,
TI_KLART-KLART TO TI_ARCH-KLART,
WA_CLASS-CLASS TO TI_ARCH-CLASS,
TI_FEATURES-ATNAM TO TI_ARCH-ATNAM,
* TI_VALUES-ATFLV TO TI_ARCH-ATFLV,
TI_VALUES-ATWRT TO TI_ARCH-ATWRT,
ti_caract-ausp1 to ti_arch-ausp1.


APPEND TI_ARCH.
ENDLOOP."ti_caract
ENDIF.


* Busco el nombre de la característica actual.
* clear: ti_atnam. refresh: ti_atnam.
* call function 'CLME_FEATURES_OF_CLASS'
* exporting
* class = wa_class-class
* classtype = wa_class-klart
* language = sy-langu
* key_date = sy-datum
* tables
* tfeatures = ti_atnam
* exceptions
* class_not_found = 1
* no_authority = 2
* others = 3.





ENDLOOP." ti_klart


cualquier otra cosa es bien recibida

Sonia
20/02/08, 23:12:44
Buenas tardes,
me gustaria saber como solucionaste tu problema.
Pues tengo un desarrollo en el cual debo validar algunas caracteristicas de material y en ese momento de la user exit no tengo los valores en ninguna tabla.

Saludos.

TUESDAY
23/03/09, 15:00:15
Hola,
Para obtener los valores de las caracteristicas de un material yo uso la user EXIT_SAPLCTMS_002, de aqui saco los valores, los mando a memoria y luego los leo en mi user.
Espero que os sirva.