RFC_GET_TABLE传递“选项”和“字段”参数(c#)

时间:2014-12-24 07:38:53

标签: c# sap abap

需要帮助,我尝试使用RFC_READ_TABLE从SAP获取销售数据,但不知道如何将OPTIONS和FIELDS参数传递给SAP。这是我的应用程序的示例代码。

连接正常,执行后,我有一个例外" DATA_BUFFER_EXCEEDED"

public void RFC_READ_TABLE()
    {
        try
        {
            ECCDestinationConfig cfg = new ECCDestinationConfig();

            RfcDestinationManager.RegisterDestinationConfiguration(cfg);

            RfcDestination dest = RfcDestinationManager.GetDestination("ABI_ERP");

            RfcRepository repo = dest.Repository;

            IRfcFunction fn = repo.CreateFunction("RFC_READ_TABLE");

            fn.SetValue("QUERY_TABLE", "VBAP");

            fn.GetTable("DATA");

            fn.Invoke(dest);

            var companyCodeList = fn.GetTable("VBAP");

            var companyDataTable = companyCodeList.ToDataTable("VBAP");

            dataGridView1.DataSource = companyDataTable;
        }
        catch (RfcBaseException x)
        {

            MessageBox.Show("Some problems in programe execution. Check entered data, and try again." +
                                        "\n" +
                                        "\n<SAP Remote Execution Error>" +
                                        "\n" +
                                        "\nAdditional Information on Error: " + x.Message, "Oops, Runtime Error");
        }
    }

3 个答案:

答案 0 :(得分:1)

RFC_READ_TABLE不是用于读取销售订单数据的理想功能模块(它实际上是为快速n-dirty表读取而设计的,其他地方不存在)。我将研究以下支持RFC的功能模块:

  • BAPI_SALESORDER_GETLIST - 获取销售文档列表
  • BAPISDORDER_GETDETAILEDLIST - 阅读单个销售文档的详细信息

如果您查看功能组2032销售和分销 - &gt; 销售 - &gt;交易BAPI中的销售订单您可以找到其他可能有用的商品。

答案 1 :(得分:0)

使用&#39;选项&#39;缩小查询范围。和&#39;字段&#39; RFC_READ_TABLE的表选项。

答案 2 :(得分:0)

您应该只定义真正需要的列,例如在SQL中的SELECT之后,即销售单据,物料和物料编号:

IRfcTable fieldsTable = fn.GetTable("FIELDS");
fieldsTable.Append();
fieldsTable.SetValue("FIELDNAME", "VBELN"); //Sales Document
fieldsTable.Append();
fieldsTable.SetValue("FIELDNAME", "POSNR"); // Sales Document Item
fieldsTable.Append();
fieldsTable.SetValue("FIELDNAME", "MATNR"); // Material number

如果您不这样做,则调用将失败,因为您已提到超出了数据缓冲区。这是因为DATA函数中的RFC_READ_TABLE结构类型为TAB512,这意味着每行最多只能包含512个字符。您查询的表(VBAP)中合并的所有列的内容长度约为1500个字符。 Here you can see the length of each field.

然后,您还希望过滤表,类似于SQL中的WHERE子句。

IRfcTable options = fn.GetTable("OPTIONS");
options.Append();
options.SetValue("TEXT", "VBELN = '000000000' AND POSNR = '000000'");
options.Append();
options.SetValue("TEXT", " OR VBELN = '000000001' AND POSNR = '000001'");

在此还需要注意,因为每个选项文本的最大长度为72个字符。如果您需要多个或更长的WHERE子句,只需添加新的选项,例如fileds。 我注意到,OR在某些表上引起了一些性能问题。

设置函数的这两个属性后,您应该能够成功调用它。