一个完整的表维护程序

Report  ZLET015_PG:

 1 *&---------------------------------------------------------------------*
2 *& Report ZLET015_PG
3 *&
4 *&---------------------------------------------------------------------*
5 *& Program Name: ZLET015_PG
6 *& Description: 分公司储运部门对照表
7 *& Function Description: 维护分公司储运部门对照表ZLET015
8 *& Module: MMLE
9 *& Created by: Cai_Zhijian
10 *& Created Date: 2013.11.13
11 *&---------------------------------------------------------------------*
12
13 REPORT zlet015_pg.
14
15 INCLUDE zlet015_pg_class.
16 INCLUDE zlet015_pg_top.
17 INCLUDE zlet015_pg_f01.
18 INCLUDE zlet015_pg_m01.
19
20 *----------------------------------------------------------------------*
21 * INITIALIZATION.
22 *----------------------------------------------------------------------*
23 INITIALIZATION.
24
25 * 获得要维护表的表名,存入g_tabname中
26 descr_ref ?= cl_abap_typedescr=>describe_by_data( gs_db ).
27 db_tab = descr_ref->get_ddic_header( ).
28 g_tabname = db_tab-tabname.
29
30 *----------------------------------------------------------------------*
31 * AT SELECTION-SCREEN OUTPUT
32 *----------------------------------------------------------------------*
33 AT SELECTION-SCREEN OUTPUT.
34
35 * 设置选择画面输出格式
36 PERFORM frm_modify_screen.
37
38 AT SELECTION-SCREEN.
39 * 权限检查
40 PERFORM frm_check_auth.
41
42 *----------------------------------------------------------------------*
43 * START-OF-SELECTION
44 *----------------------------------------------------------------------*
45 START-OF-SELECTION.
46
47 PERFORM prepare_layout CHANGING gs_layout ."设置layout
48 REFRESH gt_fieldcat.
49 PERFORM prepare_field_catalog CHANGING gt_fieldcat ."设置Field Catalog
50 CALL SCREEN ‘0100‘.

View
Code

INCLUDE zlet015_pg_class:

*&---------------------------------------------------------------------*
*& 包括 ZLET015_PG_CLASS
*&---------------------------------------------------------------------*
CLASS lcl_event_receiver DEFINITION.

PUBLIC SECTION.

METHODS:handle_data_changed
FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING er_data_changed.

ENDCLASS. "LCL_EVENT_RECEIVER DEFINITION
*&---------------------------------------------------------------------*
*& CLASS (IMPLEMENTATION) LCL_EVENT_RECEIVER
*&---------------------------------------------------------------------*
* TEXT
*----------------------------------------------------------------------*
CLASS lcl_event_receiver IMPLEMENTATION.

*--DATA_CHANGED
METHOD handle_data_changed.

PERFORM handle_data_changed CHANGING er_data_changed.

ENDMETHOD. "HANDLE_CHANGED_DATA

ENDCLASS. "LCL_EVENT_RECEIVER

INCLUDE zlet015_pg_top:

*&---------------------------------------------------------------------*
*& 包括 ZLET015_PG_TOP
*&---------------------------------------------------------------------*
CONSTANTS:
C_FLG_ON(1) TYPE C VALUE ‘X‘. "FLAG开
*&---------------------------------------------------------------------*
*&表申明
*&---------------------------------------------------------------------*
TABLES:
zlet015. "分公司储运部门对照表

*----------------------------------------------------------------------*
* 全局类型定义
*----------------------------------------------------------------------*
TYPES:
*分公司描述
BEGIN OF t_t001,
bukrs TYPE t001-bukrs ,
butxt TYPE t001-butxt,
END OF t_t001,

*部门描述
BEGIN OF t_zhrtorg,
org_id TYPE zhrtorg-org_id,
org_name TYPE zhrtorg-org_name,
END OF t_zhrtorg.

*----------------------------------------------------------------------*
* 全局内部表定义
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
* 全局变量/工作区定义
*----------------------------------------------------------------------*
DATA: gs_db TYPE zlet015, "维护表的结构
g_tabname(30) TYPE c. "存放维护表的表名

TYPES:t_db LIKE gs_db.

*ALV显示内表结构
DATA: BEGIN OF gs_data_wa.
INCLUDE TYPE t_db.
DATA: butxt TYPE t001-butxt,
org_name TYPE zhrtorg-org_name,
flag(1),
rowmsg(100),
END OF gs_data_wa.

DATA: gt_data LIKE STANDARD TABLE OF gs_data_wa,"ALV数据内表
gt_data_old LIKE STANDARD TABLE OF gs_data_wa.

DATA: ok_code TYPE sy-ucomm,
save_ok TYPE sy-ucomm.

DATA: db_tab type x030l, "存放变量的数据字典头信息
descr_ref TYPE REF TO cl_abap_typedescr. "分析ABAP类型描述的对象

*---------------------------------------------------------------------*
* ALV DATA DECLARATION
*---------------------------------------------------------------------*
DATA: gr_alvgrid TYPE REF TO cl_gui_alv_grid ,"ALV对象
gt_fieldcat TYPE lvc_t_fcat ,
gs_layout TYPE lvc_s_layo ,
gs_variant TYPE disvariant,
alv_container TYPE scrfname VALUE ‘T_COL‘,"ALV展示数据存放在此容器中
alv_custom_container TYPE REF TO cl_gui_custom_container,
gt_exclude TYPE ui_functions,"存放排除按钮的内表
gt_index_rows TYPE lvc_t_row,"用以存放要选择行的内表
gs_index_rows TYPE lvc_s_row."用以存放要选择行的工作区

DATA: gf_valid(1) TYPE c,
gf_error(1) TYPE c.
***带出描述
DATA: g_event_receiver TYPE REF TO lcl_event_receiver.

*----------------------------------------------------------------------*
* SELECTION-SCREEN
*----------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE text-001.

PARAMETERS:
p_insert RADIOBUTTON GROUP z USER-COMMAND f DEFAULT ‘X‘ ,
p_modify RADIOBUTTON GROUP z,
p_disp RADIOBUTTON GROUP z.

SELECTION-SCREEN SKIP.

SELECTION-SCREEN BEGIN OF BLOCK blk2 WITH FRAME TITLE text-002.

SELECT-OPTIONS:
s_bukrs FOR zlet015-bukrs MODIF ID z01 OBLIGATORY,
s_orgty FOR zlet015-ORGID MODIF ID z01.
SELECTION-SCREEN END OF BLOCK blk2.

SELECTION-SCREEN END OF BLOCK blk1.

INCLUDE zlet015_pg_f01:

*&---------------------------------------------------------------------*
*& 包括 ZLET015_PG_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form FRM_MODIFY_SCREEN
*&---------------------------------------------------------------------*
* 设置选择画面输出格式
*----------------------------------------------------------------------*
FORM frm_modify_screen .
LOOP AT SCREEN.
IF p_insert = c_flg_on.
IF screen-group1 = ‘Z01‘.
screen-active = 0.
ENDIF.
ENDIF.

MODIFY SCREEN.
ENDLOOP.

ENDFORM. " FRM_MODIFY_SCREEN
*&---------------------------------------------------------------------*
*& Form PREPARE_LAYOUT
*&---------------------------------------------------------------------*
* 设置Layout
*----------------------------------------------------------------------*
* <--P_GS_LAYOUT text
*----------------------------------------------------------------------*
FORM prepare_layout CHANGING ps_layout TYPE lvc_s_layo.

ps_layout-zebra = ‘X‘ .
ps_layout-smalltitle = ‘X‘ .
ps_layout-no_toolbar = ‘ ‘.
IF p_disp = ‘X‘ OR p_modify = ‘X‘.
ps_layout-no_rowmark = ‘X‘.
ENDIF.
ENDFORM. " PREPARE_LAYOUT
*&---------------------------------------------------------------------*
*& Form PREPARE_FIELD_CATALOG
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* <--P_GT_FIELDCAT text
*----------------------------------------------------------------------*
FORM prepare_field_catalog CHANGING pt_fieldcat TYPE lvc_t_fcat.
DATA: ls_fieldcat TYPE lvc_s_fcat,
l_rows TYPE i.

CALL FUNCTION ‘LVC_FIELDCATALOG_MERGE‘
EXPORTING
i_structure_name = g_tabname "表结构
i_client_never_display = ‘X‘
CHANGING
ct_fieldcat = pt_fieldcat
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

*UserExit,用于自定义Field Catalog
PERFORM userexit_fieldcat CHANGING pt_fieldcat.

ls_fieldcat-fieldname = ‘BUTXT‘.
ls_fieldcat-coltext = ‘公司描述‘.
ls_fieldcat-col_pos = 2.

ls_fieldcat-outputlen = 40.
APPEND ls_fieldcat TO pt_fieldcat .

ls_fieldcat-fieldname = ‘ORG_NAME‘.
ls_fieldcat-coltext = ‘部门描述‘ .
ls_fieldcat-col_pos = 5.
ls_fieldcat-outputlen = 40.
APPEND ls_fieldcat TO pt_fieldcat .

IF p_disp <> ‘X‘. "除了显示模式,其他模式都显示选择列和操作结果列
CLEAR ls_fieldcat .
ls_fieldcat-fieldname = ‘FLAG‘ .
ls_fieldcat-coltext = ‘选择‘ .
ls_fieldcat-edit = ‘X‘.
ls_fieldcat-checkbox = ‘X‘.
ls_fieldcat-key = ‘X‘.
ls_fieldcat-outputlen = ‘6‘.
ls_fieldcat-col_pos = 0.
APPEND ls_fieldcat TO pt_fieldcat .

CLEAR l_rows.
DESCRIBE TABLE pt_fieldcat LINES l_rows.
CLEAR ls_fieldcat .
ls_fieldcat-fieldname = ‘ROWMSG‘ .
ls_fieldcat-coltext = ‘操作结果‘ .
ls_fieldcat-col_pos = l_rows.
ls_fieldcat-outputlen = ‘30‘.
APPEND ls_fieldcat TO pt_fieldcat .
ENDIF.

ENDFORM. " PREPARE_FIELD_CATALOG
*&---------------------------------------------------------------------*
*& Form USEREXIT_FIELDCAT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* <--P_PT_FIELDCAT text
*----------------------------------------------------------------------*
FORM userexit_fieldcat CHANGING pt_fieldcat TYPE lvc_t_fcat.
DATA: ls_fieldcat TYPE lvc_s_fcat.
LOOP AT pt_fieldcat INTO ls_fieldcat.
CASE ls_fieldcat-fieldname.
WHEN ‘BUKRS‘.
ls_fieldcat-coltext = ‘分公司‘ .
ls_fieldcat-col_pos = 1.
ls_fieldcat-outputlen = 8.
WHEN ‘ORGTYPE‘.
ls_fieldcat-coltext = ‘部门类型‘ .
ls_fieldcat-col_pos = 3.
ls_fieldcat-outputlen = 8.
WHEN ‘ORGID‘.
ls_fieldcat-coltext = ‘部门编码‘ .
ls_fieldcat-col_pos = 4.
ls_fieldcat-outputlen = 10.
WHEN ‘LVORM‘.
ls_fieldcat-coltext = ‘删除标记‘ .
ls_fieldcat-col_pos = 6.
ls_fieldcat-outputlen = 8.
WHEN ‘BUNO‘.
ls_fieldcat-coltext = ‘创建人员‘ .
ls_fieldcat-col_pos = 7.
ls_fieldcat-outputlen = 12.
WHEN ‘BUDAT‘.
ls_fieldcat-coltext = ‘创建日期‘ .
ls_fieldcat-col_pos = 8.
ls_fieldcat-outputlen = 8.
WHEN ‘BUTIME‘.
ls_fieldcat-coltext = ‘创建时间‘ .
ls_fieldcat-col_pos = 9.
ls_fieldcat-outputlen = 8.
WHEN ‘UPNO‘.
ls_fieldcat-coltext = ‘修改人员‘ .
ls_fieldcat-col_pos = 10.
ls_fieldcat-outputlen = 12.
WHEN ‘UPDAT‘.
ls_fieldcat-coltext = ‘修改日期‘ .
ls_fieldcat-col_pos = 11.
ls_fieldcat-outputlen = 8.
WHEN ‘UPTIME‘.
ls_fieldcat-coltext = ‘修改时间‘ .
ls_fieldcat-col_pos = 12.
ls_fieldcat-outputlen = 8.
ENDCASE.
IF p_insert = ‘X‘.
IF ls_fieldcat-fieldname = ‘BUKRS‘ OR
ls_fieldcat-fieldname = ‘ORGTYPE‘ OR
ls_fieldcat-fieldname = ‘ORGID‘.
ls_fieldcat-edit = ‘X‘.
ENDIF.

" IF ls_fieldcat-fieldname = ‘LVORM‘.
" ls_fieldcat-no_out = c_flg_on.
" ENDIF.

ELSEIF p_modify = ‘X‘.
IF ls_fieldcat-fieldname = ‘ORGID‘ OR
ls_fieldcat-fieldname = ‘LVORM‘.
ls_fieldcat-edit = ‘X‘.
ENDIF.
ENDIF.

MODIFY pt_fieldcat FROM ls_fieldcat.
ENDLOOP.

ENDFORM. " USEREXIT_FIELDCAT
*&---------------------------------------------------------------------*
*& Form LOAD_DATA_INTO_GRID
*&---------------------------------------------------------------------*
FORM load_data_into_grid .

CASE ‘X‘.
WHEN p_insert.
SET TITLEBAR ‘101‘.
PERFORM userexit_select_data_insert CHANGING gt_data.
WHEN p_modify.
SET TITLEBAR ‘103‘.
PERFORM userexit_select_data_modify CHANGING gt_data.
WHEN p_disp.
SET TITLEBAR ‘104‘.
PERFORM userexit_select_data_display CHANGING gt_data.
WHEN OTHERS.
ENDCASE.

ENDFORM. " LOAD_DATA_INTO_GRID
*&---------------------------------------------------------------------*
*& Form USEREXIT_SELECT_DATA_INSERT
*&---------------------------------------------------------------------*
FORM userexit_select_data_insert CHANGING pt_data LIKE gt_data.

APPEND gs_data_wa TO gt_data.
CLEAR gs_data_wa.

ENDFORM. " USEREXIT_SELECT_DATA_INSERT
*&---------------------------------------------------------------------*
*& Form USEREXIT_SELECT_DATA_MODIFY
*&---------------------------------------------------------------------*
FORM userexit_select_data_modify CHANGING pt_data LIKE gt_data.

SELECT * FROM zlet015 INTO CORRESPONDING FIELDS OF TABLE pt_data
WHERE bukrs IN s_bukrs
AND orgtype IN s_orgty.

SORT pt_data.
DELETE ADJACENT DUPLICATES FROM pt_data COMPARING ALL FIELDS.
PERFORM frm_get_name.

gt_data_old = gt_data.

ENDFORM. " USEREXIT_SELECT_DATA_MODIFY
*&---------------------------------------------------------------------*
*& Form USEREXIT_SELECT_DATA_DISPLAY
*&---------------------------------------------------------------------*
FORM userexit_select_data_display CHANGING pt_data LIKE gt_data.

SELECT * FROM zlet015 INTO CORRESPONDING FIELDS OF TABLE pt_data
WHERE bukrs IN s_bukrs
AND orgtype IN s_orgty.

IF sy-subrc = 0.

SORT pt_data.
DELETE ADJACENT DUPLICATES FROM pt_data COMPARING ALL FIELDS.
PERFORM frm_get_name.

ENDIF.

ENDFORM. " USEREXIT_SELECT_DATA_DISPLAY
*&---------------------------------------------------------------------*
*& Form DISPLAY_ALV
*&---------------------------------------------------------------------*
FORM display_alv .

***排除不要的按钮
PERFORM exclude_tb_functions USING gt_exclude.

***展示数据
CALL METHOD gr_alvgrid->set_table_for_first_display
EXPORTING
is_variant = gs_variant
i_save = ‘A‘
is_layout = gs_layout
it_toolbar_excluding = gt_exclude
CHANGING
it_outtab = gt_data
it_fieldcatalog = gt_fieldcat
EXCEPTIONS
invalid_parameter_combination = 1
program_error = 2
too_many_lines = 3
OTHERS = 4.

ENDFORM. " DISPLAY_ALV
*&---------------------------------------------------------------------*
*& Form EXCLUDE_TB_FUNCTIONS
*&---------------------------------------------------------------------*
* 排除不必要的按钮
*----------------------------------------------------------------------*
* -->P_GT_EXCLUDE text
*----------------------------------------------------------------------*
FORM exclude_tb_functions CHANGING pt_exclude TYPE ui_functions.

DATA ls_exclude TYPE ui_func.
ls_exclude = cl_gui_alv_grid=>mc_fc_current_variant.
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_save_variant.
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_average.
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_load_variant.
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_minimum.
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_maximum.
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_maintain_variant.
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_views.
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_graph.
APPEND ls_exclude TO pt_exclude.
* ls_exclude = cl_gui_alv_grid=>mc_fc_sum.
* APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_subtot.
APPEND ls_exclude TO pt_exclude.
* ls_exclude = cl_gui_alv_grid=>mc_fc_filter.
* APPEND ls_exclude TO pt_exclude.
* ls_exclude = cl_gui_alv_grid=>mc_fc_sort_dsc.
* APPEND ls_exclude TO pt_exclude.
* ls_exclude = cl_gui_alv_grid=>mc_fc_sort_asc.
* APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_check.
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_detail.
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_refresh.
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_delete_row.
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_move_row.
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_cut.
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_paste.
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_undo.
APPEND ls_exclude TO pt_exclude.

IF p_insert <> ‘X‘ .

ls_exclude = cl_gui_alv_grid=>mc_fc_loc_paste_new_row.
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_paste_new_row.
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy.
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_append_row.
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy_row.
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_insert_row.
APPEND ls_exclude TO pt_exclude.

ELSE.

ls_exclude = cl_gui_alv_grid=>mc_fc_loc_paste_new_row.
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_paste_new_row.
APPEND ls_exclude TO pt_exclude.
* ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy.
* APPEND ls_exclude TO pt_exclude.
* ls_exclude = cl_gui_alv_grid=>mc_fc_loc_append_row.
* APPEND ls_exclude TO pt_exclude.
* ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy_row.
* APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_insert_row.
APPEND ls_exclude TO pt_exclude.
ENDIF.

ENDFORM. " EXCLUDE_TB_FUNCTIONS
*&---------------------------------------------------------------------*
*& Form INSERT_DATA
*&---------------------------------------------------------------------*
FORM insert_data .

DATA: l_isucc TYPE i VALUE 0,"成功操作的记录
l_iserror TYPE c, "行信息错误指示
l_tabix LIKE sy-tabix. "行号

REFRESH gt_index_rows. " 用以存放要选择行的内表
LOOP AT gt_data INTO gs_data_wa WHERE flag = ‘X‘.

l_tabix = sy-tabix.

*验证行数据正确性、手工添加部分信息
PERFORM userexit_check_row_data CHANGING gs_data_wa
l_iserror
gs_data_wa-rowmsg.

IF l_iserror = ‘X‘."判断行信息是否有错误
CLEAR gs_index_rows.
gs_index_rows-index = l_tabix.
APPEND gs_index_rows TO gt_index_rows. "有错误则把当前行号存入GT_index_Rows,用来选择错误行

ELSE.

*验证行数据在数据库中是否存在
PERFORM userexit_check_data_row_exist USING gs_data_wa
CHANGING l_iserror
gs_data_wa-rowmsg.

IF l_iserror = ‘X‘."存在则把当前行号存入GT_index_Rows,用来选择错误行

CLEAR gs_index_rows.
gs_index_rows-index = l_tabix.
APPEND gs_index_rows TO gt_index_rows.

ELSE.
gs_data_wa-buno = sy-uname. "创建者
gs_data_wa-budat = sy-datum. "创建日期
gs_data_wa-butime = sy-uzeit. "创建时间
MOVE-CORRESPONDING gs_data_wa TO gs_db.
INSERT (g_tabname) FROM gs_db.
COMMIT WORK AND WAIT.
gs_data_wa-rowmsg = text-003. "插入成功
l_isucc = l_isucc + 1.
ENDIF.
ENDIF.
MODIFY gt_data FROM gs_data_wa."更新操作结果信息
CLEAR:gs_data_wa.
ENDLOOP.

PERFORM display_message USING l_isucc gt_index_rows ‘添加‘."显示操作成功信息,并判断是否有非法数据

ENDFORM. " INSERT_DATA
*&---------------------------------------------------------------------*
*& Form USEREXIT_CHECK_ROW_DATA
*&---------------------------------------------------------------------*
FORM userexit_check_row_data CHANGING p_datarow LIKE gs_data_wa
pf_error TYPE c
p_errmsg TYPE any.

DATA: l_bukrs TYPE t001-bukrs,
l_level9 TYPE zhrtorg-level9.

CLEAR: pf_error, p_errmsg.
DATA l_db_wa TYPE t_db.
MOVE-CORRESPONDING p_datarow TO l_db_wa.

"IF p_insert = ‘X‘.

IF l_db_wa-bukrs IS INITIAL OR
l_db_wa-orgtype IS INITIAL OR
l_db_wa-orgid IS INITIAL .

p_errmsg = ‘数据不完整‘.
pf_error = ‘X‘.
RETURN.
ENDIF.

* 检查分公司是否存在

SELECT SINGLE bukrs INTO l_bukrs FROM t001
WHERE bukrs = l_db_wa-bukrs.

IF sy-subrc <> 0.
p_errmsg = ‘分公司不存在‘.
pf_error = ‘X‘.
RETURN.
ENDIF.

SELECT SINGLE level9 INTO l_level9 FROM zhrtorg
WHERE level9 = l_db_wa-orgid
AND effective_ate = sy-datum.

IF sy-subrc <> 0.
p_errmsg = ‘部门不存在或未生效‘.
pf_error = ‘X‘.
RETURN.
ENDIF.

"ENDIF.

ENDFORM. " USEREXIT_CHECK_ROW_DATA
*&---------------------------------------------------------------------*
*& Form USEREXIT_CHECK_DATA_ROW_EXIST
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_GS_DATA_WA text
* <--P_L_ISERROR text
* <--P_GS_DATA_WA_ROWMSG text
*----------------------------------------------------------------------*
FORM userexit_check_data_row_exist USING p_datarow LIKE gs_data_wa
CHANGING pf_error TYPE c
p_errmsg TYPE c.
CLEAR: pf_error, p_errmsg.
DATA l_db_wa TYPE t_db.

SELECT SINGLE * FROM (g_tabname)
INTO l_db_wa
WHERE bukrs = p_datarow-bukrs
AND orgtype = p_datarow-orgtype
AND orgid = p_datarow-orgid.

IF sy-subrc = 0.
pf_error = ‘X‘.
p_errmsg = ‘数据已经存在‘.
ENDIF.

ENDFORM. " USEREXIT_CHECK_DATA_ROW_EXIST
*&---------------------------------------------------------------------*
*& Form DISPLAY_MESSAGE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_L_ISUCC text
* -->P_GT_INDEX_ROWS text
* -->P_0849 text
*----------------------------------------------------------------------*
FORM display_message USING p_succ TYPE i
pt_index_rows TYPE lvc_t_row
p_type TYPE c.

DATA: l_succ TYPE string,
l_rows_i TYPE i,
l_rows(10) TYPE c,
l_msg(70) TYPE c.

l_succ = p_succ.
DESCRIBE TABLE pt_index_rows LINES l_rows_i."统计错误行数

IF l_rows_i IS INITIAL.
CONCATENATE ‘成功‘ p_type ‘了‘ l_succ ‘条记录‘ INTO l_msg.
ELSE.
l_rows = l_rows_i.
CONCATENATE ‘成功‘ p_type ‘了‘ l_succ ‘条记录,高亮行数据不正确‘ INTO l_msg.
gf_error = ‘X‘."设置信息表示有错误行
ENDIF.

MESSAGE l_msg TYPE ‘S‘.

ENDFORM. " DISPLAY_MESSAGE
*&---------------------------------------------------------------------*
*& Form MODIFY_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM modify_data .

DATA:
l_isucc TYPE i VALUE 0,"成功操作的条数
l_iserror TYPE c,"行信息错误指示
l_tabix LIKE sy-tabix,"行号
ls_data_old LIKE gs_data_wa,"原数据表工作取
l_isequal TYPE c."原行与新行主键相同指示

LOOP AT gt_data INTO gs_data_wa WHERE flag = ‘X‘.
CLEAR gs_db.
l_tabix = sy-tabix.

*验证行数据正确性、手工添加部分信息
PERFORM userexit_check_row_data CHANGING gs_data_wa
l_iserror
gs_data_wa-rowmsg.

IF l_iserror = ‘X‘."判断行信息是否有错误

CLEAR gs_index_rows.
gs_index_rows-index = l_tabix.
APPEND gs_index_rows TO gt_index_rows."有错误则把当前行号存入GT_index_Rows,用来选择错误行

ELSE.

READ TABLE gt_data_old INDEX l_tabix INTO ls_data_old.

PERFORM userexit_compare_datab_equal USING gs_data_wa
ls_data_old
CHANGING l_isequal.

IF l_isequal = ‘X‘."
CLEAR gs_index_rows.
gs_index_rows-index = l_tabix.
gs_data_wa-rowmsg = ‘数据已经存在‘.
APPEND gs_index_rows TO gt_index_rows."有错误则把当前行号存入GT_index_Rows,用来选择错误行

ELSE.
CLEAR gs_db.
gs_data_wa-upno = sy-uname.
gs_data_wa-updat = sy-datum.
gs_data_wa-uptime = sy-uzeit.
MOVE-CORRESPONDING gs_data_wa TO gs_db.
MODIFY (g_tabname) FROM gs_db.
l_isucc = l_isucc + 1.
gs_data_wa-rowmsg = text-004.
COMMIT WORK AND WAIT."提交数据库操作
MODIFY gt_data_old FROM gs_data_wa INDEX l_tabix."把新表数据放入gt_data_old中
ENDIF.
ENDIF.
MODIFY gt_data FROM gs_data_wa.

ENDLOOP.

PERFORM display_message USING l_isucc gt_index_rows ‘修改‘.
CLEAR:gs_data_wa.

ENDFORM. " MODIFY_DATA
*&---------------------------------------------------------------------*
*& Form USEREXIT_COMPARE_DATAB_EQUAL
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_GS_DATA_WA text
* -->P_LS_DATA_OLD text
* <--P_L_ISEQUAL text
*----------------------------------------------------------------------*
FORM userexit_compare_datab_equal USING ps_datarow1 LIKE gs_data_wa
ps_datarow2 LIKE gs_data_wa
CHANGING isequal TYPE c.

CLEAR: isequal.

IF ps_datarow1-bukrs = ps_datarow2-bukrs
AND ps_datarow1-orgtype = ps_datarow2-orgtype
AND ps_datarow1-orgid = ps_datarow2-orgid
AND ps_datarow1-lvorm = ps_datarow2-lvorm.

isequal = ‘X‘.

ENDIF.

ENDFORM. " USEREXIT_COMPARE_DATAB_EQUAL
*&---------------------------------------------------------------------*
*& Form HANDLE_DATA_CHANGED
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* <--P_ER_DATA_CHANGED text
*----------------------------------------------------------------------*
FORM handle_data_changed USING ir_data_changed
TYPE REF TO cl_alv_changed_data_protocol.
DATA: ls_mod_cell TYPE lvc_s_modi,
lv_value TYPE lvc_value,
l_name1 TYPE t001-butxt,
l_name2 TYPE zhrtorg-org_name.

LOOP AT ir_data_changed->mt_mod_cells
INTO ls_mod_cell.

***得到分公司描述
IF ls_mod_cell-fieldname = ‘BUKRS‘.
CALL METHOD ir_data_changed->get_cell_value
EXPORTING
i_row_id = ls_mod_cell-row_id
i_fieldname = ‘BUKRS‘
IMPORTING
e_value = lv_value.

IF lv_value IS NOT INITIAL.

SELECT SINGLE butxt
INTO l_name1
FROM t001
WHERE bukrs = lv_value.

CALL METHOD ir_data_changed->modify_cell
EXPORTING
i_row_id = ls_mod_cell-row_id
i_fieldname = ‘BUTXT‘
i_value = l_name1.
ELSE.
CALL METHOD ir_data_changed->modify_cell
EXPORTING
i_row_id = ls_mod_cell-row_id
i_fieldname = ‘BUTXT‘
i_value = ‘‘.
ENDIF.
ENDIF.

***得到部门描述
IF ls_mod_cell-fieldname = ‘ORGID‘.
CALL METHOD ir_data_changed->get_cell_value
EXPORTING
i_row_id = ls_mod_cell-row_id
i_fieldname = ‘ORGID‘
IMPORTING
e_value = lv_value.

IF lv_value IS NOT INITIAL.

SELECT SINGLE org_name
INTO l_name2
FROM zhrtorg
WHERE org_id = lv_value
AND effective_ate = sy-datum.

CALL METHOD ir_data_changed->modify_cell
EXPORTING
i_row_id = ls_mod_cell-row_id
i_fieldname = ‘ORG_NAME‘
i_value = l_name2.

ELSE.

CALL METHOD ir_data_changed->modify_cell
EXPORTING
i_row_id = ls_mod_cell-row_id
i_fieldname = ‘ORG_NAME‘
i_value = ‘‘.

ENDIF.
ENDIF.

CLEAR lv_value.
ENDLOOP.

ENDFORM. " HANDLE_DATA_CHANGED
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_AUTH
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_check_auth .

CASE c_flg_on.
WHEN p_insert.
AUTHORITY-CHECK OBJECT ‘ZMM_AUTH1‘
ID ‘ACTVT‘ FIELD ‘01‘.

IF sy-subrc <> 0 .

MESSAGE text-m01 TYPE ‘E‘.

ENDIF.

WHEN p_modify.
AUTHORITY-CHECK OBJECT ‘ZMM_AUTH1‘
ID ‘ACTVT‘ FIELD ‘02‘.

IF sy-subrc <> 0 .

MESSAGE text-m02 TYPE ‘E‘.

ENDIF.

WHEN p_disp.
AUTHORITY-CHECK OBJECT ‘ZMM_AUTH1‘
ID ‘ACTVT‘ FIELD ‘03‘.

ENDCASE.

IF sy-subrc <> 0 .

MESSAGE text-m03 TYPE ‘E‘.

ENDIF.

ENDFORM. " FRM_CHECK_AUTH
*&---------------------------------------------------------------------*
*& Form FRM_GET_NAME
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_get_name .

DATA:lt_t001w TYPE TABLE OF t_t001, "分公司描述
ls_t001w TYPE t_t001,

lt_zhrtorg TYPE TABLE OF t_zhrtorg, "部门描述
ls_zhrtorg TYPE t_zhrtorg,
ls_data LIKE LINE OF gt_data.

IF gt_data IS NOT INITIAL.

SELECT bukrs butxt
FROM t001
INTO TABLE lt_t001w
FOR ALL ENTRIES IN gt_data
WHERE bukrs = gt_data-bukrs.

SELECT org_id org_name
INTO TABLE lt_zhrtorg
FROM zhrtorg
FOR ALL ENTRIES IN gt_data
WHERE org_id = gt_data-orgid
AND effective_ate = sy-datum.

SORT:lt_t001w,lt_zhrtorg.
CLEAR:ls_data .

LOOP AT gt_data INTO ls_data.
READ TABLE lt_t001w INTO ls_t001w
WITH KEY bukrs = ls_data-bukrs.

IF sy-subrc = 0.
ls_data-butxt = ls_t001w-butxt.
ENDIF.

READ TABLE lt_zhrtorg INTO ls_zhrtorg
WITH KEY org_id = ls_data-orgid.

IF sy-subrc = 0.
ls_data-org_name = ls_zhrtorg-org_name.
ENDIF.

MODIFY gt_data FROM ls_data TRANSPORTING butxt org_name.

CLEAR:ls_data,ls_zhrtorg,ls_t001w.

ENDLOOP.

ENDIF.

ENDFORM. " FRM_GET_NAME

INCLUDE zlet015_pg_m01:

*&---------------------------------------------------------------------*
*& 包括 ZLET015_PG_M01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
SET PF-STATUS ‘MAIN100‘.
gs_variant-report = sy-repid.

IF gr_alvgrid IS INITIAL.
CREATE OBJECT gr_alvgrid "第一次载入,建立对象
EXPORTING
i_parent = cl_gui_container=>screen0.
***建立对象 带出描述
CREATE OBJECT alv_custom_container
EXPORTING
container_name = alv_container.

PERFORM load_data_into_grid.

PERFORM display_alv .

CALL METHOD gr_alvgrid->refresh_table_display.

CALL METHOD gr_alvgrid->set_ready_for_input
EXPORTING
i_ready_for_input = 1.

***带出描述
CREATE OBJECT g_event_receiver.
SET HANDLER g_event_receiver->handle_data_changed FOR gr_alvgrid.

***带出描述
CALL METHOD gr_alvgrid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_modified.

ELSE.

CALL METHOD gr_alvgrid->refresh_table_display.

IF gf_error IS NOT INITIAL. "判断修改后是否有不合法数据,有则选中错误行

CALL METHOD gr_alvgrid->set_selected_rows
EXPORTING
it_index_rows = gt_index_rows.
CLEAR gf_error.

REFRESH gt_index_rows.
ENDIF.

ENDIF.

ENDMODULE. " STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.

save_ok = ok_code.

CLEAR: ok_code,gf_valid.

CASE save_ok.
WHEN ‘SAVE‘. "按SAVE 按钮后,提交操作.

CALL METHOD gr_alvgrid->check_changed_data
IMPORTING
e_valid = gf_valid. "数据合法性标识,有非法数据则不进行操作

IF gf_valid = ‘X‘.

IF p_insert = ‘X‘.
PERFORM insert_data.
ELSEIF p_modify = ‘X‘.
PERFORM modify_data.
ENDIF.
ENDIF.
WHEN ‘BACK‘.
SET SCREEN 0 . "按返回 按钮,返回选择屏幕
WHEN ‘EXIT‘.
LEAVE PROGRAM. "退出程序
WHEN ‘ALL‘. "按全选按钮,检查数据完整性和数据修改,并全选

CALL METHOD gr_alvgrid->check_changed_data
IMPORTING
e_valid = gf_valid.

LOOP AT gt_data INTO gs_data_wa.
gs_data_wa-flag = ‘X‘.
MODIFY gt_data FROM gs_data_wa TRANSPORTING flag
WHERE flag = ‘‘.
ENDLOOP.

WHEN ‘DESELALL‘. "按取消全选按钮,检查数据完整性和数据修改,并取消全选

CALL METHOD gr_alvgrid->check_changed_data
IMPORTING
e_valid = gf_valid.

LOOP AT gt_data INTO gs_data_wa.
gs_data_wa-flag = ‘‘.
MODIFY gt_data FROM gs_data_wa TRANSPORTING flag
WHERE flag = ‘X‘.
ENDLOOP.
WHEN OTHERS.

CALL METHOD gr_alvgrid->check_changed_data
IMPORTING
e_valid = gf_valid.
ENDCASE.

ENDMODULE. " USER_COMMAND_0100 INPUT

一个完整的表维护程序

时间: 2024-10-03 22:08:06

一个完整的表维护程序的相关文章

在MySQL数据库中创建一个完整的表

1.登陆成功后,首先进入某一个数据库 (不是指数据库服务器) use t1; //t1是数据库名 如图所示: 2.在此数据库中建立数据库表 2.1 先建立表结构(可以理解为表的列名,也就是字段名)在实际生产过程中,表结构是需要经过精心设计的. 通用的语法格式为: 1 CREATE TABLE table_name (column_name column_type); 举例如下: 1 create table tb3( 2 id smallint unsigned auto_increment p

一个完整顺序表的实现

[linearlist.h]: 1 #include<iostream> 2 using namespace std; 3 template <class T> 4 class Linearlist 5 { 6 public: 7 virtual bool IsEmpty() const = 0; 8 virtual int Length() const = 0; 9 virtual bool Find(int i, T& x)const = 0; 10 virtual i

JavaScript网站设计实践(七)编写最后一个页面 改进表单

原文:JavaScript网站设计实践(七)编写最后一个页面 改进表单 一.最后一个页面 contact.html.改进表单 在该页面实现的功能: 几乎所有的网站都会有表单填写,对于用户输入和填写的数据,首先我们一般现在前台验证,然后再去后台验证. 在前台最简单的验证:检查必填字段是否填写.填写格式是否符合要求等. 每个表单里面,当获取到输入焦点时,令提示文本消失 现在开始动手来写. 1.实现思路 (1)在这个表单里会验证的是必填字段和邮箱格式是否正确.首先,把判断必填字段和邮箱格式分别写在两个

iOS开发实践:一个完整微博客户端的实现

本文基于数据字典和数据流图两种工具讲述一个完整微博客户端的实现.数据字典和数据流图都可以用来表达线程的执行流程,同时定义了需要的类,是进一步设计类的基础. 数据字典实际上是一张表,表的第一个字段是程序代码中的标识符,其它字段具体描述它在线程中被如何使用,以及它所依赖的其它元素,数据字典中各个标识符基本上也是按照线程的执行流程来排序. 数据流图是一个平面拓扑结构,每个节点或者是外部数据,或者是可被线程执行的代码模块.从外部数据到代码模块的边意味着线程在执行代码模块的时候需要用到外部数据,从代码模块

深入剖析一个完整的事务

oracle029 深入剖析一个完整的事务 2.图解一个事务的操作流程 Undo段的组成:段头.回滚块 事务ID:oracle为每个事务分配事务id select xid,xidusn,xidslot,xidsqn,ubablk,ubafil from v$transaction;// lists the active transactions in the system. null null null null null null insert into t values(1,'zhangsa

[转]一个完整的Installshield安装程序实例

Installshield安装程序实例—基本设置一 前言 Installshield可以说是最好的做安装程序的商业软件之一,不过因为功能的太过于强大,以至于上手和精通都不是容易的事情,之前都是用Installshield的Project Assistant对付过去的,这次做这个安装程序,为了实现一些功能,必须写代码,国内外现成的资料很少,而且很多都语焉不详,自己反复啃了多次,对比Installshiel自带的help,才明白资料所表达的意思.这个安装程序虽然比较简陋,在行家眼里可能是小菜一碟,但

新建表维护程序SM30

1.先新建一个客制表 2.创建一个函数组 3.SE11中该表->实用程序->表维护生成器->权限组填写&NC& ->  函数组填写刚才创建的函数组->维护类型为一步->概述屏幕101->点击查找屏幕号旁边的创建按钮就OK了 这边说明一下:表维护的实质是自动生成维护页面并存放到函数组中的,所以维护类型选择'一步'即可.概述屏幕字段设置成101是因为1000-1010为SAP保留的屏幕号,并且同一个函数组中有多个屏幕号时不能重复. 如图: 4.事物代码

浅谈DevExpress&lt;二&gt;:设计一个完整界面(1)

昨天谈了界面的换肤问题,今天拿一个简单的界面来介绍一下怎么设计一个五脏俱全的界面,总体效果如下图(种类的图片随便找的^^): 创建一个winform项目,在上面拉进去一个bar管理器和图片列表: 在菜单栏.工具栏和状态栏中,分别加入菜单.编辑栏.按钮和静态文本: 菜单栏改名并设置好图片: 然后改工具栏项的属性,拿第一个举个例子,后面的大同小异,选择EditItem后先将其PaintStyle属性改为CapationGlyph,然后找到Edit,选择CheckEdit,就会变成下面的样子: 依法炮

一个完整的Installshield安装程序实例—艾泽拉斯之海洋女神出品(三) --高级设置一

原文:一个完整的Installshield安装程序实例-艾泽拉斯之海洋女神出品(三) --高级设置一 上一篇:一个完整的安装程序实例—艾泽拉斯之海洋女神出品(二) --基本设置二 第二部分:脚本编程 在开始进行编程前,我们先明确一下我们要用编程来弥补前面设置的哪些功能的不足 1. 显示软件许可协议 2. 判断是否安装了本软件所需要的先决软件JKD1.6.0_04,如无,则启动外部安装程序进行安装(同样原理可以用来判断是否安装了其他软件,只要该软件在注册表中有键值) 3. 用户的输入信息.所选安装