平静范儿 2013-11-05 02:53 采纳率: 0%
浏览 2405

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字段都是没有变化

  • 写回答

1条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-02-27 20:40
    关注

    该回答引用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函数的定义以返回更适合您的需求的结果。

    评论

报告相同问题?

悬赏问题

  • ¥100 求数学坐标画圆以及直线的算法
  • ¥35 平滑拟合曲线该如何生成
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决