1

我正在使用 SAP .NET Connector 3.0 来构建 RFC 客户端,让用户以最简单的方式与 SAP 进行通信。
在这里,我想提供一些简短的示例,说明是什么阻止了我继续发展。目前我的目的是更改现有的销售订单。BAPI_SALESORDER_CHANGE是 FM 我要用来更改 SO 标题和项目数据。我有 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(destination) 方法出错:“屏幕输出未连接到用户。”

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               
    }
4

2 回答 2

1

场景 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 中是否还有需要修复的内容。

于 2018-09-06T12:45:56.447 回答
0

就像在 ABAP 程序中一样,您需要在成功调用 BAPI_SALESORDER_CHANGE 后调用 BAPI_TRANSACTION_COMMIT。否则,SAP 不会提交您的事务。

于 2014-11-04T22:28:45.150 回答