简体   繁体   English

检索SAP表数据的通用功能模块

[英]Universal function module to retrieve SAP table data

What is the best way to access table data from a SAP system?从 SAP 系统访问表数据的最佳方式是什么?

I tried it with it RFC_READ_TABLE, but this RFC returns the data in concatenated form within a single column and has a size restriction for row data.我用它 RFC_READ_TABLE 尝试过它,但是这个 RFC 以连接形式返回单列中的数据,并且对行数据有大小限制。

Is there a better way to access SAP data in generic form without creating custom RFCs into the system?是否有更好的方法以通用形式访问 SAP 数据,而无需在系统中创建自定义 RFC?

I am searching for a standard RFC solution, not a custom script.我正在寻找标准的 RFC 解决方案,而不是自定义脚本。

If I understand your question right, you want to read a table, but at time of programming, you don't know which table.如果我理解你的问题,你想读一个表,但在编程时,你不知道哪个表。 With Select * from (tablename) you can read with a dynamic table name.使用Select * from (tablename)您可以读取动态表名。 The target field can be defined dynamic with create data .可以使用create data动态定义目标字段。

An example (untested, currently I have no access to an SAP-system):一个例子(未经测试,目前我无法访问 SAP 系统):

  DATA: lv_tablename TYPE string,
        ev_filelength TYPE i.

  lv_tablename = 'mara'. "e.g. a parameter

  DATA dref TYPE REF TO data.
  CREATE DATA dref TYPE TABLE OF (lv_tablename).

  FIELD-SYMBOLS: <wa> TYPE ANY TABLE.
  ASSIGN dref->* to <wa>.
  SELECT * FROM (lv_tablename) INTO TABLE <wa>. "Attention for test, may be large result
  "<wa> is like a variable with type table mara
TYPES: BEGIN OF t_bseg,
*include structure bseg.
  bukrs     LIKE bseg-bukrs,
  belnr     LIKE bseg-belnr,
  gjahr     LIKE bseg-gjahr,
  buzei     LIKE bseg-buzei,
  mwskz     LIKE bseg-mwskz,         "Tax code
  umsks     LIKE bseg-umsks,         "Special G/L transaction type
  prctr     LIKE bseg-prctr,         "Profit Centre
  hkont     LIKE bseg-hkont,         "G/L account
  xauto     LIKE bseg-xauto,
  koart     LIKE bseg-koart,
  dmbtr     LIKE bseg-dmbtr,
  mwart     LIKE bseg-mwart,
  hwbas     LIKE bseg-hwbas,
  aufnr     LIKE bseg-aufnr,
  projk     LIKE bseg-projk,
  shkzg     LIKE bseg-shkzg,
  kokrs     LIKE bseg-kokrs,
 END OF t_bseg.
DATA: it_bseg TYPE STANDARD TABLE OF t_bseg INITIAL SIZE 0,
      wa_bseg TYPE t_bseg.

DATA: it_ekko TYPE STANDARD TABLE OF ekko.


*Select all fields of a SAP database table into in itab
SELECT *
  FROM ekko
  INTO TABLE it_ekko.

Try this snippet of RFC_READ_TABLE to get data in structured form:试试这个RFC_READ_TABLE片段以获取结构化形式的数据:

  DATA: oref       TYPE REF TO cx_root,
        text       TYPE string,
        obj_data   TYPE REF TO data.
        lt_options TYPE TABLE OF rfc_db_opt,
        ls_option  TYPE rfc_db_opt,
        lt_fields  TYPE TABLE OF rfc_db_fld,
        ls_field   TYPE rfc_db_fld,
        lt_entries TYPE STANDARD TABLE OF tab512.

   FIELD-SYMBOLS: <fs_tab> TYPE STANDARD TABLE.

  TRY.

      ls_option-text = `some query`.
      APPEND ls_option TO lt_options.
      ls_field-fieldname = 'PARTNER'.
      APPEND ls_field TO lt_fields.
      ls_field-fieldname = 'TYPE'.
      APPEND ls_field TO lt_fields.
      ls_field-fieldname = 'BU_GROUP'.
      APPEND ls_field TO lt_fields.
      ls_field-fieldname = 'BU_SORT1'.
      APPEND ls_field TO lt_fields.
      ls_field-fieldname = 'TITLE'.
      APPEND ls_field TO lt_fields.

      CALL FUNCTION 'RFC_READ_TABLE' DESTINATION dest
        EXPORTING
          query_table = 'BUT000'
        TABLES
          options     = lt_options
          fields      = lt_fields
          data        = lt_entries.

    CATCH cx_root INTO oref.
      text = oref->get_text( ).
      MESSAGE text TYPE 'E'.
  ENDTRY.

  IF lt_entries IS NOT INITIAL.

    CREATE DATA obj_data TYPE TABLE OF but000.
    ASSIGN obj_data->* TO <fs_tab>.

    CREATE DATA obj_data TYPE but000.
    ASSIGN obj_data->* TO FIELD-SYMBOL(<fs_line>).

    LOOP AT lt_entries ASSIGNING FIELD-SYMBOL(<wa_data>).
        LOOP AT lt_fields ASSIGNING FIELD-SYMBOL(<fs_fld>).
          ASSIGN COMPONENT <fs_fld>-fieldname OF STRUCTURE <fs_line> TO FIELD-SYMBOL(<lv_field>).
          IF <lv_field> IS ASSIGNED AND sy-subrc IS INITIAL.
            <lv_field> = <wa_data>-wa+<fs_fld>-offset(<fs_fld>-length).
          ENDIF.

          APPEND <fs_line> TO <fs_tab>.
        ENDLOOP.
    ENDLOOP.

  ENDIF.

  IF <fs_tab> IS NOT INITIAL.
    "Bingo!
  ENDIF.

Thanks for the help!谢谢您的帮助!

I just think there is a small mistake and also a recommendation from my side: Mistake: APPEND <fs_line> TO <fs_tab>.我只是认为有一个小错误,也是我这边的建议:错误:APPEND <fs_line> TO <fs_tab>。 should be after the ENDLOOP.应该在ENDLOOP之后。 Recommendation: use FM BBP_RFC_READ_TABLE instead of RFC_READ_TABLE.建议:使用 FM BBP_RFC_READ_TABLE 而不是 RFC_READ_TABLE。 Otherwise you will have problems with decimal numbers.否则你会遇到十进制数的问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM