Commit Work en User Exit

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • c_quintero
    Junior Member
    • ago
    • 12

    #1

    Commit Work en User Exit

    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
    Senior Member
    • oct
    • 671

    #2
    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

    Comentario

    • Ignatius
      Junior Member
      • nov
      • 15

      #3
      Commit en User Exit

      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

      Comentario

      • c_quintero
        Junior Member
        • ago
        • 12

        #4
        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

        Comentario

        • Ignatius
          Junior Member
          • nov
          • 15

          #5
          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

          Comentario

          • c_quintero
            Junior Member
            • ago
            • 12

            #6
            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

            Comentario

            • Sonia
              Junior Member
              • oct
              • 3

              #7
              Help

              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.

              Comentario

              • TUESDAY
                Member
                • may
                • 32

                #8
                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.

                Comentario

                Trabajando...