ABAP 实现ALV报表列的控制add,delete,save数据

REPORT ztest_12.

TYPE-POOLS:slis.

DATA: lt_ztms0096  TYPE TABLE OF ztms0096,
      lt_data_save TYPE TABLE OF ztms0096,
      ls_ztms0096  TYPE ztms0096.

************************************************************************
*  ALV定义
************************************************************************
DATA: gs_layout_lvc TYPE lvc_s_layo,  "ALV Layout
      gt_fieldcat   TYPE lvc_t_fcat,
      gs_fieldcat   TYPE lvc_s_fcat,
      gt_ddval      TYPE lvc_t_drop,
      gw_ddval      TYPE lvc_s_drop,
      gt_events     TYPE slis_t_event,
      gs_events     TYPE slis_alv_event,
      gs_glay       TYPE lvc_s_glay,
      gr_grid       TYPE REF TO cl_gui_alv_grid.    "ALV Grid

************************************************************************
*  TYPES 声明
************************************************************************
TYPES: BEGIN OF ty_data.
TYPES: check      TYPE check,
       index      TYPE i,
       celltab    TYPE lvc_t_styl,"用于单元格控制
       choose     TYPE char1.
INCLUDE    TYPE  ztms0096.
TYPES: END OF ty_data.

************************************************************************
*  DATA 定义
************************************************************************
DATA: gv_tabix TYPE sy-tabix.
DATA: gt_data TYPE TABLE OF ty_data,
      gs_data TYPE ty_data,
*新增结构处理锁表数据
      gt_lock TYPE TABLE OF ty_data,
      gs_lock TYPE ty_data.

DATA: lv_tabname TYPE char30.
*----------------------------------------------------------------------*
*  START-OF-SELECTION                                                  *
*----------------------------------------------------------------------*
START-OF-SELECTION.

  PERFORM frm_get_db_data.

END-OF-SELECTION.

  PERFORM frm_display_data.
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_DB_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_get_db_data .
  DATA: lt_dd02t TYPE TABLE OF dd02t,
        ls_dd02t TYPE dd02t.

  DATA: lt_dfies TYPE TABLE OF dfies,
        ls_dfies TYPE dfies.

  CLEAR lv_tabname.

  SELECT * FROM ztms0096 INTO CORRESPONDING FIELDS OF TABLE lt_ztms0096 .

  SORT lt_ztms0096[] BY ztabname.

  IF lt_ztms0096[] IS NOT INITIAL.
    SELECT * FROM dd02t INTO TABLE lt_dd02t FOR ALL ENTRIES IN  lt_ztms0096
      WHERE tabname = lt_ztms0096-ztabname
        AND ddlanguage = sy-langu.
  ENDIF.

  SORT lt_dd02t[] BY tabname.

  LOOP AT lt_ztms0096 INTO ls_ztms0096.

    MOVE-CORRESPONDING ls_ztms0096 TO gs_data.

    READ TABLE lt_dd02t INTO ls_dd02t WITH KEY tabname = ls_ztms0096-ztabname.

    IF ls_dd02t IS NOT INITIAL .
      gs_data-ztabms = ls_dd02t-ddtext.
    ENDIF.

    IF lv_tabname NE ls_ztms0096-ztabname.
      CALL FUNCTION 'DDIF_FIELDINFO_GET'
        EXPORTING
          tabname   = ls_ztms0096-ztabname
        TABLES
          dfies_tab = lt_dfies.
    ENDIF.
    lv_tabname = ls_ztms0096-ztabname.
    READ TABLE lt_dfies INTO ls_dfies WITH KEY fieldname = ls_ztms0096-zfieldname.

    gs_data-zfieldms = ls_dfies-scrtext_l.

    APPEND gs_data TO gt_data.

  ENDLOOP.

ENDFORM.                    " FRM_GET_DB_DATA
*&---------------------------------------------------------------------*
*&      Form  FRM_DISPLAY_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_display_data .
  PERFORM frm_init_fieldcat.
  PERFORM frm_init_layout.
  PERFORM frm_creat_dropdown_values.
  PERFORM frm_creat_event_exits.
  PERFORM frm_init_alv.
ENDFORM.                    " FRM_DISPLAY_DATA
*&---------------------------------------------------------------------*
*&      Form  FRM_INIT_FIELDCAT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_init_fieldcat .
  DEFINE app_fc.
    gs_fieldcat-fieldname        = &1."字段名
    gs_fieldcat-ref_table        = &2."参考表
    gs_fieldcat-ref_field        = &3."参考字段
    gs_fieldcat-scrtext_l        = &4."长描述
    gs_fieldcat-no_out           = &5."是否显示列
    gs_fieldcat-edit             = &6."可编辑
    gs_fieldcat-no_zero          = &7."输出是否隐藏0
    gs_fieldcat-just             = ''."对齐方式
    gs_fieldcat-drdn_hndl          = &8."数据类型
    gs_fieldcat-intlen           = &9."字段长度
    append gs_fieldcat to gt_fieldcat.
    clear  gs_fieldcat.
  END-OF-DEFINITION.

* 指定输出结构内容,要与输出表的结构一致
  REFRESH gt_fieldcat.
  app_fc: 'ZTABNAME'   'ZTMS0096' 'ZTABNAME'   '表名'      ''  '' '' '' ''.
  app_fc: 'ZFIELDNAME' 'ZTMS0096' 'ZFIELDNAME'  '字段名'  ''  '' '' '' ''.
  app_fc: 'ZTABMS'     'ZTMS0096' 'ZTABMS'   '表描述'  ''  '' '' '' ''.
  app_fc: 'ZFIELDMS'   'ZTMS0096' 'ZFIELDMS' '字段描述'  ''  '' '' '' ''.
  app_fc: 'ZFMDGTABN'  'ZTMS0096' 'ZFMDGTABN' 'MDG维度代码'  ''  'X' '' '' ''.
  app_fc: 'ZFMDGFIELD' 'ZTMS0096' 'ZFMDGFIELD'  '接口字段名'  ''  'X' '' '' ''.
  app_fc: 'ZFISKEY'    'ZTMS0096' 'ZFISKEY'    '是否关键字'  ''  'X' 'X' '' ''.

ENDFORM.                    " FRM_INIT_FIELDCAT
*&---------------------------------------------------------------------*
*&      Form  FRM_INIT_LAYOUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_init_layout .
  gs_layout_lvc-zebra = 'X'.
  gs_layout_lvc-cwidth_opt = 'X'.
  gs_layout_lvc-box_fname = 'CHOOSE'.
  gs_layout_lvc-stylefname  = 'CELLTAB'.
  gs_glay-edt_cll_cb = 'X'."编辑单元格后,将编辑后的值 返回给程序
ENDFORM.                    " FRM_INIT_LAYOUT
*&---------------------------------------------------------------------*
*&      Form  FRM_INIT_ALV
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_init_alv .

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program       = sy-repid
      i_callback_pf_status_set = 'F_SET_PF_STATUS'
      i_callback_user_command  = 'F_USER_COMMAND'
      is_layout_lvc            = gs_layout_lvc
      it_fieldcat_lvc          = gt_fieldcat
      it_events                = gt_events
      i_grid_settings          = gs_glay
      i_save                   = 'A'
    TABLES
      t_outtab                 = gt_data
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

ENDFORM.                    " FRM_INIT_ALV

*&---------------------------------------------------------------------*
*&      Form  F_SET_PF_STATUS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->EXTAB      text
*----------------------------------------------------------------------*
FORM f_set_pf_status USING  extab TYPE slis_t_extab.

  SET PF-STATUS 'ZZGUI' EXCLUDING extab.

ENDFORM.                    "F_SET_PF_STATUS

*&---------------------------------------------------------------------*
*&      Form  F_USER_COMMAND
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->UCOMM      text
*      -->SELFIELD   text
*----------------------------------------------------------------------*
FORM f_user_command USING u_ucomm    LIKE sy-ucomm
                            u_selfield TYPE slis_selfield.
  DATA: lr_grid TYPE REF TO cl_gui_alv_grid.
  DATA: lt_celltab TYPE lvc_t_styl,
        ls_celltab TYPE lvc_s_styl.
  DATA: it_value    TYPE TABLE OF sval,
        wa_value    TYPE sval,
        lv_rtn_cd,
        lv_filename TYPE string.
* 刷新
  "Get ALV grid
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = lr_grid.
  CALL METHOD lr_grid->check_changed_data.
  u_selfield-refresh = 'X'.

  DATA: lv_line TYPE i.
  u_ucomm = sy-ucomm.
  CASE u_ucomm.
    WHEN '&ADD'.
      REFRESH lt_celltab.
      CLEAR gs_data.
      "设置新增行是否可以编辑
      ls_celltab-fieldname = 'ZTABNAME'.
      ls_celltab-style = cl_gui_alv_grid=>mc_style_enabled. "可编辑
      INSERT ls_celltab INTO TABLE lt_celltab.

      ls_celltab-fieldname = 'ZFIELDNAME'.
      ls_celltab-style = cl_gui_alv_grid=>mc_style_enabled. "可编辑
      INSERT ls_celltab INTO TABLE lt_celltab.

      ls_celltab-fieldname = 'ZTABMS'.
      ls_celltab-style = cl_gui_alv_grid=>mc_style_enabled. "可编辑
      INSERT ls_celltab INTO TABLE lt_celltab.

      ls_celltab-fieldname = 'ZFIELDMS'.
      ls_celltab-style = cl_gui_alv_grid=>mc_style_enabled. "可编辑
      INSERT ls_celltab INTO TABLE lt_celltab.

      CLEAR lv_line.
      DESCRIBE TABLE gt_data LINES lv_line .
      lv_line = lv_line + 1.

      gs_data-index = lv_line.
      CLEAR : gs_data-celltab.  "不为空会报错
      INSERT LINES OF lt_celltab INTO TABLE gs_data-celltab.
      APPEND gs_data TO gt_data.

      SORT gt_data BY index DESCENDING.

    WHEN '&SAVE' OR '&DATA_SAVE'.
      PERFORM frm_save_data.
    WHEN '&DEL'.
      PERFORM frm_del_data.
    WHEN OTHERS.
  ENDCASE.

  u_selfield-refresh = 'X'.
ENDFORM.                    "user_command
*&---------------------------------------------------------------------*
*&      Form  FRM_SAVE_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_save_data .
*  CALL METHOD l_grid->check_changed_data.
**   稳定刷新
*  gt_stbl-row = 'X'." 基于行的稳定刷新
*  gt_stbl-col = 'X'." 基于列稳定刷新
*  CALL METHOD l_grid->refresh_table_display
*    EXPORTING
*      is_stable = gt_stbl.
  DATA: lt_dd02t TYPE TABLE OF dd02t,
        ls_dd02t TYPE dd02t.

  DATA: lt_dfies TYPE TABLE OF dfies,
        ls_dfies TYPE dfies.

  FIELD-SYMBOLS:<fs_data> TYPE ty_data.

  CLEAR lv_tabname.

  IF gt_data[] IS NOT INITIAL.
    SELECT * FROM dd02t INTO TABLE lt_dd02t FOR ALL ENTRIES IN gt_data
      WHERE tabname = gt_data-ztabname
        AND ddlanguage = sy-langu.
  ENDIF.

  SORT lt_dd02t[] BY tabname.

  LOOP AT gt_data ASSIGNING <fs_data>.
    MOVE-CORRESPONDING <fs_data> TO ls_ztms0096.
    IF ls_ztms0096-ztabname IS INITIAL.
      CONTINUE.
    ENDIF.
    ls_ztms0096-zflauname = sy-uname.
    ls_ztms0096-zflcdatum = sy-datum.
    ls_ztms0096-zflactime = sy-uzeit.
    "处理表描述和字段描述
    READ TABLE lt_dd02t INTO ls_dd02t WITH KEY tabname = ls_ztms0096-ztabname.
    IF ls_dd02t IS NOT INITIAL .
      <fs_data>-ztabms     = ls_dd02t-ddtext.
      ls_ztms0096-ztabms = ls_dd02t-ddtext.
    ENDIF.
    IF lv_tabname NE ls_ztms0096-ztabname.
      CALL FUNCTION 'DDIF_FIELDINFO_GET'
        EXPORTING
          tabname   = ls_ztms0096-ztabname
        TABLES
          dfies_tab = lt_dfies.
    ENDIF.
    lv_tabname = ls_ztms0096-ztabname.
    READ TABLE lt_dfies INTO ls_dfies WITH KEY fieldname = ls_ztms0096-zfieldname.
    <fs_data>-zfieldms     = ls_dfies-scrtext_l.
    ls_ztms0096-zfieldms = ls_dfies-scrtext_l.
    APPEND ls_ztms0096 TO lt_data_save.
    CLEAR:ls_ztms0096, gs_data.
  ENDLOOP.

  IF lt_data_save[] IS NOT INITIAL.
    MODIFY ztms0096 FROM TABLE lt_data_save[].
  ENDIF.
  IF sy-subrc EQ 0.
    COMMIT WORK.
    MESSAGE '数据保存成功' TYPE 'S' DISPLAY LIKE 'S'.
  ELSE.
    ROLLBACK WORK.
  ENDIF.
  CLEAR:lt_data_save[].
ENDFORM.                    " FRM_SAVE_DATA
*&---------------------------------------------------------------------*
*&      Form  FRM_CREAT_EVENT_EXITS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_creat_event_exits .
  gs_events-name = 'CALLER_EXIT'.
  gs_events-form = 'CALLER_EXIT'.
  APPEND gs_events TO gt_events.

*  gs_events-name = 'DATA_CHANGED'.
*  gs_events-form = 'ALV_DATA_CHANGED'.
*  APPEND gs_events TO gt_events.
ENDFORM.                    " FRM_CREAT_EVENT_EXITS
*&---------------------------------------------------------------------*
*&      Form  FRM_DEL_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_del_data .
  DATA: lt_data TYPE TABLE OF ztms0096,
        lt_temp TYPE TABLE OF ztms0096,
        ls_data TYPE ztms0096.
  DATA: lt_del  TYPE TABLE OF ty_data,
        ls_del  TYPE ty_data.

  CLEAR:lt_data[],ls_data.
  LOOP AT gt_data INTO gs_data WHERE choose = 'X'.
    MOVE gs_data TO ls_del.
    APPEND ls_del TO lt_del.
    MOVE-CORRESPONDING gs_data TO ls_data.
    APPEND ls_data TO lt_data.
    CLEAR: gs_data,ls_data.
  ENDLOOP.

  IF lt_data[] IS NOT INITIAL.
    SELECT * FROM ztms0096 INTO CORRESPONDING FIELDS OF TABLE lt_temp
      FOR ALL ENTRIES IN lt_data
      WHERE ztabname = lt_data-ztabname
        AND zfieldname = lt_data-zfieldname.

    DELETE ztms0096 FROM TABLE lt_temp[].
    LOOP AT lt_del INTO ls_del.
      DELETE TABLE gt_data FROM ls_del.
    ENDLOOP.
    IF sy-subrc = 0.
      MESSAGE '删除成功' TYPE 'S'.
    ENDIF.
  ELSE.
    DELETE gt_data WHERE choose = 'X'.
  ENDIF.

ENDFORM.                    " FRM_DEL_DATA

*&---------------------------------------------------------------------*
*&      Form  FRM_CREAT_EVENT_EXITS
*&---------------------------------------------------------------------*
*       设置下拉列表,使Grid和内表能链接上
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM caller_exit USING ls_data TYPE slis_data_caller_exit.
  DATA: l_ref_alv TYPE REF TO cl_gui_alv_grid.
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = l_ref_alv.
  CALL METHOD l_ref_alv->set_drop_down_table
    EXPORTING
      it_drop_down = gt_ddval.
ENDFORM.                    "CALLER_EXIT
*&---------------------------------------------------------------------*
*&      Form  FRM_CREAT_DROPDOWN_VALUES
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_creat_dropdown_values .
  "取字段域值
  DATA:lv_return      TYPE sy-subrc,
       i_dom_apstt    TYPE STANDARD TABLE OF dd07v,
       lv_wa_domtab   TYPE dd07v.
  "ZYWLLB
  CLEAR:lv_return,i_dom_apstt[],lv_wa_domtab.
  CALL FUNCTION 'DD_DOMVALUES_GET'
    EXPORTING
      domname        = 'BOOLE'        "域名
      text           = 'X'
      langu          = sy-langu
    IMPORTING
      rc             = lv_return
    TABLES
      dd07v_tab      = i_dom_apstt
    EXCEPTIONS
      wrong_textflag = 1
      OTHERS         = 2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
          WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

  LOOP AT i_dom_apstt INTO lv_wa_domtab ."WHERE DOMVALUE_L.
    CLEAR gw_ddval.
    gw_ddval-handle = 1.
    gw_ddval-value  = lv_wa_domtab-domvalue_l && lv_wa_domtab-ddtext.
    APPEND gw_ddval TO gt_ddval.
  ENDLOOP.
ENDFORM.                    " FRM_CREAT_DROPDOWN_VALUES

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值