加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

ABAP 动态内表 取表结构信息

(2012-05-24 10:58:42)
标签:

杂谈

分类: ABAP

REPORT z_barry_test                            .

TYPE-POOLS : abap.
FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE,
               <dyn_wa>,
               <dyn_field>.
DATA: dy_table TYPE REF TO data,
      dy_line TYPE REF TO data,
      xfc TYPE lvc_s_fcat,
      ifc TYPE lvc_t_fcat.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.
PARAMETERS: p_table(30) TYPE c DEFAULT 'T001'.
SELECTION-SCREEN END OF BLOCK b1.

START-OF-SELECTION.
PERFORM get_structure.
PERFORM create_dynamic_itab.
PERFORM get_data.
PERFORM write_out.
*---------------------------------------------------------------------*
      FORM get_structure                                            *
*---------------------------------------------------------------------*
FORM get_structure.
DATA : idetails TYPE abap_compdescr_tab,
         xdetails TYPE abap_compdescr.
DATA : ref_table_des TYPE REF TO cl_abap_structdescr.

ref_table_des ?=
        cl_abap_typedescr=>describe_by_name( p_table ).
idetails[] = ref_table_des->components[].
LOOP AT idetails INTO xdetails.
    CLEAR xfc.
    xfc-fieldname = xdetails-name .
   xfc-datatype = xdetails-type_kind.
    xfc-inttype = xdetails-type_kind.
    xfc-intlen = xdetails-length + xdetails-decimals.
    xfc-decimals = xdetails-decimals.
    APPEND xfc TO ifc.
ENDLOOP.
ENDFORM.                    "get_structure
*---------------------------------------------------------------------*
      FORM create_dynamic_itab                                      *
*---------------------------------------------------------------------*
FORM create_dynamic_itab.

CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog = ifc
    IMPORTING
      ep_table        = dy_table.
ASSIGN dy_table->* TO <dyn_table>.

CREATE DATA dy_line LIKE LINE OF <dyn_table>.
ASSIGN dy_line->* TO <dyn_wa>.
ENDFORM.                    "create_dynamic_itab

*---------------------------------------------------------------------*
      FORM get_data                                                 *
*---------------------------------------------------------------------*
FORM get_data.
DATA: BEGIN OF itab OCCURS 0 .
          INCLUDE STRUCTURE spfli.
DATA: END OF itab.

SELECT * INTO CORRESPONDING FIELDS OF TABLE <dyn_table>
             FROM (p_table).
ENDFORM.                    "get_data
*---------------------------------------------------------------------*
      FORM write_out                                                *
*---------------------------------------------------------------------*
FORM write_out.
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.
ENDFORM.                    "write_out



==================================================================================================

  TYPE-POOLS: abap.
  DATA lt_dh TYPE TABLE OF zfi_dh_01.
  FIELD-SYMBOLS:
        <lfs_src> TYPE ANY,
        <lfs_comp_src> TYPE ANY,"source
        <lfs_dest> TYPE ANY,
        <lfs_comp_dest> TYPE ANY."destination
  DATAlr_tabledescr TYPE REF TO cl_abap_tabledescr,
        lr_structdescr TYPE REF TO cl_abap_structdescr,
        ls_compdescr TYPE abap_compdescr.
  FIELD-SYMBOLS:
        <lfs_table> TYPE STANDARD TABLE,
        <lfs_wa> TYPE ANY,
        <lfs_field> TYPE ANY.
  DATAlr_table TYPE REF TO data,
        lr_line TYPE REF TO data,
        ls_field_cat TYPE lvc_s_fcat,"Field catalog
        lt_field_cat TYPE lvc_t_fcat.


  DATAls_dh_old TYPE zfi_dh_01,
        ls_dh_new TYPE zfi_dh_01.

  SELECT SINGLE INTO ls_dh_old FROM zfi_dh_01
    WHERE zapprove_flow is_dh_details-zapprove_flow
    AND zbill is_dh_details-zbill
    AND zno is_dh_details-zno.

  CHECK sy-subrc 0 AND ls_dh_old IS NOT INITIAL.

  ls_dh_new is_dh_details.

  ASSIGN ls_dh_old TO <lfs_src>.
  ASSIGN ls_dh_new TO <lfs_dest>.

  lr_tabledescr ?= cl_abap_typedescr=>describe_by_data( lt_dh ).
  lr_structdescr ?= lr_tabledescr->get_table_line_type( ).

  LOOP AT lr_structdescr->components INTO ls_compdescr.
    ASSIGN COMPONENT ls_compdescr-name
      OF STRUCTURE <lfs_src> TO <lfs_comp_src>.
    ASSIGN COMPONENT ls_compdescr-name
      OF STRUCTURE <lfs_dest> TO <lfs_comp_dest>.
create structure
    IF <lfs_comp_src> <> <lfs_comp_dest>.
      CLEAR ls_field_cat.
      ls_field_cat-fieldname ls_compdescr-name .
      ls_field_cat-inttype ls_compdescr-type_kind.
      ls_field_cat-intlen ls_compdescr-length ls_compdescr-decimals.
      ls_field_cat-decimals ls_compdescr-decimals.
      APPEND ls_field_cat TO lt_field_cat.
    ENDIF.
  ENDLOOP.

*create dynamic table
  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog lt_field_cat
    IMPORTING
      ep_table        lr_table.
  ASSIGN lr_table->* TO <lfs_table>.

  CREATE DATA lr_line LIKE LINE OF <lfs_table>.
  ASSIGN lr_line->* TO <lfs_wa>.


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有