我正在使用 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
}