使用SAP.Net Connector 3.0调用BAPI_PO_CREATE

时间:2017-06-10 10:36:00

标签: c# .net sap bapi

我正在尝试使用SAP.net Connector 3.0从我的.net应用程序创建SAP中的采购订单 但是我在RETURN参数

中收到以下错误消息

ME159:函数模块以错误的顺序调用。

我正在使用以下代码:

// helper method to get destination from destination configuration
var dest = RfcConfigurationHelper.GetDestination(); 

RfcSessionManager.BeginContext(dest);

IRfcFunction rfcFunction = dest.Repository.CreateFunction("BAPI_PO_CREATE");

IRfcFunction transaction = dest.Repository.CreateFunction("BAPI_TRANSACTION_COMMIT");
transaction.SetValue("WAIT","X");

IRfcStructure header = rfcFunction["PO_HEADER"].GetStructure();
header.SetValue("DOC_TYPE", "NB");
header.SetValue("PURCH_ORG", "0001");
header.SetValue("PUR_GROUP", "001");
header.SetValue("DOC_DATE", DateTime.Now.ToString("yyyy-MM-dd"));
header.SetValue("VENDOR", "V544100170");

IRfcTable items = rfcFunction["PO_ITEMS"].GetTable();
IRfcStructure item = items.Metadata.LineType.CreateStructure();
item.SetValue("PO_ITEM", "1");
item.SetValue("PUR_MAT", "TEST_MAT");
item.SetValue("PLANT", "0001");

IRfcTable shedules = rfcFunction["PO_ITEM_SCHEDULES"].GetTable();
IRfcStructure shedule = shedules.Metadata.LineType.CreateStructure();
shedule.SetValue("PO_ITEM", "1");
shedule.SetValue("DELIV_DATE", DateTime.Now.AddDays(7).ToString("yyyy-MM-dd"));
shedule.SetValue("QUANTITY", 10);

rfcFunction.Invoke(dest);

transaction.Invoke(dest);

IRfcTable returns = rfcFunction["RETURN"].GetTable();
RfcSessionManager.EndContext(dest);

请帮忙。感谢

1 个答案:

答案 0 :(得分:1)

最后我弄明白了我所缺少的东西。这是一个愚蠢的错误。以下是经过编辑的代码

// helper method to get destination from destination configuration
var dest = RfcConfigurationHelper.GetDestination(); 

RfcSessionManager.BeginContext(dest);

IRfcFunction rfcFunction = dest.Repository.CreateFunction("BAPI_PO_CREATE");

IRfcFunction transaction = dest.Repository.CreateFunction("BAPI_TRANSACTION_COMMIT");
transaction.SetValue("WAIT","X");

IRfcStructure header = rfcFunction["PO_HEADER"].GetStructure();
header.SetValue("DOC_TYPE", "NB");
header.SetValue("PURCH_ORG", "0001");
header.SetValue("PUR_GROUP", "001");
header.SetValue("DOC_DATE", DateTime.Now.ToString("yyyy-MM-dd"));
header.SetValue("VENDOR", "V544100170");

IRfcTable items = rfcFunction["PO_ITEMS"].GetTable();
IRfcStructure item = items.Metadata.LineType.CreateStructure();
item.SetValue("PO_ITEM", "1");
item.SetValue("PUR_MAT", "TEST_MAT");
item.SetValue("PLANT", "0001");

// this was missing as I haven't added the row to the table
items.Insert(item);

IRfcTable schedules = rfcFunction["PO_ITEM_SCHEDULES"].GetTable();
IRfcStructure schedule = shedules.Metadata.LineType.CreateStructure();
schedule.SetValue("PO_ITEM", "1");
schedule.SetValue("DELIV_DATE", DateTime.Now.AddDays(7).ToString("yyyy-MM-dd"));
schedule.SetValue("QUANTITY", 10);

// this was missing as I haven't added the row to the table
schedules.Insert(schedule);

rfcFunction.Invoke(dest);

transaction.Invoke(dest);

IRfcTable returns = rfcFunction["RETURN"].GetTable();
RfcSessionManager.EndContext(dest);