REPORT ZDYSQLDEMO .
TYPE-POOLS : abap. "类型组。
TYPE-POOLS : slis. "类型组。
FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE,
<dyn_wa>,
<dyn_field>.
* 定义一个指向内表类型的指针。
DATA: dy_table TYPE REF TO data, " 声明DATA类的对象。
dy_line TYPE REF TO data, " 声明DATA类的对象。
xfc TYPE lvc_s_fcat,
* alv 中存放FIELD属性的结构,属于类型组slis。
ifc TYPE lvc_t_fcat.
* alv里存放FIELD属性的内表,属于类型组slis。
DATA : idetails TYPE abap_compdescr_tab,
* 类型组ABAP里根据abap_compdescr定义的内表。
xdetails TYPE abap_compdescr.
* 类型组ABAP里定义的结构,可以存放字段的属性,
*比如:字段名,长度,数据类型等。
DATA : ref_table_des TYPE REF TO cl_abap_structdescr.
*声明cl_abap_structdescr的对象,
*类cl_abap_structdescr可以动态生成数据类型。
*下面以表ZMMI1为例子创建一个动态内表 。
DATA:TABLENAME(30) TYPE C.
TABLENAME = 'ZMMI1'.
ref_table_des ?=
cl_abap_typedescr=>describe_by_name( TABLENAME ).
* 构造函数初始化对象 ref_table_des
idetails[] = ref_table_des->components[].
LOOP AT idetails INTO xdetails.
CLEAR xfc.
xfc-fieldname = xdetails-name .
xfc-inttype = xdetails-type_kind.
xfc-intlen = xdetails-length + xdetails-decimals.
xfc-decimals = xdetails-decimals.
APPEND xfc TO ifc.
*将表ZMMI1中的字段属性传递给内表ifc
ENDLOOP.
* 下面会根据内表IFC中的存放的字段属性构造内表
*实际上ABAP的动态内表实现起来是非常灵活的,对于那表IFC的内容我们也可根
*据自己的需要随意构造,最主要的是下面这个静态方法。
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = ifc
IMPORTING
ep_table = dy_table.
ASSIGN dy_table->* TO <dyn_table>.
*让<dyn_table> 指向dy_table。
CREATE DATA dy_line LIKE LINE OF <dyn_table>.
ASSIGN dy_line->* TO <dyn_wa>.
*让<dyn_wa>指向dy_line。
* 到这里,我们动态那表就构造完成了,下面是动态SQL的实现。
data:L_COND(100) TYPE C.
DATA: I_COND LIKE TABLE OF L_COND.
CONCATENATE 'MJAHR = ''' '2008' '''' INTO L_COND.
APPEND L_COND TO I_COND.
SELECT * INTO CORRESPONDING FIELDS OF TABLE <dyn_table>
FROM ('ZMMI1') where (I_COND).
*上面的这条查询语句里的*号可以换成('filed1field2 field3')
*也是没有问题的,这里为了方便期间就用*了
*对于WHERE条件,必须通过那表来传,需要注意的是在SAP里的字符串,两个连续
*的逗号相当于一个逗号。
*我们把数据塞到 <dyn_table>以后,需要把数据从里面读取出来,
*下面是读取的方法:
LOOP AT <dyn_table> INTO <dyn_wa>.
DO.
ASSIGN COMPONENT sy-index
OF STRUCTURE <dyn_wa> TO <dyn_field>.
IF sy-subrc <> 0.
EXIT.
ENDIF.
IF sy-index = 1.
WRITE:/ <dyn_field>.
ELSE.
WRITE: <dyn_field>.
ENDIF.
ENDDO.
ENDLOOP.