0

我正在使用以下代码调用 BAPI BAPI_SALESORDER_CREATEFROMDAT2 来创建销售订单。SAP 机器正在生成一个 SO 编号并作为响应发送,但是当我使用 va03 检查我收到的销售订单的 SO 编号时,没有创建。如果我手动使用具有相同数据的 va01,我可以成功创建销售订单。请在这方面需要帮助。

public static void createSalesOrder() {
    try {
        JCoDestination destination = JCoDestinationManager.getDestination("ABAP_AS_WITH_POOL");
        JCoFunction functionCreateOrder = destination.getRepository().getFunction("BAPI_SALESORDER_CREATEFROMDAT2");
        //this is the bapi 
        JCoFunction functionTransComit = destination.getRepository().getFunction("BAPI_TRANSACTION_COMMIT");

        JCoStructure orderHeaderIn = functionCreateOrder.getImportParameterList().getStructure("ORDER_HEADER_IN");
        orderHeaderIn.setValue("SALES_ORG", "2000");//sales organisation
        orderHeaderIn.setValue("DISTR_CHAN", "20");//distribution channel
        orderHeaderIn.setValue("DIVISION", "20");// sales division 
        orderHeaderIn.setValue("DOC_TYPE", "ZAR");// document type 
        orderHeaderIn.setValue("PURCH_NO_C", "TEST123");


        JCoTable orderPartners = functionCreateOrder.getTableParameterList().getTable("ORDER_PARTNERS");
        // WE,AG,SP,PH
        // AG Sold to Party
        // WE Ship to Partyx
        orderPartners.appendRow();
        orderPartners.setValue("PARTN_ROLE", "AG");//partner role ag is sold to party 
        orderPartners.setValue("PARTN_NUMB", "0000000035");// partner number 
        orderPartners.appendRow();
        orderPartners.setValue("PARTN_ROLE", "WE");//we is ship tp party 
        orderPartners.setValue("PARTN_NUMB", "0000000035");// partner number 
        System.out.println(orderPartners);

        JCoTable orderItemsIn = functionCreateOrder.getTableParameterList().getTable("ORDER_ITEMS_IN");
        orderItemsIn.appendRow();
        orderItemsIn.setValue("MATERIAL", "PEN_ARN");// material 
        System.out.println(orderItemsIn);

        JCoTable orderSchedulesIn = functionCreateOrder.getTableParameterList().getTable("ORDER_SCHEDULES_IN");
        orderSchedulesIn.appendRow();
        orderSchedulesIn.setValue("REQ_QTY", "10");// required quantity 
        System.out.println(orderSchedulesIn);

        functionCreateOrder.execute(destination);


        // System.out.println(functionCreateOrder);
        JCoTable returnTable = functionCreateOrder.getTableParameterList().getTable("RETURN");
        System.out.println(returnTable);
        System.out.println(returnTable.getString("MESSAGE"));
        System.out.println("sales order number is : "
                + functionCreateOrder.getExportParameterList().getValue("SALESDOCUMENT"));
        functionTransComit.execute(destination);

    } catch (JCoException ex) {
        System.out.println(ex.getMessage());
    } finally {
        System.out.println("Creating sales order ends");
    }

}
4

1 回答 1

1

这取决于您的 JCo 版本,但至少在JCo 3中,您需要BAPI_TRANSACTION_COMMIT在与函数调用相同的上下文中执行对BAPI_SALESORDER_CREATEFROMDAT2. 目前这两个调用都是在单独的上下文中执行的,所以第二个调用BAPI_TRANSACTION_COMMIT并没有真正提交任何东西。您必须首先创建一个上下文:

JCoContext.begin(destination);

// execute both function calls to 
// BAPI_SALESORDER_CREATEFROMDAT2 and
// BAPI_TRANSACTION_COMMIT

JCoContext.end(destination);
于 2015-08-26T14:13:21.387 回答