动态内表结构创建---批量处理多个表的所有数据

目录

1、动态内表/结构

方法一

方法二

2、实例


1、动态内表/结构

方法一

       场景:可以用到批导,输入表名导入或者删除对应的数据库表。

*&表名
data p_name TYPE tabname.

DATA: dref_tab    TYPE REF TO data,
      struct_type TYPE REF TO cl_abap_structdescr,
      ls_tab      TYPE REF TO cl_abap_tabledescr,
      lt_tab      TYPE cl_abap_structdescr=>component_table WITH HEADER LINE.
FIELD-SYMBOLS: <fs_data> TYPE any,
               <fs_itab> TYPE ANY TABLE.
struct_type ?= cl_abap_structdescr=>describe_by_name( p_name ).
lt_tab[] = struct_type->get_components( ).
struct_type = cl_abap_structdescr=>create( lt_tab[] ).
*CREATE DATA gt_data    TYPE HANDLE struct_type.
ls_tab = cl_abap_tabledescr=>create( struct_type ).
CREATE DATA dref_tab TYPE HANDLE ls_tab.
ASSIGN dref_tab->* TO <fs_itab>.
*&动态内表<fs_itab>.

*&动态更新表
 MODIFY (p_name) FROM TABLE <fs_itab>.

方法二


TYPE-POOLS:abap,slis.
data p_tab like tabname.
FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE, "内表指针
               <dyn_wa>, "工作区
               <dyn_field>. "字段
DATA:dy_table TYPE REF TO data,
     dy_line  TYPE REF TO data,  "行
     wa_fcat  TYPE lvc_s_fcat,   "列结构
     it_fcat  TYPE lvc_t_fcat.
DATA lt_table TYPE TABLE OF dfies. "字段结构表
DATA ls_table TYPE dfies.
"获取字段名
CALL FUNCTION 'DDIF_NAMETAB_GET'
  EXPORTING
    tabname   = p_tab
  TABLES
    dfies_tab = lt_table
  EXCEPTIONS
    not_found = 1
    OTHERS    = 2.
LOOP AT  lt_table INTO ls_table.
  MOVE-CORRESPONDING ls_table TO wa_fcat.
  APPEND wa_fcat TO it_fcat.
  CLEAR wa_fcat.
ENDLOOP.
CALL METHOD cl_alv_table_create=>create_dynamic_table
  EXPORTING
    it_fieldcatalog = it_fcat
  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>.                  "内表对应的结构 

2、实例

描述:把表里所有字段里的 \ 替换成  \\ 。

REPORT ztestd.
*&行转列的内表
DATA: BEGIN OF gs_col,
        index TYPE i,
        name  TYPE string,
        value TYPE string,
      END OF gs_col.
DATA gt_col LIKE TABLE OF gs_col.
DATA:cl_descr TYPE REF TO cl_abap_structdescr.
FIELD-SYMBOLS: <fs> TYPE any.
FIELD-SYMBOLS: <f3> TYPE any.
FIELD-SYMBOLS:<fs_comp> TYPE abap_compdescr.
**动态显示内表
FIELD-SYMBOLS:<fs_dyntab> TYPE table,
              <fs_dynwa>  TYPE any.
**明细表结构
DATA: gt_alv_cat TYPE TABLE OF lvc_s_fcat,
      gs_alv_cat LIKE LINE  OF gt_alv_cat.
DATA:lt_ref TYPE REF TO data,
     ls_ref TYPE REF TO data.
DATA:gt_table TYPE TABLE OF dntab,
     gs_table TYPE dntab.

PARAMETERS p_name TYPE tabname.

START-OF-SELECTION.
*&获得表的字段
  CALL FUNCTION 'NAMETAB_GET'
    EXPORTING
      langu          = sy-langu
      tabname        = p_name
    TABLES
      nametab        = gt_table
    EXCEPTIONS
      no_texts_found = 1.

*&通过FIELDCAT获得动态内表
  LOOP AT gt_table INTO gs_table.
    MOVE-CORRESPONDING gs_table TO gs_alv_cat.
    APPEND gs_alv_cat TO gt_alv_cat.
    CLEAR: gs_alv_cat,gs_table.
  ENDLOOP.

*&通过函数内表生成
  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog = gt_alv_cat
    IMPORTING
      ep_table        = lt_ref.

***指定生成的内表到字段符号
  ASSIGN lt_ref->* TO <fs_dyntab>.
  CREATE DATA ls_ref LIKE LINE OF <fs_dyntab>.
*&获得动态内表对应的结构
  ASSIGN ls_ref->* TO <fs_dynwa>.
*&
  SELECT * FROM (p_name) INTO CORRESPONDING FIELDS OF TABLE <fs_dyntab>.

*&获取字段名
  cl_descr ?= cl_abap_typedescr=>describe_by_data( <fs_dynwa> ).
*&行转列
  LOOP AT <fs_dyntab> INTO <fs_dynwa>.
    gs_col-index = sy-tabix.
    LOOP AT cl_descr->components ASSIGNING <fs_comp>.
      ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_dynwa> TO <fs>.
      gs_col-name = <fs_comp>-name.
      gs_col-value = <fs>.
      APPEND gs_col TO gt_col.
    ENDLOOP.
  ENDLOOP.
*-------------------------------------------------------
*&处理后保存表,修改数据库表
  REFRESH <fs_dyntab>.
  CLEAR <fs_dynwa>.
*处理每个值。
  LOOP AT gt_col INTO gs_col.
    SEARCH gs_col-value FOR '\'.
    IF sy-subrc = 0.
      REPLACE ALL OCCURRENCES OF '\' IN gs_col-value WITH '\\'.
*&列转行
      ASSIGN COMPONENT sy-tabix OF STRUCTURE <fs_dynwa> TO <f3>.
      IF <f3> IS ASSIGNED.
        <f3> = gs_col-value.
      ENDIF.
      AT END OF index.
        APPEND <fs_dynwa> TO <fs_dyntab>.
      ENDAT.
*&------------------------------------
    ENDIF.
    MODIFY gt_col FROM gs_col.
    CLEAR gs_col.
  ENDLOOP.

  MODIFY (p_name) FROM TABLE <fs_dyntab>.
  IF sy-subrc = 0.
    MESSAGE '修改成功!' TYPE 'S'.
    REFRESH <fs_dyntab>.
  ELSE.
    MESSAGE '修改失败!'  TYPE 'E'.
  ENDIF.

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值