2011-09-16 45 views
1

從SAP系統訪問表格數據的最佳方式是什麼?檢索SAP表格數據的通用功能模塊

我用它試過了RFC_READ_TABLE,但是這個RFC在一列中以串聯的形式返回數據並且對行數據有一個大小限制。

有沒有更好的方式來訪問通用形式的SAP數據而無需在系統中創建自定義RFC?

我正在尋找一個標準的RFC解決方案,而不是一個自定義腳本。

回答

1

如果我理解你的問題的權利,你想讀一張表,但在編程時,你不知道哪張表。 With Select * from (tablename)你可以用動態表名讀取。 目標字段可以用create data定義爲動態。

一個例子(未經測試,目前我沒有訪問到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 
+0

謝謝爲例。但這是一個自定義腳本。此任務是否有其他標準RFC? –

+0

我以爲你在SAP系統內部,但你在外面需要RFC。特設我沒有其他想法,然後RFC_READ_TABLE - 抱歉。 – knut

+0

我剛剛更新了我的問題。不管怎麼說,還是要謝謝你。 –

1
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. 
0

嘗試的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.