SAP .NET Connector 3.0:销售订单更改

时间:2014-11-01 11:47:12

标签: c# sap sap-connector saprfc

我使用SAP .NET Connector 3.0构建RFC客户端,让用户以最简单的方式与SAP通信。
在这里,我想提供一些简短的样本,说明阻止我继续发展的原因。 目前我的目的是更改现有销售订单。 BAPI_SALESORDER_CHANGE是我用来改变SO标题和项目数据的FM。我有12件商品的销售订单(从000010到0000120)。情景B和C对我不起作用。

情景A:客户采购订单更改
结果:PO号码已成功更改。没有问题。

public DataTable BAPI_SALESORDER_CHANGE(RfcDestination destination)
    {
        RfcRepository repo = destination.Repository;
        IRfcFunction salesDoc = repo.CreateFunction("BAPI_SALESORDER_CHANGE");
        IRfcFunction salesDocCommit = repo.CreateFunction("BAPI_TRANSACTION_COMMIT");
        salesDoc.SetValue("SALESDOCUMENT", "3939393837");

        IRfcStructure salesHeader = salesDoc.GetStructure("ORDER_HEADER_IN");
        salesHeader.SetValue("PURCH_NO_C", "Order_01");
        IRfcStructure salesHeaderINX = salesDoc.GetStructure("ORDER_HEADER_INX");
        salesHeaderINX.SetValue("UPDATEFLAG", "U");
        salesHeaderINX.SetValue("PURCH_NO_C", "X");

        RfcSessionManager.BeginContext(destination);
        salesDoc.Invoke(destination);
        salesDocCommit.Invoke(destination);
        RfcSessionManager.EndContext(destination);

        IRfcTable returnTable = salesDoc.GetTable("RETURN");

        return ConvertToDataTable(returnTable);        
    }

场景B:项目目标数量变更
结果:我收到了一条消息:销售订单已保存。但数量没有改变。这有什么不对?

public DataTable BAPI_SALESORDER_CHANGE(RfcDestination destination)
    {
        //...
        //Same peace of code as above    
        IRfcStructure salesHeader = salesDoc.GetStructure("ORDER_HEADER_IN");
        IRfcStructure salesHeaderINX = salesDoc.GetStructure("ORDER_HEADER_INX");
        salesHeaderINX.SetValue("UPDATEFLAG", "U");  

        IRfcTable salesItems = salesDoc.GetTable("ORDER_ITEM_IN");
        salesItems.Append();
        salesItems.SetValue("ITM_NUMBER", 000120);
        salesItems.SetValue("TARGET_QTY", Convert.ToDecimal("1"));
        IRfcTable salesItemsINX = salesDoc.GetTable("ORDER_ITEM_INX");
        salesItemsINX.Append();
        salesItemsINX.SetValue("UPDATEFLAG", "U");
        salesItemsINX.SetValue("ITM_NUMBER", 000120);
        salesItemsINX.SetValue("TARGET_QTY", "X");   
        //...
        //Invoke methods     
    }

场景C:新项目添加
结果: salesDoc.Invoke(目标)方法出错:"屏幕输出没有连接到用户。"

public DataTable BAPI_SALESORDER_CHANGE(RfcDestination destination)
    {
        //...
        //Same peace of code as above 
        IRfcStructure salesHeader = salesDoc.GetStructure("ORDER_HEADER_IN");
        IRfcStructure salesHeaderINX = salesDoc.GetStructure("ORDER_HEADER_INX");
        salesHeaderINX.SetValue("UPDATEFLAG", "U");

        IRfcTable salesItems = salesDoc.GetTable("ORDER_ITEM_IN");
        salesItems.Append();
        salesItems.SetValue("ITM_NUMBER", 130);
        salesItems.SetValue("MATERIAL", "000000000081828282");
        salesItems.SetValue("TARGET_QTY", Convert.ToDecimal("1"));
        IRfcTable salesItemsINX = salesDoc.GetTable("ORDER_ITEM_INX");
        salesItemsINX.Append();
        salesItemsINX.SetValue("UPDATEFLAG", "I");
        salesItemsINX.SetValue("ITM_NUMBER", 130);
        salesItemsINX.SetValue("MATERIAL", "X");
        salesItemsINX.SetValue("TARGET_QTY", "X");
        //...
        //Invoke methods               
    }

2 个答案:

答案 0 :(得分:0)

与ABAP程序一样,您需要在成功调用BAPI_SALESORDER_CHANGE后调用BAPI_TRANSACTION_COMMIT。否则,SAP不会提交您的交易。

答案 1 :(得分:0)

场景B:

您是否尝试过更换

salesItemsINX.SetValue("ITM_NUMBER", 000120);

使用

salesItemsINX.SetValue("ITM_NUMBER", "X");

我理解这些“ X表”的方式是,您需要用X标记每个字段,您希望BAPI在原始表中使用/考虑到该字段。

方案C:

“屏幕输出未连接到用户”表示BAPI_SALESORDER_CHANGE正在执行某项操作,不允许BAPI执行此操作……即调用/使用创建Dynpro输出的ABAP功能!

这么多年后,我希望他在BAPI_SALESORDER_CHANGE中的错误已得到修复。因此,您可以确保您的SAP系统具有最新的Hotpackage级别,或者与SAP支持人员联系以让他们检查BAPI_SALESORDER_CHANGE中是否还有某些需要修复的问题。