Sap ofrece muchas alternativas para la emulacion de sus procesos graficos mediante programacion para permitir la carga en masa de datos. Un ejemplo de este es la BAPI para creacion de pedidos BAPI_PO_CREATE1, que bien se puede usar para generar pedidos en base a un fichero previamente cargado.

FUNCTION BAPI_PO_CREATE1. 
EXPORTING
 VALUE(POHEADER) LIKE BAPIMEPOHEADER STRUCTURE BAPIMEPOHEADER
 VALUE(POHEADERX) LIKE BAPIMEPOHEADERX STRUCTURE
 BAPIMEPOHEADERX OPTIONAL
 VALUE(POADDRVENDOR) LIKE BAPIMEPOADDRVENDOR STRUCTURE
 BAPIMEPOADDRVENDOR OPTIONAL
 VALUE(TESTRUN) LIKE BAPIFLAG-BAPIFLAG OPTIONAL
 VALUE(MEMORY_UNCOMPLETE) LIKE BAPIFLAG-BAPIFLAG OPTIONAL
 VALUE(MEMORY_COMPLETE) LIKE BAPIFLAG-BAPIFLAG OPTIONAL
 VALUE(POEXPIMPHEADER) LIKE BAPIEIKP STRUCTURE BAPIEIKP
 OPTIONAL
 VALUE(POEXPIMPHEADERX) LIKE BAPIEIKPX STRUCTURE BAPIEIKPX
 OPTIONAL
 VALUE(VERSIONS) LIKE BAPIMEDCM STRUCTURE BAPIMEDCM OPTIONAL
 VALUE(NO_MESSAGING) LIKE BAPIFLAG-BAPIFLAG OPTIONAL
 VALUE(NO_MESSAGE_REQ) LIKE BAPIFLAG-BAPIFLAG OPTIONAL
 VALUE(NO_AUTHORITY) LIKE BAPIFLAG-BAPIFLAG OPTIONAL
 VALUE(NO_PRICE_FROM_PO) LIKE BAPIFLAG-BAPIFLAG OPTIONAL
IMPORTING
 VALUE(EXPPURCHASEORDER) LIKE BAPIMEPOHEADER-PO_NUMBER
 VALUE(EXPHEADER) LIKE BAPIMEPOHEADER STRUCTURE BAPIMEPOHEADER
 VALUE(EXPPOEXPIMPHEADER) LIKE BAPIEIKP STRUCTURE BAPIEIKP
 TABLES
 RETURN STRUCTURE BAPIRET2 OPTIONAL
 POITEM STRUCTURE BAPIMEPOITEM OPTIONAL
 POITEMX STRUCTURE BAPIMEPOITEMX OPTIONAL
 POADDRDELIVERY STRUCTURE BAPIMEPOADDRDELIVERY OPTIONAL
 POSCHEDULE STRUCTURE BAPIMEPOSCHEDULE OPTIONAL
 POSCHEDULEX STRUCTURE BAPIMEPOSCHEDULX OPTIONAL
 POACCOUNT STRUCTURE BAPIMEPOACCOUNT OPTIONAL
 POACCOUNTPROFITSEGMENT STRUCTURE BAPIMEPOACCOUNTPROFITSEGMENT
 OPTIONAL
 POACCOUNTX STRUCTURE BAPIMEPOACCOUNTX OPTIONAL
 POCONDHEADER STRUCTURE BAPIMEPOCONDHEADER OPTIONAL
 POCONDHEADERX STRUCTURE BAPIMEPOCONDHEADERX OPTIONAL
 POCOND STRUCTURE BAPIMEPOCOND OPTIONAL
 POCONDX STRUCTURE BAPIMEPOCONDX OPTIONAL
 POLIMITS STRUCTURE BAPIESUHC OPTIONAL
 POCONTRACTLIMITS STRUCTURE BAPIESUCC OPTIONAL
 POSERVICES STRUCTURE BAPIESLLC OPTIONAL
 POSRVACCESSVALUES STRUCTURE BAPIESKLC OPTIONAL
 POSERVICESTEXT STRUCTURE BAPIESLLTX OPTIONAL
 EXTENSIONIN STRUCTURE BAPIPAREX OPTIONAL
 EXTENSIONOUT STRUCTURE BAPIPAREX OPTIONAL
 POEXPIMPITEM STRUCTURE BAPIEIPO OPTIONAL
 POEXPIMPITEMX STRUCTURE BAPIEIPOX OPTIONAL
 POTEXTHEADER STRUCTURE BAPIMEPOTEXTHEADER OPTIONAL
 POTEXTITEM STRUCTURE BAPIMEPOTEXT OPTIONAL
 ALLVERSIONS STRUCTURE BAPIMEDCM_ALLVERSIONS OPTIONAL
 POPARTNER STRUCTURE BAPIEKKOP OPTIONAL
 POCOMPONENTS STRUCTURE BAPIMEPOCOMPONENT OPTIONAL
 POCOMPONENTSX STRUCTURE BAPIMEPOCOMPONENTX OPTIONAL
 POSHIPPING STRUCTURE BAPIITEMSHIP OPTIONAL
 POSHIPPINGX STRUCTURE BAPIITEMSHIPX OPTIONAL
 POSHIPPINGEXP STRUCTURE BAPIMEPOSHIPPEXP OPTIONAL

Desgraciadamente esta BAPI carece de una extensa documentación sobre su uso, y no solo la cantidad de parámetros hacen complicado su uso si no también la interrelación entre sus parámetros lo que lo hace realmente compleja de usar de una manera exitosa.

Para la creacion de un pedido de servicios sencillo bien puede valer este ejemplo:

      CALL FUNCTION 'BAPI_PO_CREATE1'
        EXPORTING
          POHEADER          = BAPIMEPOHEADER
          POHEADERX         = BAPIMEPOHEADERX
        IMPORTING
          EXPPURCHASEORDER  = PURCHASEORDER
        TABLES
          POTEXTHEADER      = BAPIMEPOTEXTHEADER
          RETURN            = RETURN
          POITEM            = BAPIMEPOITEM
          POITEMX           = BAPIMEPOITEMX
          POACCOUNT         = BAPIMEPOACCOUNT
          POACCOUNTX        = BAPIMEPOACCOUNTX
          POSERVICES        = BAPIESLLC
          POSRVACCESSVALUES = BAPIESKLC.

La llamada a esta funcion crearia un pedido con lineas de material y servicios asociados junto con la informacion contable.

Ahora para poder generar el pedido es necesario tener en cuenta que las tablas van relacionadas entre si, ya que en la misma llamada pueden crearse multiples lineas de material y servicios.

Para poder relacionar el numero de linea de pedido junto con sus datos de contabilizacion es sencillo, solo hay que vincular el valor PO_ITEM.

 NO_PED = NO_PED + 10.
 BAPIMEPOITEM-PO_ITEM = NO_PED.
 BAPIMEPOITEMX-PO_ITEM = NO_PED.
 PKG = PKG + 10.
 BAPIMEPOITEM-PCKG_NO = PKG.
 BAPIMEPOACCOUNT-PO_ITEM = NO_PED.
 BAPIMEPOACCOUNTX-PO_ITEM = NO_PED.

Por otro lado, para relacionar el numero de servicio con el pedido habría que usar el valor PCKG_NO.

    NO_SER = NO_SER + 10.
    BAPIESLLC-PCKG_NO = PKG + 1.
    BAPIESKLC-PCKG_NO = PKG + 1.
    BAPIESLLC-LINE_NO = NO_SER.
    BAPIESLLC-EXT_LINE = NO_SER.
    BAPIESKLC-LINE_NO = NO_SER .
    BAPIESKLC-SERNO_LINE = '01'.
    BAPIESKLC-PERCENTAGE = 100.
    BAPIESKLC-QUANTITY = BAPIESLLC-QUANTITY.

Algo importante a tener en cuenta es que hay que generar siempre un servicio de cabecera que es el que incluira todos los servicios que luego metemos en la pestaña correspondiente. Este podria ser un ejemplo de creacion de ese registro.

 

BAPIESLLC-PCKG_NO = PKG.
BAPIESLLC-SUBPCKG_NO = PKG + 1.
BAPIESLLC-OUTL_IND  = 'X'.

Y con eso ya podríamos generar un pedido rellenando el resto de los datos de las tablas con la información que necesitemos.