【问题标题】:SAP .Net Connector 3.0 RfC return incorrect valuesSAP .Net 连接器 3.0 RfC 返回不正确的值
【发布时间】:2013-11-06 11:23:15
【问题描述】:

我编写了一个自定义 RFC,它从 BKPF 读取特定数据并将其返回。

当我在 SAP Gui 中测试该功能模块时,它工作得很好,但是当我通过 .Net 连接器 3.0 驱动程序从 .Net 应用程序中使用它时,我在 BUKRS 中得到了 'I' 值(带有 3 个空格)而不是 ' IP01'。

我在连接参数中尝试了几个代码页,但没有任何改变。

    FUNCTION ZONW_IMPORT_ECRM.
    *"----------------------------------------------------------------------
    *"*"Interface locale :
    *"  IMPORTING
    *"     VALUE(MAX_ROWS) TYPE  I DEFAULT 0
    *"     VALUE(WHERE_TAB) TYPE  WHERECONDS OPTIONAL
    *"     VALUE(COMPANYCODE) TYPE  BKPF-BUKRS DEFAULT 'IP01'
    *"     VALUE(CURRY) TYPE  BSEG-GJAHR DEFAULT SY-DATUM
    *"  EXPORTING
    *"     VALUE(RETURN_CODE) TYPE  I
    *"  TABLES
    *"      RETURN_TABLE STRUCTURE  BKPF
    *"----------------------------------------------------------------------

     CLEAR RETURN_TABLE.    REFRESH RETURN_TABLE.

    ****** Creation du type de la table ECRM

      TYPES: TT_ECRM TYPE STANDARD TABLE OF BKPF.

    ****** Creation d'une table interne

      DATA: IT_ECRM TYPE  TT_ECRM,
            CURRM   TYPE  BKPF-MONAT,
            PREVM   TYPE  BKPF-MONAT,
            PREVY   TYPE  BKPF-GJAHR.

    ****** Initialisation des variables

      IF CURRY IS INITIAL.
        CALL FUNCTION 'GET_CURRENT_YEAR'
        EXPORTING
          BUKRS = COMPANYCODE
        IMPORTING
           CURRM         = currm    " Current Fiscal Month
           CURRY         = curry    " Current Fiscal Year
           PREVM         = prevm    " Previous Fiscal Month
           PREVY         = prevy.   " Previous Fiscal Year
      ENDIF.


    ****** Récupération des données


      " La requete de sélection
          SELECT  BUKRS
                  BELNR
                  GJAHR
                  BLART
                  BLDAT
                  BUDAT
                  CPUDT
                  CPUTM
                  AEDAT
                  USNAM
                  XBLNR
                  DBBLG
                  STBLG
                  BKTXT
                  HWAER
                  BSTAT
            UP TO MAX_ROWS ROWS
          INTO CORRESPONDING FIELDS OF TABLE IT_ECRM
          FROM  BKPF
          WHERE BUKRS = COMPANYCODE
          AND   GJAHR = CURRY
          AND   (WHERE_TAB).



    RETURN_TABLE[] = IT_ECRM[].
    ENDFUNCTION.

它是函数体,如前所述,它从表 BKPF 返回一些行,并且在 SAP Gui 中测试时工作正常,但是当通过 .Net 连接器调用时,BUKRS 的值返回“I”而不是“IP01”

查看 BKPF 的结构后,我在 SAP(MANDT、BUKRS、)中找到的结构与我在 .Net 中查看 table.Metadata.LineType 时得到的结构似乎有所不同

{STRUCTURE BKPF{BUKRS:CHAR4, MANDT:CHAR3, BELNR:CHAR10, GJAHR:NUM(4), BLART:CHAR2, BLDAT:DATE, BUDAT:DATE, MONAT:NUM(2), CPUDT:DATE, CPUTM:TIME, AEDAT:DATE, UPDDT:DATE, WWERT:DATE, USNAM:CHAR12, TCODE:CHAR20, BVORG:CHAR16, XBLNR:CHAR16, DBBLG:CHAR10, STBLG:CHAR10, STJAH:NUM(4), BKTXT:CHAR25, WAERS:CHAR5, KURSF:BCD[5:5], KZWRS:CHAR5, KZKRS:BCD[5:5], BSTAT:CHAR1, XNETB:CHAR1, FRATH:BCD[7:2], XRUEB:CHAR1, GLVOR:CHAR4, GRPID:CHAR12, DOKID:CHAR40, ARCID:CHAR10, IBLAR:CHAR2, AWTYP:CHAR5, AWKEY:CHAR20, FIKRS:CHAR4, HWAER:CHAR5, HWAE2:CHAR5, HWAE3:CHAR5, KURS2:BCD[5:5], KURS3:BCD[5:5], BASW2:CHAR1, BASW3:CHAR1, UMRD2:CHAR1, UMRD3:CHAR1, XSTOV:CHAR1, STODT:DATE, XMWST:CHAR1, CURT2:CHAR2, CURT3:CHAR2, KUTY2:CHAR4, KUTY3:CHAR4, XSNET:CHAR1, AUSBK:CHAR4, XUSVR:CHAR1, DUEFL:CHAR1, AWSYS:CHAR10, TXKRS:BCD[5:5], LOTKZ:CHAR10, XWVOF:CHAR1, STGRD:CHAR2, PPNAM:CHAR12, BRNCH:CHAR4, NUMPG:NUM(3), ADISC:CHAR1, XREF1_HD:CHAR20, XREF2_HD:CHAR20, XREVERSAL:CHAR1, REINDAT:DATE, RLDNR:CHAR2, LDGRP:CHAR4, PROPMANO:CHAR13, XBLNR_ALT:CHAR26, VATDATE:DATE, XSPLIT:CHAR1, PSOTY:CHAR2, PSOAK:CHAR10, PSOKS:CHAR10, PSOSG:CHAR1, PSOFN:CHAR30, INTFORM:CHAR4, INTDATE:DATE, PSOBT:DATE, PSOZL:CHAR1, PSODT:DATE, PSOTM:TIME, FM_UMART:CHAR1, CCINS:CHAR4, CCNUM:CHAR25, SSBLK:CHAR1, BATCH:CHAR10, SNAME:CHAR12, SAMPLED:CHAR1, EXCLUDE_FLAG:CHAR1, BLIND:CHAR1, OFFSET_STATUS:CHAR2, OFFSET_REFER_DAT:DATE, PENRC:CHAR2, KNUMV:CHAR10}}

【问题讨论】:

    标签: .net sap sap-dotnet-connector


    【解决方案1】:

    我刚刚尝试使用我的基础系统中存在的另一个依赖于客户端的表:HRH1222。 在这种情况下,DDIF_FIELDINFO_GET 返回所有 11 个字段,包括位置 0001 的 MANDT 字段。所以这里一切正常。 NCo 3.0 正在使用 DDIF_FIELDINFO_GET 的输出来构建其结构信息。

    一个可能的解释你的情况可能是什么问题:我听说某咨询公司(Tata Consulting?)在几个客户项目中修改了标准 SAP 功能模块 DDIF_FIELDINFO_GET 以抑制“不需要的”字段。这些字段中有可以携带密码的字段——还有 MANDT 字段!

    如果您在后端进行了此类修改,则可以解释我们在此处看到的行为...

    【讨论】:

      【解决方案2】:

      您正在使用表 BKPF 作为输出结构。该表在第一个位置具有用于客户端处理的关键字段MANDT。您没有向我们展示您用于访问功能模块的代码,但我怀疑您以某种方式“忘记”了有一个客户字段。您的功能模块将客户端字段留空(三个空格),因此问题似乎是这样的:

         what you want to get
          |
         /--\
      MMMBBBB
      AAAUUUU
      NNNKKKK
      DDDRRRR
      TTTSSSS
      \--/
       |
      what you really get
      

      【讨论】:

      • 事实上我什至尝试了 SELECT * FROM bkpf。它没有改变任何东西。我通过将 return_table 引用为 IRfcTable 并从那里迭代它们的字段来使用读取结果的通用方法。
      • @Moadh 那么很有可能您的通用方法(或至少您的通用方法的实现)存在缺陷。如果不检查代码,我无法判断。但是,根据我的经验,SAP 连接器通常都经过了很好的测试,所以我认为连接器不太可能存在像这个一样基本的问题。
      • 这是在 .Net 客户端: _SapCfg = New DestinationConfiguration() _SapCfg.SetParameters(_ParameresConnexion) RfcDestinationManager.RegisterDestinationConfiguration(_SapCfg) _Destination = RfcDestinationManager.GetDestination(CONFIG_NAME) _SapRfcRepo = _Dest存储库 _SapRfcRepo.ClearAllMetadata() _RfcFN = _SapRfcRepo.CreateFunction(_NomFonctionRfc) _RfcFN.Invoke(_Destination)
      • 然后获取表并遍历其行 _Table =_RfcFN.GetTable("RETURN_TABLE") _Table.CurrentIndex=i dim val as Object = Table.CurrentRow.GetValue(i)
      • 我不确定这是否足够清楚,但我在 .Net 中获取数据的方式相当简单。这可能是一个与 BKPF 结构特别相关的问题,因为我可以在没有这个问题的情况下读取很多其他表,并且在客户端使用相同的代码。
      【解决方案3】:

      作为第一步,在 Level4 激活 NCo 跟踪并查看数据通过网络传输时的样子。

      确保在您的测试调用中 FM 仅返回少数几行,否则数据将被压缩,然后您将看不到任何内容... :)

      查看您的连接参数也很有趣。这看起来确实像 Unicode-Non-Unicode 不匹配。 (如果数据被意外解释为 1 字节非 unicode 字符,则 2 字节 unicode 字符的后半部分被“错误解释”为终止零......)

      通常您不需要弄乱 CODEPAGE 参数,因为 NCo 会自动正确设置...(如果您在不知道自己在做什么的情况下明确设置了 CODEPAGE,则只会造成损坏。)

      【讨论】:

        猜你喜欢
        • 2016-06-03
        • 2023-04-03
        • 2012-08-18
        • 1970-01-01
        • 1970-01-01
        • 2011-12-24
        • 1970-01-01
        • 1970-01-01
        • 2018-01-03
        相关资源
        最近更新 更多