ABAP 動態內表構建 Dynamic internal table


ABAP 動態內表構建 Dynamic internal table

這兩天做了一個這樣的需求,其中要求根據用戶輸入的工資項(T512W-LGART)查找數據,並輸出到ALV,要求是輸出跟着輸入變。由於工資項的配置信息可能會變,因此用於存儲要顯示的數據的內表就不能預先知道,因此不得不尋求動態內表的構建方法。
        其實網上的例子也有不少,但是都缺少說明,折騰了一上午才弄明白一些,寫出來與大家分享。
REPORT  Z_DT2.
type-pools : abap.       
*以t512w為例,構建一個動態內表
tables: t512w.
*field-symbols是一個標志,你可以理解為一個指針,將來創建的內表就要通過它們來訪問
field-symbols: [小於號]dyn_table> type standard table,
[小於號]dyn_wa>,
[小於號]dyn_field>.
* 這里定義了一個 dy_table 和一個 dy_line 類型是引用,但 to data 未能理解是什么意思,我覺得應該是說指向為空的意思
data: dy_table type ref to data,
dy_line  type ref to data,
*用於存儲即將構建的動態內表結構
ifc type lvc_t_fcat,
xfc type lvc_s_fcat.
data: begin of t_lgart occurs 0,
        LGART like t512w-lgart,
      end of t_lgart.
select-options: S_LGART FOR t512w-lgart.

start-of-selection.
*首先從數據庫中把符合用戶輸入的LGART填入內表,將來構建的動態內表每一列就是LGART中的每一行。
  select lgart into t_lgart-lgart from t512w where lgart in s_lgart and MOLGA = '28'.
    append t_lgart.
  endselect.
*循環讀取內表t_lgart,對於每行構建內表
loop at t_lgart.
*這里偷了個懶,因為工資項中會有/103這樣的數據,而/是不能用左列明的,大家可以自己寫一個替換邏輯,把/替換成_之類的字符。
check t_lgart-lgart+0(1) ne '/'.
*列名就用lgart值
xfc-fieldname = t_lgart-lgart.
    xfc-datatype = 'C'.
    xfc-inttype = 'C'.
    xfc-intlen = 6.
    xfc-decimals = 0.
    append xfc to ifc.
  endloop.
*此處調用一個方法,這個方法用於構建動態內表,輸入的就是要構建的結構,輸出的就是一個dy_table,之前定義過,但是並不能直接訪問。
  call method cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog = ifc
    IMPORTING
      ep_table        = dy_table.
*設定<dyn_table>指向 dy_table
assign dy_table->* to <dyn_table>.
*下面這句建立了一個<dyn_table>類型的工作區Work area
create data dy_line like line of <dyn_table>.
*同理設定指針
assign dy_line->* to <dyn_wa>.

於是便動態的建立了一個內表和一個工作區,由於此方法建立的內表沒有header line,所以需要一個工作區。

下面是取數或者賦值的方法:

*此行中的xxxx1就是列名
ASSIGN COMPONENT xxxx1 OF STRUCTURE <dyn_wa> TO <dyn_field>.
*此行的作用就是給<dyn_wa>中的該列一個值
<dyn_field> = xxxx2.
*用Append就可以把該行添加到表中了
APPEND <dyn_wa> TO <dyn_table>.

如上所述,即可以動態構建內表,這種方法主要用於表結構無法確定有幾列,幾有哪些列,尤其與信息配置有關的時候,就只能用這種方法,否則配置一變,程序就不能用了。
        才疏學淺,學習體會總結出來希望能對大家有所幫助,有不對的地方希望大家指正,向大家學習!

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com