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
ABAP 实现ALV报表列的控制add,delete,save数据
最新推荐文章于 2024-02-02 17:21:06 发布