用dialog创建一个可修改表
生活随笔
收集整理的这篇文章主要介绍了
用dialog创建一个可修改表
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
用dialog制作一个表,可删除添加修改行项目,并可支持从本地批量上传数据。
DATA: BEGIN OF gt_tab OCCURS 0,
flag .
INCLUDE STRUCTURE ztext1.
DATA: END OF gt_tab.
DATA: t_tab LIKE TABLE OF ztext1 WITH HEADER LINE,
wa_itab LIKE gt_tab.
DATA: g_edit TYPE c VALUE '0'.
DATA: ok_code LIKE sy-ucomm,
save_ok LIKE sy-ucomm.
*&SPWIZARD: DECLARATION OF TABLECONTROL 'DDTEST' ITSELF
CONTROLS: ddtest TYPE TABLEVIEW USING SCREEN 0101.
START-OF-SELECTION.
PERFORM get_data.
PERFORM call_screen.
*&---------------------------------------------------------------------*
*& Form GET_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_data .
SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_tab
FROM ztext1.
ENDFORM. " GET_DATA
*&---------------------------------------------------------------------*
*& Form CALL_SCREEN
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM call_screen .
CALL SCREEN 0101.
ENDFORM. " CALL_SCREEN
*&SPWIZARD: OUTPUT MODULE FOR TC 'DDTEST'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: UPDATE LINES FOR EQUIVALENT SCROLLBAR
MODULE ddtest_change_tc_attr OUTPUT.
DESCRIBE TABLE gt_tab LINES ddtest-lines.
ENDMODULE. "DDTEST_CHANGE_TC_ATTR OUTPUT
*&SPWIZARD: INPUT MODUL FOR TC 'DDTEST'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: MARK TABLE
MODULE ddtest_mark INPUT.
DATA: g_ddtest_wa2 LIKE LINE OF gt_tab.
IF ddtest-line_sel_mode = 1
AND gt_tab-flag = 'X'.
LOOP AT gt_tab INTO g_ddtest_wa2
WHERE flag = 'X'.
g_ddtest_wa2-flag = ''.
MODIFY gt_tab
FROM g_ddtest_wa2
TRANSPORTING flag.
ENDLOOP.
ENDIF.
MODIFY gt_tab
INDEX ddtest-current_line
TRANSPORTING flag.
ENDMODULE. "DDTEST_MARK INPUT
*&---------------------------------------------------------------------*
*& Module STATUS_0101 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_0101 OUTPUT.
SET PF-STATUS 'TEST01'.
SET TITLEBAR 'TEST01'.
ENDMODULE. " STATUS_0101 OUTPUT
*&---------------------------------------------------------------------*
*& Module ADD_FIELD INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE add_field INPUT.
DATA: lv_line TYPE i.
DESCRIBE TABLE gt_tab LINES lv_line.
IF lv_line < ddtest-current_line.
APPEND gt_tab TO gt_tab.
ELSE.
MODIFY gt_tab FROM gt_tab INDEX ddtest-current_line.
ENDIF.
ENDMODULE. " ADD_FIELD INPUT
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0101 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0101 INPUT.
save_ok = ok_code.
CASE save_ok.
WHEN 'BACK'. SET SCREEN 0. LEAVE TO SCREEN 0.
WHEN 'EXIT' OR 'CANCEL'. LEAVE PROGRAM.
WHEN 'EDIT'. PERFORM form_edit.
WHEN 'ADD'.
IF g_edit = '1'.
PERFORM form_add USING 'DDTEST' 'GT_TAB'.
ENDIF.
WHEN 'DEL'.
IF g_edit = '1'.
PERFORM form_del USING 'DDTEST' 'GT_TAB' 'FLAG'.
ENDIF.
WHEN 'SAL'. PERFORM form_sal.
WHEN 'CAL'.PERFORM form_cal.
WHEN 'PC'. PERFORM form_pc.
WHEN 'SAVE'.PERFORM form_save.
WHEN OTHERS.
ENDCASE.
clear: save_ok,ok_code.
ENDMODULE. " USER_COMMAND_0101 INPUT
*&---------------------------------------------------------------------*
*& Form FORM_EDIT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM form_edit .
IF g_edit = '0'.
g_edit = '1'.
ELSE.
g_edit = '0'.
ENDIF.
ENDFORM. " FORM_EDIT
*&---------------------------------------------------------------------*
*& Module CHANGE_EDIT OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE change_edit OUTPUT.
IF g_edit = '0'.
LOOP AT SCREEN.
screen-input = '0'.
MODIFY SCREEN.
ENDLOOP.
ELSE.
LOOP AT SCREEN.
screen-input = '1'.
MODIFY SCREEN.
ENDLOOP.
ENDIF.
ENDMODULE. " CHANGE_EDIT OUTPUT
*&---------------------------------------------------------------------*
*& Form FORM_ADD
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM form_add USING p_tc_name
p_table_name.
DATA l_lines_name LIKE feld-name.
DATA l_selline LIKE sy-stepl.
DATA l_lastline TYPE i.
DATA l_line TYPE i.
DATA l_table_name LIKE feld-name.
FIELD-SYMBOLS <tc> TYPE cxtab_control.
FIELD-SYMBOLS <table> TYPE STANDARD TABLE.
FIELD-SYMBOLS <lines> TYPE i.
* 检查空行存在
* PERFORM frm_check_blank_row.
ASSIGN (p_tc_name) TO <tc>.
* Get the table, which belongs to the tc
CONCATENATE p_table_name '[]' INTO l_table_name. "table body
ASSIGN (l_table_name) TO <table>. "not headerline
* Get looplines of TableControl
CONCATENATE p_tc_name '-LINES' INTO l_lines_name.
ASSIGN (l_lines_name) TO <lines>.
* Get current line
GET CURSOR LINE l_selline.
IF sy-subrc <> 0. " append line to table
l_selline = <tc>-lines + 1.
<tc>-top_line = 1.
* SPWIZARD: set top line
* IF l_selline > <lines>.
* <tc>-top_line = l_selline - <lines> + 1 .
* ELSE.
* <tc>-top_line = 1.
* ENDIF.
ELSE. " insert line into table
l_selline = <tc>-top_line + l_selline .
l_lastline = <tc>-top_line + <lines> - 1.
ENDIF.
* SPWIZARD: set new cursor line *
l_line = l_selline - <tc>-top_line + 1.
* SPWIZARD: insert initial line *
INSERT INITIAL LINE INTO <table> INDEX l_selline.
<tc>-lines = <tc>-lines + 1.
* 添加到导入数据库的内表
* SPWIZARD: set cursor *
SET CURSOR LINE l_line.
ENDFORM. " FORM_ADD
*&---------------------------------------------------------------------*
*& Form FORM_DEL
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_0193 text
* -->P_0194 text
* -->P_0195 text
*----------------------------------------------------------------------*
FORM form_del USING p_tc_name
p_table_name
p_mark_name.
*&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*
DATA l_table_name LIKE feld-name.
FIELD-SYMBOLS <tc> TYPE cxtab_control.
FIELD-SYMBOLS <table> TYPE STANDARD TABLE.
FIELD-SYMBOLS <wa>.
FIELD-SYMBOLS <mark_field>.
* SPWIZARD: END OF LOCAL DATA------------------------------------------*
ASSIGN (p_tc_name) TO <tc>.
* SPWIZARD: get the table, which belongs to the tc *
CONCATENATE p_table_name '[]' INTO l_table_name. "table body
ASSIGN (l_table_name) TO <table>. "not headerline
* SPWIZARD: delete marked lines *
DESCRIBE TABLE <table> LINES <tc>-lines.
LOOP AT <table> ASSIGNING <wa>.
* SPWIZARD: access to the component 'FLAG' of the table header *
ASSIGN COMPONENT p_mark_name OF STRUCTURE <wa> TO <mark_field>.
IF <mark_field> = 'X'.
DELETE <table> INDEX syst-tabix.
IF sy-subrc = 0.
<tc>-lines = <tc>-lines - 1.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM. " FORM_DEL
*&---------------------------------------------------------------------*
*& Form FORM_SAL
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM form_sal .
LOOP AT gt_tab.
gt_tab-flag = 'X'.
MODIFY gt_tab FROM gt_tab INDEX sy-tabix.
ENDLOOP.
ENDFORM. " FORM_SAL
*&---------------------------------------------------------------------*
*& Form FORM_CAL
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM form_cal .
LOOP AT gt_tab.
gt_tab-flag = ''.
MODIFY gt_tab FROM gt_tab INDEX sy-tabix.
ENDLOOP.
ENDFORM. " FORM_CAL
*&---------------------------------------------------------------------*
*& Form FORM_PC
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM form_pc .
DATA: filename TYPE string,
path TYPE string,
fullpath TYPE string,
rs TYPE c,
openpath(128) TYPE c.
FIELD-SYMBOLS: <f1>.
DATA: l_col TYPE i.
DATA: up_excle LIKE TABLE OF zalsmex_tabline WITH HEADER LINE.
* 选择打开文件的路径
CALL METHOD cl_gui_frontend_services=>file_save_dialog
EXPORTING
window_title = 'Please Check File Path'
default_extension = '.XLS'
CHANGING
filename = filename
path = path
fullpath = fullpath
EXCEPTIONS
cntl_error = 1
error_no_gui = 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.
* 检查文件是否存在
CALL METHOD cl_gui_frontend_services=>file_exist
EXPORTING
file = fullpath
RECEIVING
result = rs
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
wrong_parameter = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE 'The file is not existing.' TYPE 'E'.
ENDIF.
IF rs <> 'X'.
MESSAGE 'The file is not existing.' TYPE 'E'.
ENDIF.
openpath = fullpath.
* 取EXCEL 数据
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = openpath
i_begin_col = 1
i_begin_row = 2
i_end_col = 6
i_end_row = 65000
TABLES
intern = up_excle
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 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.
CLEAR: t_tab[], t_tab.
LOOP AT up_excle.
CASE up_excle-col.
WHEN '001'.
WRITE up_excle-value TO t_tab-text01.
WHEN '002'.
WRITE up_excle-value TO t_tab-text02.
ENDCASE.
AT END OF row.
APPEND t_tab.
CLEAR t_tab.
ENDAT.
ENDLOOP.
* 添加到数据库
SORT t_tab BY text01 text02.
LOOP AT t_tab.
CLEAR wa_itab.
MOVE-CORRESPONDING t_tab TO wa_itab.
READ TABLE gt_tab WITH KEY text01 = t_tab-text01
text02 = t_tab-text02.
IF sy-subrc <> 0.
APPEND wa_itab TO gt_tab.
ELSE.
MODIFY TABLE gt_tab FROM wa_itab TRANSPORTING text01 text02.
ENDIF.
ENDLOOP.
PERFORM form_save.
ENDFORM. " FORM_PC
*&---------------------------------------------------------------------*
*& Form FORM_SAVE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM form_save .
* 检查空行存在
PERFORM check_line.
CALL FUNCTION 'ENQUEUE_EZTEXT1'
EXPORTING
mode_ztext1 = 'E'
mandt = sy-mandt
_scope = '2'
_wait = ' '
_collect = ' '
EXCEPTIONS
foreign_lock = 1
system_failure = 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.
FREE t_tab.
LOOP AT gt_tab.
MOVE-CORRESPONDING gt_tab TO t_tab.
t_tab-mandt = sy-mandt.
APPEND t_tab.
CLEAR t_tab.
ENDLOOP.
DELETE FROM ztext1 WHERE text01 NE space.
IF sy-subrc EQ 0.
COMMIT WORK .
ELSE.
ROLLBACK WORK.
ENDIF.
INSERT ztext1 FROM TABLE t_tab.
IF sy-subrc EQ 0.
MESSAGE 'changed ok' TYPE 'S'.
COMMIT WORK.
ELSE.
ROLLBACK WORK.
ENDIF.
FREE t_tab.
* UNLOCK
CALL FUNCTION 'DEQUEUE_EZTEXT1'
EXPORTING
mode_ztext1 = 'E'
mandt = sy-mandt
_scope = '3'
_synchron = ' '
_collect = ' '.
ENDFORM. " FORM_SAVE
*&---------------------------------------------------------------------*
*& Form CHECK_LINE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM check_line .
DATA:lv_message(255).
LOOP AT gt_tab.
IF gt_tab-text01 = space OR gt_tab-text02 = space.
MESSAGE 'Please Fullfill Primary Key Fields.' TYPE 'E'.
EXIT.
ENDIF.
CLEAR gt_tab.
ENDLOOP.
* 检查有无重复Key 字段
SORT gt_tab BY text01 text02.
DELETE ADJACENT DUPLICATES FROM gt_tab.
CLEAR: gt_tab, t_tab.
LOOP AT gt_tab.
IF t_tab-text01 = gt_tab-text01 AND t_tab-text02 = gt_tab-text02.
CLEAR lv_message.
CONCATENATE 'TEXT01' t_tab-text01 '有重复记录!' INTO lv_message.
MESSAGE lv_message TYPE 'E'.
ENDIF.
CLEAR t_tab.
t_tab = gt_tab.
ENDLOOP.
ENDFORM. " CHECK_LINE
*&---------------------------------------------------------------------*
*& Module CHECK_TEXT01 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE check_text01 INPUT.
IF gt_tab-text01 IS INITIAL.
MESSAGE 'TEXT01 should not be initial' TYPE 'E'.
ENDIF.
ENDMODULE. " CHECK_TEXT01 INPUT
*&---------------------------------------------------------------------*
*& Module CHECK_TEXT02 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE check_text02 INPUT.
DATA: i TYPE i VALUE '0'.
IF gt_tab-text02 IS INITIAL.
MESSAGE 'TEXT02 should not be initial' TYPE 'E'.
ENDIF.
LOOP AT gt_tab TO wa_itab WHERE text01 = gt_tab-text01
AND text02 = gt_tab-text02.
i = i + 1.
ENDLOOP.
IF i >= 2.
MESSAGE ' EXISTING THE DATA' TYPE 'E'.
ENDIF.
ENDMODULE. " CHECK_TEXT02 INPUT
DATA: BEGIN OF gt_tab OCCURS 0,
flag .
INCLUDE STRUCTURE ztext1.
DATA: END OF gt_tab.
DATA: t_tab LIKE TABLE OF ztext1 WITH HEADER LINE,
wa_itab LIKE gt_tab.
DATA: g_edit TYPE c VALUE '0'.
DATA: ok_code LIKE sy-ucomm,
save_ok LIKE sy-ucomm.
*&SPWIZARD: DECLARATION OF TABLECONTROL 'DDTEST' ITSELF
CONTROLS: ddtest TYPE TABLEVIEW USING SCREEN 0101.
START-OF-SELECTION.
PERFORM get_data.
PERFORM call_screen.
*&---------------------------------------------------------------------*
*& Form GET_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_data .
SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_tab
FROM ztext1.
ENDFORM. " GET_DATA
*&---------------------------------------------------------------------*
*& Form CALL_SCREEN
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM call_screen .
CALL SCREEN 0101.
ENDFORM. " CALL_SCREEN
*&SPWIZARD: OUTPUT MODULE FOR TC 'DDTEST'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: UPDATE LINES FOR EQUIVALENT SCROLLBAR
MODULE ddtest_change_tc_attr OUTPUT.
DESCRIBE TABLE gt_tab LINES ddtest-lines.
ENDMODULE. "DDTEST_CHANGE_TC_ATTR OUTPUT
*&SPWIZARD: INPUT MODUL FOR TC 'DDTEST'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: MARK TABLE
MODULE ddtest_mark INPUT.
DATA: g_ddtest_wa2 LIKE LINE OF gt_tab.
IF ddtest-line_sel_mode = 1
AND gt_tab-flag = 'X'.
LOOP AT gt_tab INTO g_ddtest_wa2
WHERE flag = 'X'.
g_ddtest_wa2-flag = ''.
MODIFY gt_tab
FROM g_ddtest_wa2
TRANSPORTING flag.
ENDLOOP.
ENDIF.
MODIFY gt_tab
INDEX ddtest-current_line
TRANSPORTING flag.
ENDMODULE. "DDTEST_MARK INPUT
*&---------------------------------------------------------------------*
*& Module STATUS_0101 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_0101 OUTPUT.
SET PF-STATUS 'TEST01'.
SET TITLEBAR 'TEST01'.
ENDMODULE. " STATUS_0101 OUTPUT
*&---------------------------------------------------------------------*
*& Module ADD_FIELD INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE add_field INPUT.
DATA: lv_line TYPE i.
DESCRIBE TABLE gt_tab LINES lv_line.
IF lv_line < ddtest-current_line.
APPEND gt_tab TO gt_tab.
ELSE.
MODIFY gt_tab FROM gt_tab INDEX ddtest-current_line.
ENDIF.
ENDMODULE. " ADD_FIELD INPUT
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0101 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0101 INPUT.
save_ok = ok_code.
CASE save_ok.
WHEN 'BACK'. SET SCREEN 0. LEAVE TO SCREEN 0.
WHEN 'EXIT' OR 'CANCEL'. LEAVE PROGRAM.
WHEN 'EDIT'. PERFORM form_edit.
WHEN 'ADD'.
IF g_edit = '1'.
PERFORM form_add USING 'DDTEST' 'GT_TAB'.
ENDIF.
WHEN 'DEL'.
IF g_edit = '1'.
PERFORM form_del USING 'DDTEST' 'GT_TAB' 'FLAG'.
ENDIF.
WHEN 'SAL'. PERFORM form_sal.
WHEN 'CAL'.PERFORM form_cal.
WHEN 'PC'. PERFORM form_pc.
WHEN 'SAVE'.PERFORM form_save.
WHEN OTHERS.
ENDCASE.
clear: save_ok,ok_code.
ENDMODULE. " USER_COMMAND_0101 INPUT
*&---------------------------------------------------------------------*
*& Form FORM_EDIT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM form_edit .
IF g_edit = '0'.
g_edit = '1'.
ELSE.
g_edit = '0'.
ENDIF.
ENDFORM. " FORM_EDIT
*&---------------------------------------------------------------------*
*& Module CHANGE_EDIT OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE change_edit OUTPUT.
IF g_edit = '0'.
LOOP AT SCREEN.
screen-input = '0'.
MODIFY SCREEN.
ENDLOOP.
ELSE.
LOOP AT SCREEN.
screen-input = '1'.
MODIFY SCREEN.
ENDLOOP.
ENDIF.
ENDMODULE. " CHANGE_EDIT OUTPUT
*&---------------------------------------------------------------------*
*& Form FORM_ADD
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM form_add USING p_tc_name
p_table_name.
DATA l_lines_name LIKE feld-name.
DATA l_selline LIKE sy-stepl.
DATA l_lastline TYPE i.
DATA l_line TYPE i.
DATA l_table_name LIKE feld-name.
FIELD-SYMBOLS <tc> TYPE cxtab_control.
FIELD-SYMBOLS <table> TYPE STANDARD TABLE.
FIELD-SYMBOLS <lines> TYPE i.
* 检查空行存在
* PERFORM frm_check_blank_row.
ASSIGN (p_tc_name) TO <tc>.
* Get the table, which belongs to the tc
CONCATENATE p_table_name '[]' INTO l_table_name. "table body
ASSIGN (l_table_name) TO <table>. "not headerline
* Get looplines of TableControl
CONCATENATE p_tc_name '-LINES' INTO l_lines_name.
ASSIGN (l_lines_name) TO <lines>.
* Get current line
GET CURSOR LINE l_selline.
IF sy-subrc <> 0. " append line to table
l_selline = <tc>-lines + 1.
<tc>-top_line = 1.
* SPWIZARD: set top line
* IF l_selline > <lines>.
* <tc>-top_line = l_selline - <lines> + 1 .
* ELSE.
* <tc>-top_line = 1.
* ENDIF.
ELSE. " insert line into table
l_selline = <tc>-top_line + l_selline .
l_lastline = <tc>-top_line + <lines> - 1.
ENDIF.
* SPWIZARD: set new cursor line *
l_line = l_selline - <tc>-top_line + 1.
* SPWIZARD: insert initial line *
INSERT INITIAL LINE INTO <table> INDEX l_selline.
<tc>-lines = <tc>-lines + 1.
* 添加到导入数据库的内表
* SPWIZARD: set cursor *
SET CURSOR LINE l_line.
ENDFORM. " FORM_ADD
*&---------------------------------------------------------------------*
*& Form FORM_DEL
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_0193 text
* -->P_0194 text
* -->P_0195 text
*----------------------------------------------------------------------*
FORM form_del USING p_tc_name
p_table_name
p_mark_name.
*&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*
DATA l_table_name LIKE feld-name.
FIELD-SYMBOLS <tc> TYPE cxtab_control.
FIELD-SYMBOLS <table> TYPE STANDARD TABLE.
FIELD-SYMBOLS <wa>.
FIELD-SYMBOLS <mark_field>.
* SPWIZARD: END OF LOCAL DATA------------------------------------------*
ASSIGN (p_tc_name) TO <tc>.
* SPWIZARD: get the table, which belongs to the tc *
CONCATENATE p_table_name '[]' INTO l_table_name. "table body
ASSIGN (l_table_name) TO <table>. "not headerline
* SPWIZARD: delete marked lines *
DESCRIBE TABLE <table> LINES <tc>-lines.
LOOP AT <table> ASSIGNING <wa>.
* SPWIZARD: access to the component 'FLAG' of the table header *
ASSIGN COMPONENT p_mark_name OF STRUCTURE <wa> TO <mark_field>.
IF <mark_field> = 'X'.
DELETE <table> INDEX syst-tabix.
IF sy-subrc = 0.
<tc>-lines = <tc>-lines - 1.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM. " FORM_DEL
*&---------------------------------------------------------------------*
*& Form FORM_SAL
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM form_sal .
LOOP AT gt_tab.
gt_tab-flag = 'X'.
MODIFY gt_tab FROM gt_tab INDEX sy-tabix.
ENDLOOP.
ENDFORM. " FORM_SAL
*&---------------------------------------------------------------------*
*& Form FORM_CAL
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM form_cal .
LOOP AT gt_tab.
gt_tab-flag = ''.
MODIFY gt_tab FROM gt_tab INDEX sy-tabix.
ENDLOOP.
ENDFORM. " FORM_CAL
*&---------------------------------------------------------------------*
*& Form FORM_PC
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM form_pc .
DATA: filename TYPE string,
path TYPE string,
fullpath TYPE string,
rs TYPE c,
openpath(128) TYPE c.
FIELD-SYMBOLS: <f1>.
DATA: l_col TYPE i.
DATA: up_excle LIKE TABLE OF zalsmex_tabline WITH HEADER LINE.
* 选择打开文件的路径
CALL METHOD cl_gui_frontend_services=>file_save_dialog
EXPORTING
window_title = 'Please Check File Path'
default_extension = '.XLS'
CHANGING
filename = filename
path = path
fullpath = fullpath
EXCEPTIONS
cntl_error = 1
error_no_gui = 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.
* 检查文件是否存在
CALL METHOD cl_gui_frontend_services=>file_exist
EXPORTING
file = fullpath
RECEIVING
result = rs
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
wrong_parameter = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE 'The file is not existing.' TYPE 'E'.
ENDIF.
IF rs <> 'X'.
MESSAGE 'The file is not existing.' TYPE 'E'.
ENDIF.
openpath = fullpath.
* 取EXCEL 数据
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = openpath
i_begin_col = 1
i_begin_row = 2
i_end_col = 6
i_end_row = 65000
TABLES
intern = up_excle
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 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.
CLEAR: t_tab[], t_tab.
LOOP AT up_excle.
CASE up_excle-col.
WHEN '001'.
WRITE up_excle-value TO t_tab-text01.
WHEN '002'.
WRITE up_excle-value TO t_tab-text02.
ENDCASE.
AT END OF row.
APPEND t_tab.
CLEAR t_tab.
ENDAT.
ENDLOOP.
* 添加到数据库
SORT t_tab BY text01 text02.
LOOP AT t_tab.
CLEAR wa_itab.
MOVE-CORRESPONDING t_tab TO wa_itab.
READ TABLE gt_tab WITH KEY text01 = t_tab-text01
text02 = t_tab-text02.
IF sy-subrc <> 0.
APPEND wa_itab TO gt_tab.
ELSE.
MODIFY TABLE gt_tab FROM wa_itab TRANSPORTING text01 text02.
ENDIF.
ENDLOOP.
PERFORM form_save.
ENDFORM. " FORM_PC
*&---------------------------------------------------------------------*
*& Form FORM_SAVE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM form_save .
* 检查空行存在
PERFORM check_line.
CALL FUNCTION 'ENQUEUE_EZTEXT1'
EXPORTING
mode_ztext1 = 'E'
mandt = sy-mandt
_scope = '2'
_wait = ' '
_collect = ' '
EXCEPTIONS
foreign_lock = 1
system_failure = 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.
FREE t_tab.
LOOP AT gt_tab.
MOVE-CORRESPONDING gt_tab TO t_tab.
t_tab-mandt = sy-mandt.
APPEND t_tab.
CLEAR t_tab.
ENDLOOP.
DELETE FROM ztext1 WHERE text01 NE space.
IF sy-subrc EQ 0.
COMMIT WORK .
ELSE.
ROLLBACK WORK.
ENDIF.
INSERT ztext1 FROM TABLE t_tab.
IF sy-subrc EQ 0.
MESSAGE 'changed ok' TYPE 'S'.
COMMIT WORK.
ELSE.
ROLLBACK WORK.
ENDIF.
FREE t_tab.
* UNLOCK
CALL FUNCTION 'DEQUEUE_EZTEXT1'
EXPORTING
mode_ztext1 = 'E'
mandt = sy-mandt
_scope = '3'
_synchron = ' '
_collect = ' '.
ENDFORM. " FORM_SAVE
*&---------------------------------------------------------------------*
*& Form CHECK_LINE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM check_line .
DATA:lv_message(255).
LOOP AT gt_tab.
IF gt_tab-text01 = space OR gt_tab-text02 = space.
MESSAGE 'Please Fullfill Primary Key Fields.' TYPE 'E'.
EXIT.
ENDIF.
CLEAR gt_tab.
ENDLOOP.
* 检查有无重复Key 字段
SORT gt_tab BY text01 text02.
DELETE ADJACENT DUPLICATES FROM gt_tab.
CLEAR: gt_tab, t_tab.
LOOP AT gt_tab.
IF t_tab-text01 = gt_tab-text01 AND t_tab-text02 = gt_tab-text02.
CLEAR lv_message.
CONCATENATE 'TEXT01' t_tab-text01 '有重复记录!' INTO lv_message.
MESSAGE lv_message TYPE 'E'.
ENDIF.
CLEAR t_tab.
t_tab = gt_tab.
ENDLOOP.
ENDFORM. " CHECK_LINE
*&---------------------------------------------------------------------*
*& Module CHECK_TEXT01 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE check_text01 INPUT.
IF gt_tab-text01 IS INITIAL.
MESSAGE 'TEXT01 should not be initial' TYPE 'E'.
ENDIF.
ENDMODULE. " CHECK_TEXT01 INPUT
*&---------------------------------------------------------------------*
*& Module CHECK_TEXT02 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE check_text02 INPUT.
DATA: i TYPE i VALUE '0'.
IF gt_tab-text02 IS INITIAL.
MESSAGE 'TEXT02 should not be initial' TYPE 'E'.
ENDIF.
LOOP AT gt_tab TO wa_itab WHERE text01 = gt_tab-text01
AND text02 = gt_tab-text02.
i = i + 1.
ENDLOOP.
IF i >= 2.
MESSAGE ' EXISTING THE DATA' TYPE 'E'.
ENDIF.
ENDMODULE. " CHECK_TEXT02 INPUT
总结
以上是生活随笔为你收集整理的用dialog创建一个可修改表的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: check上传模板中的金额字段中的千分位
- 下一篇: 使用ALV中输出ICON