2 u010707304 u010707304 于 2013.11.05 10:53 提问

C#调用SAP RFC 无法获取内表对象的一个字段

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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!