标题写的有可能不清楚。流程是这样的,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字段都是没有变化