表数据修改

DATA: lt_dntab  TYPE TABLE OF dntab,
      ls_config TYPE zabapt_enh_conf.
DATA  gv_tabnam     TYPE tabname.
DATA: dyn_table TYPE REF TO data,
      dyn_wa    TYPE REF TO data.
DATA cursor TYPE cursor.
DELETE FROM (gt_config-yl4).

* 创建动态内表结构
CREATE DATA dyn_table TYPE TABLE OF (gv_tabnam).

* 创建动态内表
ASSIGN dyn_table->* TO <dyn_table>.

* 创建动态工作区结构
CREATE DATA dyn_wa LIKE LINE OF <dyn_table>.

* 创建动态工作区
ASSIGN dyn_wa->* TO <dyn_wa>.

* 获取表对应的字段
CALL FUNCTION 'NAMETAB_GET'
  EXPORTING
    langu               = sy-langu
    tabname             = gv_tabnam
  TABLES
    nametab             = lt_dntab
  EXCEPTIONS
    internal_error      = 1
    table_has_no_fields = 2
    table_not_activ     = 3
    no_texts_found      = 4
    OTHERS              = 5.

* 从表里获取数据
OPEN CURSOR WITH HOLD cursor FOR
SELECT *
FROM (gv_tabnam).

DO.
  FETCH NEXT CURSOR cursor INTO TABLE <dyn_table> PACKAGE SIZE gv_package.
  IF sy-subrc = 0.
    "数据分包处理
    IF gv_backup = 'X'.
      PERFORM frm_backup_data TABLES lt_dntab."备份原表数据
    ELSE.
      PERFORM frm_process_data TABLES lt_dntab."替换数据
    ENDIF.
  ELSE.
    CLOSE CURSOR cursor.
    EXIT.
  ENDIF.
ENDDO.

*&---------------------------------------------------------------------*
*&      Form  frm_backup_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->LT_DNTAB   text
*----------------------------------------------------------------------*
FORM frm_backup_data  TABLES   lt_dntab STRUCTURE dntab.
  DATA: ls_config TYPE zabapt_enh_conf.

* 备份原表数据
  READ TABLE gt_config INTO ls_config WITH KEY yl1 = gv_tabnam.
  IF  sy-subrc = 0 .
    IF gv_backup = 'X' AND ls_config-yl4 IS NOT INITIAL .
      MODIFY (ls_config-yl4) FROM TABLE <dyn_table>.
      IF sy-subrc = 0.
        EXEC SQL.
          COMMIT
        ENDEXEC.
      ENDIF.
    ENDIF.
  ENDIF.
ENDFORM.                    " FRM_BACKUP_DATA
*&---------------------------------------------------------------------*
*&      Form  frm_process_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->LT_DNTAB   text
*----------------------------------------------------------------------*
FORM frm_process_data TABLES lt_dntab STRUCTURE dntab.

  FIELD-SYMBOLS:<ambigous> TYPE ANY.
  FIELD-SYMBOLS:<1j> TYPE ANY.
  DATA: ls_config TYPE zabapt_enh_conf,
        ls_dntab  TYPE dntab,
        lv_mark   TYPE c.

* 渠道字段为主健的时候,需要先删除原数据
  READ TABLE gt_config INTO ls_config WITH KEY yl1 = gv_tabnam.
  IF sy-subrc = 0.
    READ TABLE lt_dntab INTO ls_dntab WITH KEY fieldname = ls_config-yl2.
    IF sy-subrc = 0.
      IF ls_dntab-keyflag = 'X'.
        DELETE (gv_tabnam) FROM TABLE <dyn_table>.
      ENDIF.
    ENDIF.
  ENDIF.

* 对配置表中的需要处理的字段进行备份和替换
  LOOP AT <dyn_table> ASSIGNING <dyn_wa>.
    READ TABLE gt_config INTO ls_config WITH KEY yl1 = gv_tabnam.
    CHECK sy-subrc = 0.

    ASSIGN COMPONENT ls_config-yl3 OF STRUCTURE <dyn_wa> TO <1j>."2级
    IF sy-subrc = 0 .
      <1j> = <ambigous>+0(1).
    ENDIF.
  ENDIF.

ENDLOOP.

IF <dyn_table>[] IS NOT INITIAL AND gv_test IS INITIAL.
  MODIFY (gv_tabnam) FROM TABLE <dyn_table>.
  IF sy-subrc = 0.
    EXEC SQL.
      COMMIT
    ENDEXEC.
  ENDIF.
ENDIF.

ENDFORM.                    " FRM_PROCESS_DATA

 

posted @ 2024-03-28 10:02  蜡哲图  阅读(6)  评论(0编辑  收藏  举报
目录内容