Anuncio

Colapsar
No hay anuncio todavía.

Bapi_goodsmvt_create

Colapsar
X
 
  • Filtrar
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes

  • Bapi_goodsmvt_create

    BAPI para realizar movimientos de materiales:

    Espero que les sirva este ejemplo.

    Código:
    FUNCION BAPI_GOODSMVT_CREATE
    
    REPORT Z_BAPI
    
    DATA: l_goodsmvt_header  LIKE  bapi2017_gm_head_01,
          l_goodsmvt_code    LIKE  bapi2017_gm_code,
          l_testrun          LIKE  bapi2017_gm_gen-testrun,
          l_goodsmvt_headret LIKE  bapi2017_gm_head_ret,
          l_materialdocument LIKE  bapi2017_gm_head_ret-mat_doc,
          l_matdocumentyear  LIKE  bapi2017_gm_head_ret-doc_year.
    
    DATA: i_goodsmvt_item    LIKE  bapi2017_gm_item_create OCCURS 10
                                   WITH HEADER LINE,
          i_return           LIKE  bapiret2 OCCURS 10 WITH HEADER LINE.
    
    
    START-OF-SELECTION.
    
    * DATOS CABECERA
      CLEAR l_goodsmvt_header.
      l_goodsmvt_header-pstng_date = sy-datum.
      l_goodsmvt_header-doc_date   = '20010122'.
      l_goodsmvt_header-pr_uname   = sy-uname.
      l_goodsmvt_header-header_txt = 'Ent. desde fábrica'.
      L_GOODSMVT_HEADER-REF_DOC_NO = '00/00'.
    
    * Tipo de movimiento
      l_goodsmvt_code = '01'. "Goods receipt for purchase order
    
    * Posiciones
      CLEAR i_goodsmvt_item.
      i_goodsmvt_item-material  = '01018950'.
      i_goodsmvt_item-plant     = '0310'.
      i_goodsmvt_item-stge_loc  = '0100'.
      i_goodsmvt_item-VENDOR    = '0000000017'.
      i_goodsmvt_item-move_type = '101'.
      i_goodsmvt_item-MVT_IND   = 'B'.   "Indicador de movimiento
      i_goodsmvt_item-PO_NUMBER = '5500000001'.
      i_goodsmvt_item-po_item   = '00020'.
      i_goodsmvt_item-ENTRY_QNT = '15.200'.
      I_GOODSMVT_ITEM-ENTRY_UOM = 'ST'.
      append i_goodsmvt_item.
    
    
      CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
           EXPORTING
                goodsmvt_header       = l_goodsmvt_header
                goodsmvt_code         = l_goodsmvt_code
                testrun               = ' '
           IMPORTING
                goodsmvt_headret      = l_goodsmvt_headret
                materialdocument      = l_materialdocument
                matdocumentyear       = l_matdocumentyear
           TABLES
                goodsmvt_item         = i_goodsmvt_item
    *         GOODSMVT_SERIALNUMBER =
                return                = i_return
                .
    
      IF SY-SUBRC = 0.
        describe table i_return lines sy-tfill.
        if sy-tfill = 0.
          COMMIT WORK.
        endif.
      ENDIF.

  • #2
    Hola Gonzalo, gracias por la BAPI pero te cuento que cuando utilizas la parte relacionada a los números de serie, el proceso se vuelve super lento, y más aún cuando tratas de recuperar el documento SAP relacionado con el movimiento de mercadería, porque hay que esperar que sea grabado en las respectivas tablas. Tengo un proceso que lanzo al amanecer de cada día y dura mucho procesa aproximadamente 500.000 números de serie por día. Tienes alguna sugerencia para evitar este problema?

    Comentario


    • #3
      Pero en que parte está recuperando el documento SAP ?

      pasame esa parte de código así te ayudo.

      Comentario


      • #4
        CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
        EXPORTING
        GOODSMVT_HEADER = GOODSMVT_HEADER
        GOODSMVT_CODE = GOODSMVT_CODE
        TESTRUN = ' '
        IMPORTING
        GOODSMVT_HEADRET = GOODSMVT_HEADRET
        MATERIALDOCUMENT = MATERIALDOCUMENT
        MATDOCUMENTYEAR = MATDOCUMENTYEAR
        TABLES
        GOODSMVT_ITEM = GOODSMVT_ITEM
        GOODSMVT_SERIALNUMBER = GOODSMVT_SERIALNUMBER
        RETURN = return.

        loop at return.
        write:/ return.
        endloop.

        write:/ GOODSMVT_HEADRET,
        MATERIALDOCUMENT,
        MATDOCUMENTYEAR.

        if return[] is initial.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        * EXPORTING
        * WAIT =
        * IMPORTING
        * RETURN =
        .

        endif.
        regbien = 0.
        * Verificando si no hay errores

        if MATERIALDOCUMENT <> ''.
        totbien = totbien + 1.
        saltot-estado = 'REGISTRO CORRECTO'.
        append saltot.
        sale-DOCUMENTO = MATERIALDOCUMENT.
        append sale.
        DO.
        *Verificando si el documento ha sido grabado en la mkpf
        select single * from mkpf where MBLNR = MATERIALDOCUMENT
        and mjahr = MATDOCUMENTYEAR.
        IF SY-SUBRC = 0.

        concatenate sale-transac '-' sale-SUBTRA '-' sale-CORREL
        into mkpf-bktxt.
        modify mkpf.
        EXIT.
        else.

        * si no ha sido grabado se hace una espera, aquí es donde trata el proceso.
        WAIT UP TO 12 SECONDS.
        ENDIF.
        ENDDO.

        else.
        move-corresponding sale to salerr.
        salerr-texto = return-MESSAGE.
        IF RETURN-ID ='IO' and return-number = '231'.
        perform vnumserie.



        else.
        append salerr.


        Saludos

        Comentario


        • #5
          Para que haces ese control de si está o no en la MKPF el documento?

          Es más factible hacer un BAPI_COMMIT.

          Saludos!

          Comentario


          • #6
            Hola incialmente hice un commit con la bapi respectiva,if return[] is initial.
            CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
            * EXPORTING
            * WAIT =
            * IMPORTING
            * RETURN =

            pero cuando ingresaba a la MKPF para poder modificarla grabando un dato en el campo mkpf-bktxt, no encontraba el documento SAP en forma inmediata. Esto lo probé antes de colocarle el control que incluye el wait. Entonces tuve que optar por colocar el código

            DO.
            *Verificando si el documento ha sido grabado en la mkpf
            select single * from mkpf where MBLNR = MATERIALDOCUMENT
            and mjahr = MATDOCUMENTYEAR.
            IF SY-SUBRC = 0.

            concatenate sale-transac '-' sale-SUBTRA '-' sale-CORREL
            into mkpf-bktxt.
            modify mkpf.
            EXIT.
            else.

            * si no ha sido grabado se hace una espera, aquí es donde trata el proceso.
            WAIT UP TO 12 SECONDS.
            ENDIF.
            ENDDO.

            Esta verificación debe repetirse varias veces, por eso tardo en continuar el proceso y el programa se vuelve lento.

            Para Gonzalo, recupero el número SAP en MATERIALDOCUMENT y lo uso para grabar en una tabla que me sirve para hacer el control del resultado, ya que el proceso lo lanzo al amanecer. El usuario final usa esa aplicación y puede utilizar el número SAP para poder verificar mediante la MIGO.

            Mi objetivo es bajar tiempos porque debo hacer una aplicación similar para traslados y salildas de materiales que también usan número de serie.

            Saludos.,


            PD. Les comento que contesté hace unas dos horas atrás pero no se porque razón mi respuesta no fue enviada.

            Comentario


            • #7
              Hola,

              para mi ese chequeo lo tenés que hacer una vez finalizada la carga sin necesitad de esperar esos 12 segundo por cada documento, porque va a llegar un momento que ese proceso va a durar días!

              Saludos!

              Comentario


              • #8
                Hola,

                Te comento que recibo un archivo plano que proviene de otro sistema y que debe ser contabilizado en SAP. Este se caracteriza por tener entradas de mercaderías para materiales de almacén con número de serie. Recibimos muchas veces grandes volúmenes de información que alcanzan al millón. Para evitar que el proceso se haga pesado dividimos los números de series en ingresos de 10.000 unidades como máximo. Cada 10.000 se hace entonces una cabecera, por lo que en un mismo archivo plano puedo tener más de una cabecera. Es por esta razón que no puedo esperar la grabación del documento en la MKPF, sin que deba usar los 12 segundos de espera.

                Esa es la razón por la cual se ha puesto este control para poder recuperar el documento de la MKPF y luego realizar las modificaciones correspondientes.

                Salu2,

                Comentario


                • #9
                  Probaste con poner una 'X' en el wait del bapi_commit?

                  y otra cosa para que usas después ese document de la MKPF ?

                  Saludos!

                  Comentario


                  • #10
                    Probaré colocando la X en la Bapi COMMIT. El dato grabado en la mkpf, nos sirve para realizar controles con el otro sistema de origen, porque el dato grabado es el código de entrada en el otro sistema.

                    Comentario


                    • #11
                      Vi que había mucha discusión y me metí, jaja.

                      Pero ese chequeo te conviene realizarlo una vez que fue todo procesado y te va a ahorrar muchísimo tiempo!

                      Saludos!
                      Editado por última vez por Josemir; 06/06/2008, 19:25:25.

                      Comentario


                      • #12
                        Hola Josemir, probaré y les comentaré como me va

                        Saludos

                        Comentario


                        • #13
                          Hola a todos, les comento que adicioné el parámetro wait dentro de la bapi commit. y mis tiempos de proceso mejoraron mucho.

                          Gracias Koken, gracias también Josemir, todo selió muy bien.

                          Gracias por todo, salu2

                          Comentario


                          • #14
                            Excelente !! me alegro de haber colaborado!

                            Comentario

                            Trabajando...
                            X