SAP.Net Connector 3.0 RfC返回不正确的值

SAP.Net Connector 3.0 RfC返回不正确的值,.net,sap,sap-dotnet-connector,.net,Sap,Sap Dotnet Connector,我编写了一个自定义RFC,从BKPF读取特定数据并返回它 当我在SAP Gui中测试该功能模块时,它工作得非常好,但是当我通过.Net Connector 3.0驱动程序从.Net应用程序中使用它时,我得到的是BUKRS中的“I”值(带3个空格),而不是“IP01” 我在连接参数中尝试了几个代码页,但没有任何更改 FUNCTION ZONW_IMPORT_ECRM. *"-------------------------------------------------------

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

当我在SAP Gui中测试该功能模块时,它工作得非常好,但是当我通过.Net Connector 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
时得到的结构有所不同



结构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,xbln:CHAR16,DBBLG:CHAR10,STBLG:CHAR10,STJAH:NUM(4),bkurbg:CHAR25,WAERS:CHAR5,kurbcd:5,wr:5,BCD[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,brmp3:NUM,char3,ADISC:CHAR1,XREF1\u HD:CHAR20,XREF2\u HD:CHAR20,xreversion:CHAR1,REINDAT:DATE,RLDNR:CHAR2,LDGRP:CHAR4,PROPMANO:CHAR13,xblnu\u 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,PSODT:TIME,PSOZL:TIME,FM,ccumart:CHAR4:CHAR25,SSBLK:CHAR1,BATCH:CHAR10,SNAME:CHAR12,SAMPLED:CHAR1,EXCLUDE\u标志:CHAR1,BLIND:CHAR1,OFFSET\u状态:CHAR2,OFFSET\u参考日期,PENRC:CHAR2,KNUMV:CHAR10}
您正在使用表
BKPF
作为输出结构。该表的第一个位置有用于客户端处理的键字段
MANDT
。您没有向我们展示用于访问功能模块的代码,但我怀疑您不知何故“忘记”了有一个客户机字段。功能模块将客户端字段留空(三个空格),因此问题似乎是这样的:

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

作为第一步,在第4级激活NCo跟踪,并查看数据通过导线时的外观

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

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


通常情况下,您不需要处理CODEPAGE参数,因为NCo会自动正确处理它。。。(如果在不知道自己在做什么的情况下显式设置代码页,则只会造成损坏。)

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

一个可能的解释是,您的案例中可能存在什么问题:我听说某咨询公司(塔塔咨询?)在一些客户项目中修改了标准SAP功能模块DDIF_FIELDINFO_,以抑制“不需要的”字段。这些字段中有可以携带密码的字段,还有MANDT字段


如果您的后端有这样的修改,这将解释我们在这里看到的行为…

事实上,我甚至尝试了从bkpf选择*。这没有改变任何事情。我使用的是一种读取结果的通用方法,将return_表作为IRfcTable引用,然后在它们的字段上进行迭代。@Moadh那么您的通用方法(或者至少是通用方法的实现)很有可能存在缺陷。我不查密码就说不出来。但是,从我的经验来看,SAP连接器通常都经过了很好的测试,所以我认为不可能有一个像连接器那样的基本问题。这是在.NET客户端中的:<代码>RfcDestinationManager.RegisterDestinationConfiguration(_-SapCfg)_Destination=RfcDestinationManager.GetDestination(配置名称)_-SapRfcRepo=_Destination.Repository(存储库)_-SapRfcRepo.ClearAllMetadata()_-RfcFN=_-SapRfcRepo.CreateFunction(_-NomFonctionRfc)_-RfcFN.Invoke(_-Destination)然后获取表并在其行上迭代_table=\u RfcFN.GetTable(“RETURN\u table”)_table.CurrentIndex=i dim val as Object=table.CurrentRow.GetValue(i)我不确定这是否足够清楚,但我在.Net中获取数据的方式相当简单。这可能是一个与BKPF结构相关的问题,因为我能够在没有这个问题的情况下读取很多其他表,并且在客户端使用相同的代码。