ABAP Demo

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.

posted on 2009-02-17 14:57  LongSky  阅读(737)  评论(0编辑  收藏  举报

导航