标题写的有可能不清楚。流程是这样的,RFC函数 中没有传入参数,只有一个返回参数,还有一个内表对象。该接口不用返回参数进行返回信息的记录。均使用内表对象。譬如:该内表对象有A,B,C,D4个字段,我为内表对象赋值,执行函数,执行之后,无论是成功与否,数据是否满足业务逻辑。都会将A字段进行修改。也就是A字段记录了相关的返回信息。我读取该字段作为返回信息。我执行前不会为A赋值,这样执行后我获得的A字段就是空,如果我为A赋值,执行后的A和执行前的一样。如下是代码:
获取数据库连接,数据类ErpInfo ErpInfoOne = new ErpInfo();
ErpInfoList.Add(ErpInfoOne);
然后给数据类赋值 之后就是 和SAP相关的了
RfcConfigParameters parms = new RfcConfigParameters();
parms.Add(RfcConfigParameters.Name, "CON");
parms.Add(RfcConfigParameters.AppServerHost, "10.185.0.166"); //SAP主机IP
parms.Add(RfcConfigParameters.SystemNumber, "00"); //SAP实例
parms.Add(RfcConfigParameters.User, "XXXXX"); //用户名
parms.Add(RfcConfigParameters.Password, "XXXX"); //密码
parms.Add(RfcConfigParameters.Client, "800"); // Client
parms.Add(RfcConfigParameters.Language, "ZH"); //登陆语言
parms.Add(RfcConfigParameters.PoolSize, "5");
parms.Add(RfcConfigParameters.MaxPoolSize, "10");
parms.Add(RfcConfigParameters.IdleTimeout, "60");
RfcDestination dest = RfcDestinationManager.GetDestination(parms);
try
{
RfcRepository repo = dest.Repository;
IRfcFunction companyBapi = repo.CreateFunction("ZZHHS_FUNC_FJ007");
IRfcTable table = companyBapi.GetTable("ITAB_01"); //获取内表对象
//for (int y = 0; y < table.RowCount; y++)
//{
// table.CurrentIndex = y;
// MessageBox.Show("给表对象赋值之前 CHECK:" + table.CurrentRow.GetValue("CHECK").ToString() + " BLDAT:" + table.CurrentRow.GetValue("BLDAT").ToString());
//}
for (int i = 0; i < ErpInfoList.Count; i++)
{
table.Insert();
//table.CurrentRow.SetValue("CHECK", ErpInfoList[i].Check);//1
//都是赋值语句
table.CurrentRow.SetValue("UZAWE", ErpInfoList[i].Uzawe);//40
}
for (int y = 0; y < table.RowCount; y++)
{
table.CurrentIndex = y;
MessageBox.Show("执行函数前 CHECK:" + table.CurrentRow.GetValue("CHECK").ToString() + " BLDAT:" + table.CurrentRow.GetValue("BLDAT").ToString());
}
companyBapi.SetValue("ITAB_01", table);//将表对象实例赋给参数
companyBapi.Invoke(dest); //执行函数
string MAKTX = companyBapi.GetValue("RETURN_MSG").ToString(); //获取输出参数
MessageBox.Show("SAP的返回信息:" + MAKTX);
//IRfcTable table2 = companyBapi.GetTable("ITAB_01");
var table3 = (IRfcTable)companyBapi.GetValue("ITAB_01");
var result = table3.AsEnumerable()
.Select(row => new { CHECK = row.GetValue("CHECK"), BLDAT = row.GetValue("BLDAT") }).ToList();
}
catch (Exception ex)
{
MessageBox.Show("程序处理异常:" + ex.Message);
}
finally
{
}
这样无论我是用 table2 的方式还是用 table3的方式 再次去获得这个表对象的时候 获得的CHECK字段都是没有变化
该回答引用ChatGPT
根据您提供的代码,我注意到您在执行函数后尝试获取内表对象的字段值,但是该字段的值没有发生变化。这可能是因为RFC函数的内表对象是作为副本传递的,因此对内表对象的任何更改不会影响原始对象。在这种情况下,可以尝试将更改后的内表对象作为返回参数从RFC函数中返回,并在客户端获取更改后的内表对象。
具体地说,您可以修改RFC函数的定义以包含一个返回参数,该参数是一个包含更改后的内表对象的副本。在RFC函数中,将更改后的内表对象复制到返回参数中,然后在客户端中获取返回参数的值以获得更改后的内表对象。
例如,在RFC函数中添加以下代码:
IRfcTable returnTable = companyBapi.GetTable("RETURN");
returnTable.Append();
returnTable.SetValue("TYPE", "S");
returnTable.SetValue("MESSAGE", "Success");
returnTable.SetValue("LOG_NO", "000000000000");
returnTable.SetValue("LOG_MSG_NO", "000000");
returnTable.SetValue("MESSAGE_V1", "Successfully updated table");
returnTable.SetValue("MESSAGE_V2", "");
returnTable.SetValue("MESSAGE_V3", "");
returnTable.SetValue("MESSAGE_V4", "");
IRfcTable updatedTable = companyBapi.GetTable("ITAB_01").Clone();
foreach (IRfcStructure row in companyBapi.GetTable("ITAB_01"))
{
updatedTable.Append();
updatedTable.CurrentRow.SetValue("CHECK", row.GetValue("CHECK"));
updatedTable.CurrentRow.SetValue("BLDAT", row.GetValue("BLDAT"));
updatedTable.CurrentRow.SetValue("A", "New value for A");
}
companyBapi.SetValue("ETAB_01", updatedTable);
在客户端中,您可以使用以下代码获取返回参数中的更改后的内表对象:
IRfcTable returnTable = companyBapi.GetTable("RETURN");
if (returnTable.RowCount > 0 && returnTable.CurrentRow.GetString("TYPE") == "S")
{
IRfcTable updatedTable = companyBapi.GetTable("ETAB_01");
var result = updatedTable.AsEnumerable()
.Select(row => new {
CHECK = row.GetValue("CHECK"), BLDAT = row.GetValue("BLDAT"), A = row.GetValue("A")
}).ToList();
}
请注意,这只是一种可能的解决方案。如果您对RFC函数有更多的控制权,可以考虑修改RFC函数的定义以返回更适合您的需求的结果。