BADI para insertar items en ME51N

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • tgfch
    Member
    • mar
    • 74

    #1

    BADI para insertar items en ME51N

    Hola,

    Tengo un requerimiento y he estado tratando varias BADI's :
    ME_BAPI_PR_CUST
    ME_BAPI_PR_CUST
    ME_CHECK_ALL_ITEMS

    Pero con ninguna he podido lograr insertar items al crear la Solicitud de pedido, con la que he podido llegar al momento de la verificación es ME_PROCESS_REQ_CUST con el método PROCESS_ITEM, pero se queda en este método.

    El código que tengo es:
    Código:
    DATA: ls_mereq_itemx TYPE mereq_itemx,
                ls_mereq_item  TYPE mereq_item.
     
    *  ls_mereq_item  = im_item->get_data( ).
     
      ls_mereq_item-MATNR = 'M955_RG'.
     
    CALL METHOD im_item->set_data
    EXPORTING
    im_data = ls_mereq_item.
    Agradeceria cualquier información y ayuda.
    Saludos,
    tgfch
  • ballan
    Senior Member
    • oct
    • 671

    #2
    Para agregar una posicion tendrias que hacer algo mas o menos asi

    Necesitas el objeto cabecera IM_HEADER type ref to IF_PURCHASE_REQUISITION

    Si tienes el objeto posicion puedes llamar al metodo get_requisition( ) para que te devuelva la cabecera

    data: lo_header type ref to IF_PURCHASE_REQUISITION

    lo_header = im_item->get_requisition( ).

    una vez que tengas el objeto cabecera vamos a suponer que se llama IM_HEADER

    data: lo_item type ref to IF_PURCHASE_REQUISITION_ITEM

    data: ls_item type MEREQ_ITEM.

    lo_item = im_header->create_item( ).

    ls_item-matnr = material.
    ls_item-menge = cantidad.

    lo_item->set_data( ls_item).

    Comentario

    • tgfch
      Member
      • mar
      • 74

      #3
      Ballan gracias por responder.
      Hago las pruebas y te aviso!!!
      Saludos,
      tgfch

      Comentario

      • tgfch
        Member
        • mar
        • 74

        #4
        ballan

        He estado intentando tomar los datos del IM_HEADER para traermelos al metodo pero no he podido, trato de hacerlo con el EXPORT TO MEMORY pero no me deja :'(.
        Saludos,
        tgfch

        Comentario

        • ballan
          Senior Member
          • oct
          • 671

          #5
          Los objetos creados en tiempo de ejecucion residen en una zona de memoria que no se puede compartir (al menos hasta donde yo se)

          Para obtener el objeto cabecera tendras que llamar a los metodos correspondientes

          En que metodo o donde estas haciendo las llamadas¿?

          Comentario

          • tgfch
            Member
            • mar
            • 74

            #6
            ayy Balan gracias por responder.

            Fijate, estoy en la SE19 con ME_PROCESS_REQ_CUS, justo en el método PROCESS_ITEM, pero creo que lo que estaba tratando de hacer de capturar los datos no era posible, y asi como tu dice, debo utilizar los métodos que me permita la implementación.

            Con el ejemplo de las líneas de código que me distes, logré algo, lo que no termino es de como hacer para crear los datos de una nueva linea, me arroja un dump " OBJECTS_OBJREF_NOT_ASSIGNED_NO" justo aca lo_item->set_data( ls_item ).

            No se si este usando mal los método y estoy ( al crear el objeto y al colocarle los datos ( digo en el set_data) )
            Editado por última vez por tgfch; 08/06/2009, 13:10:07.
            Saludos,
            tgfch

            Comentario

            • ballan
              Senior Member
              • oct
              • 671

              #7
              Te paso un ejemplo de como hacer que cuando modifiques un campo de una posicion de solped te cree una posicion nueva como copia

              El codigo tendrias que ponerlo en el metodo process_item y tendras que meterlo dentro de alguna condicion porque sino va a entrar en un bucle infinito ya que al modificar una posicion creara otra como copia, al crear otra como copia volvera a saltar el process_item y se volvera a crear otra como copia...

              La idea es que veas como hacerlo

              En el metodo process_item podrias hacer esto

              DATA: lo_header TYPE REF TO if_purchase_requisition,
              lo_item TYPE REF TO if_purchase_requisition_item.

              data: ls_item type mereq_item,
              ls_itemx type mereq_itemx.


              *Aqui obtengo el objeto cabecera de la solicitud de pedido
              lo_header = im_item->get_requisition( ).

              *Aqui creo una nueva posicion como copia de otra existente
              lo_item = lo_header->create_item( im_item = im_item ).

              *Si quisiera crearla en blanco
              lo_item = lo_header->create_item( ).

              ls_item = lo_item->get_data( ).
              ls_itemx = lo_item->get_datax( ).

              ls_item-menge = 69.
              ls_itemx-menge = 'X'.

              lo_item->set_data( im_data = ls_item ).
              lo_item->set_datax( im_datax = ls_itemx ).

              Comentario

              • tgfch
                Member
                • mar
                • 74

                #8
                Ballan, mil gracias

                Y te envio mis disculpas, he estado trabajando con el código, pero tal como tu dices, he tratado de colocar condiciones para que se regrese a la transacción y no me funciona.

                Estas líneas las tengo comentadas:
                Código:
                *Si quisiera crearla en blanco
                lo_item = lo_header->create_item( ).
                esto debe ser así.
                Saludos,
                tgfch

                Comentario

                • ballan
                  Senior Member
                  • oct
                  • 671

                  #9
                  Por ejemplo para salir lo que podrias hacer es:

                  data: lv_salir.

                  data: lc_id type char20 value 'IDMEMORIA'.

                  *Supongamos que estamos en el process_item

                  import p1 = lv_salir from memory id lc_id

                  if not lv_salir is initial.

                  exit.

                  else.

                  *aqui iria el codigo para crear la nueva posicion mediante metodos

                  lv_salir = 'X'.
                  export p1 = lv_salir to memory id lc_id.

                  endif.

                  Comentario

                  • tgfch
                    Member
                    • mar
                    • 74

                    #10
                    ballan MUCHISIMAS GRACIAS por tu gran ayuda, con las líneas de código pude realizar lo que necesitaba, aca las coloco:


                    Código:
                    *------------------------------------------------------------------------
                      DATA:  ti_kit   TYPE  STANDARD TABLE OF ZFI_KIT_INVNOVAL,
                             wa_kit   LIKE  LINE OF ti_kit.
                    
                      DATA:
                            lo_header TYPE REF TO if_purchase_requisition,
                            lo_item   TYPE REF TO if_purchase_requisition_item.
                    
                      data:
                            ls_item   type mereq_item,
                            ls_itemx  type mereq_itemx.
                    
                      DATA: counter   TYPE N.
                      DATA: totreg    TYPE N.
                    
                    *------------------------------------------------------------------------
                    
                    * Se obtienen variables de memoria
                      IMPORT totreg TO totreg FROM MEMORY ID 'TR'.                " Cantidad de registros de la tabla interna con los registros del kit
                      IMPORT counter TO counter FROM MEMORY ID 'CT'.              " Contador para las posiciones a crear
                    
                    * Validación para concluir el kit
                      IF totreg <> 0 and counter <> 0.
                        IF counter = totreg.
                            FREE MEMORY ID 'TR'.
                            FREE MEMORY ID 'CT'.
                            EXIT.
                        ENDIF.
                      ENDIF.
                    
                    * Se obtiene información del item
                      ls_item = im_item->get_data( ).
                    
                    * Se obtienen unicamente los materiales para el kit
                      SELECT *
                             FROM ZFI_KIT_INVNOVAL                        "#EC CI_SGLSELECT
                             INTO TABLE ti_kit
                             WHERE MATNR_A = ls_item-MATNR.
                    
                    * Total de registro para generar el kit
                      DESCRIBE TABLE ti_kit LINES totreg.
                    
                    * Se envia a memory la cantidad de registros obtenidos para generar el kit
                      EXPORT totreg FROM totreg TO MEMORY ID 'TR'.
                    
                      IF ls_item-afnam EQ 'GB'.
                    
                        LOOP AT ti_kit INTO wa_kit.
                    
                    * Se obtiene el objeto cabecera de la solicitud de pedido
                          lo_header = im_item->get_requisition( ).
                    
                    * Se crea una nueva posicion como copia de otra existente
                          lo_item = lo_header->create_item( im_item = im_item ).
                    
                    * Se obtiene info del objeto
                          ls_item = lo_item->get_data( ).
                          ls_itemx = lo_item->get_datax( ).
                    
                    * Se llenan el/los item(s) nuevos
                    
                          ls_item-matnr = wa_kit-matnr_b.
                    
                          if ls_item-menge = '0'.
                            ls_item-menge = wa_kit-menge.
                          endif.
                    
                          ls_itemx-matnr = 'X'.
                          ls_itemx-menge = 'X'.
                    
                          lo_item->set_data( im_data = ls_item ).
                          lo_item->set_datax( im_datax = ls_itemx ).
                    
                          counter = counter + 1.
                          EXPORT counter FROM counter TO MEMORY ID 'CT'.
                    
                        ENDLOOP.
                    
                      ENDIF.
                    Espero que sea de ayuda.
                    Saludos,
                    tgfch

                    Comentario

                    Trabajando...