导入模板
*&---------------------------------------------------------------------*
*& Report ZTEST_GUO
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZTEST_GUO.
*&---------------------------------------------------------------------*
*& Report Y4_A2_R01
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
****************************************************************
TABLES:sscrfields. "定义按钮
***********************************************************************
*
*数据类型定义逻辑块
*
************************************************************************
"导入数据
DATA: BEGIN OF gt_itab OCCURS 0,
bname LIKE suid_st_bname-bname, "账户名
name_last LIKE suid_st_node_person_name-name_last, "用户名
password LIKE suid_st_node_password_ext-password, "密码
function LIKE suid_st_node_workplace-function, "岗位
department LIKE suid_st_node_workplace-department, "部门
profile LIKE suid_st_node_profile-profile, "参数文件名
state(1), "状态
message TYPE string, "消息文本
checkbox(1),
END OF gt_itab.
"定义指针
FIELD-SYMBOLS <fs_itab> LIKE gt_itab.
"ALV
DATA:
"主要属性
gt_fieldcat TYPE lvc_t_fcat, "字段目录
gs_fieldcat TYPE lvc_s_fcat, "字段目录
gs_layout TYPE lvc_s_layo, "布局结构
"次要属性
gs_glay TYPE lvc_s_glay. "网格设置
************************************************************************
*
*选择界面程序逻辑块
*
************************************************************************
PARAMETERS: p_file TYPE rlgrap-filename OBLIGATORY. "选择路径
"事件
SELECTION-SCREEN FUNCTION KEY 1.
INITIALIZATION.
"点击下载模板
sscrfields-functxt_01 = VALUE smp_dyntxt(
icon_id = icon_mapped_relation
icon_text = 'EXCEL下载模板'
quickinfo = '点击下载'
).
AT SELECTION-SCREEN OUTPUT.
"是一个PBO事件(Process before output,屏幕加载前的事件)。
LOOP AT SCREEN.
IF matches( val = screen-name regex = 'P_FILE' ).
screen-required = 2.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
PERFORM frm_f4_help CHANGING p_file.
AT SELECTION-SCREEN.
"选择文件路径
CASE sscrfields-ucomm.
WHEN 'FC01'.
PERFORM frm_download_excel USING 'Y4_A2_006'. "下载 EXCEL 文件
WHEN OTHERS.
IF p_file IS INITIAL.
MESSAGE s001(00) WITH '导入文件路径必须填写!' DISPLAY LIKE 'E'.
STOP.
ELSE.
PERFORM frm_read_excel TABLES gt_itab[] USING p_file 1 2 6 10000 CHANGING gt_itab.
* PERFORM frm_jiaoyan. "校验数据
PERFORM frm_set_fieldcat CHANGING gt_fieldcat. "设置字段目录 给ALV FIELDCAT 赋值
PERFORM frm_layout. "设置布局
PERFORM frm_display. "显示ALV
ENDIF.
ENDCASE.
*&---------------------------------------------------------------------*
*& FORM FRM_F4_HELP
*&---------------------------------------------------------------------*
* 打开文件路径
*----------------------------------------------------------------------*
* --> P1 TEXT
* <-- P2 TEXT
*----------------------------------------------------------------------*
FORM frm_f4_help CHANGING o_fname TYPE rlgrap-filename.
DATA: lv_filetab TYPE filetable,
lv_waftab LIKE LINE OF lv_filetab,
lv_rc TYPE i.
CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
window_title = '打开文件'
initial_directory = 'C:/'
CHANGING
file_table = lv_filetab
rc = lv_rc
* USER_ACTION =
* FILE_ENCODING =
EXCEPTIONS
file_open_dialog_failed = 1
cntl_error = 2
error_no_gui = 3
not_supported_by_gui = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
EXIT.
ELSE.
READ TABLE lv_filetab INTO lv_waftab INDEX 1.
o_fname = lv_waftab-filename.
CLEAR: lv_filetab,
lv_waftab.
ENDIF.
ENDFORM. " FRM_F4_HELP
*&---------------------------------------------------------------------*
*& FORM FRM_DOWNLOAD_EXCEL
*&---------------------------------------------------------------------*
* 下载EXCEL模版
*----------------------------------------------------------------------*
* --> P1 TEXT
* <-- P2 TEXT
*----------------------------------------------------------------------*
FORM frm_download_excel USING lv_objid TYPE wwwdatatab-objid.
DATA: l_filename TYPE string,
lv_filename TYPE string,
lv_path TYPE string,
lv_fullpath TYPE string.
DATA: lv_obj LIKE wwwdatatab,
lv_destination LIKE rlgrap-filename.
DATA: lv_rc LIKE sy-subrc.
DATA: lv_error TYPE char255.
SELECT SINGLE * FROM wwwdata
INTO CORRESPONDING FIELDS OF lv_obj
WHERE objid = lv_objid.
CONCATENATE lv_obj-text '.XLSX' INTO l_filename.
CALL METHOD cl_gui_frontend_services=>file_save_dialog
EXPORTING
default_file_name = l_filename
file_filter = cl_gui_frontend_services=>filetype_excel
prompt_on_overwrite = 'X'
CHANGING
filename = lv_filename
path = lv_path
fullpath = lv_fullpath
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
invalid_default_file_name = 4
OTHERS = 5.
IF lv_fullpath <> ''.
lv_destination = lv_fullpath.
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
EXPORTING
key = lv_obj
destination = lv_destination
IMPORTING
rc = lv_rc.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& FORM FRM_READ_EXCEL
*&---------------------------------------------------------------------*
* 调用上传文件函数
*----------------------------------------------------------------------*
*FORM frm_read_excel TABLES l_tab
* USING pv_file TYPE rlgrap-filename
* lv_i_begin_col TYPE i
* lv_i_begin_row TYPE i
* lv_i_end_col TYPE i
* lv_i_end_row TYPE i
* CHANGING l_wa TYPE any.
*
* DATA: lt_excel TYPE TABLE OF alsmex_tabline WITH HEADER LINE.
* FIELD-SYMBOLS <lfs_value> TYPE any.
*
* CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
* EXPORTING
* filename = pv_file "文件路径
* i_begin_col = lv_i_begin_col "开始列
* i_begin_row = lv_i_begin_row "开始行
* i_end_col = lv_i_end_col "结束列
* i_end_row = lv_i_end_row "结束行
* TABLES
* intern = lt_excel
* EXCEPTIONS
* inconsistent_parameters = 1
* upload_ole = 2
* OTHERS = 3.
* IF sy-subrc <> 0.
* MESSAGE s001(00) WITH '读取 EXCEL 文件失败' DISPLAY LIKE 'E'.
* STOP.
* ENDIF.
*
* "对固定格式的数据进一步处理,以存放至数据库表格中。
* LOOP AT lt_excel.
* ASSIGN COMPONENT lt_excel-col OF STRUCTURE l_wa TO <lfs_value>.
* "系统将字符串lt_excel-col的组件l_wa分配给字段符号<lfs_value>
* IF sy-subrc = 0 .
* <lfs_value> = lt_excel-value.
* ENDIF.
* AT END OF row.
* APPEND l_wa TO l_tab.
* CLEAR l_wa.
* ENDAT.
* ENDLOOP.
*ENDFORM.
FORM frm_read_excel TABLES l_tab
USING pv_file TYPE rlgrap-filename
lv_i_begin_col TYPE i
lv_i_begin_row TYPE i
lv_i_end_col TYPE i
lv_i_end_row TYPE i
CHANGING l_wa TYPE any.
DATA: lt_excel TYPE TABLE OF alsmex_tabline WITH HEADER LINE.
FIELD-SYMBOLS <lfs_value> TYPE any.
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = pv_file "文件路径
i_begin_col = lv_i_begin_col "开始列
i_begin_row = lv_i_begin_row "开始行
i_end_col = lv_i_end_col "结束列
i_end_row = lv_i_end_row "结束行
TABLES
intern = lt_excel
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE s001(00) WITH '读取 EXCEL 文件失败' DISPLAY LIKE 'E'.
STOP.
ENDIF.
"对固定格式的数据进一步处理,以存放至数据库表格中。
LOOP AT lt_excel.
ASSIGN COMPONENT lt_excel-col OF STRUCTURE l_wa TO <lfs_value>.
"系统将字符串LT_EXCEL-COL的组件L_WA分配给字段符号<LFS_VALUE>
IF sy-subrc = 0 .
<lfs_value> = lt_excel-value.
ENDIF.
AT END OF row.
APPEND l_wa TO l_tab.
CLEAR l_wa.
ENDAT.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_FIELDCAT
*&---------------------------------------------------------------------*
*& ALV字段显示
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_set_fieldcat CHANGING VALUE(ot_fieldcat) TYPE lvc_t_fcat.
DATA:lv_Unit_price TYPE char20.
DATA:l_pos TYPE i VALUE 2,
ls_fieldcat TYPE lvc_s_fcat.
DEFINE alv_append_field.
CLEAR ls_fieldcat.
ls_fieldcat-col_pos = l_pos.
ls_fieldcat-fieldname = &1 .
ls_fieldcat-reptext = &2 .
APPEND ls_fieldcat TO ot_fieldcat.
l_pos = l_pos + 1 .
END-OF-DEFINITION.
"拼接 Unit_price
REFRESH ot_fieldcat.
CLEAR gs_fieldcat.
ls_fieldcat-fieldname = 'CHECKBOX'. "多选框
ls_fieldcat-reptext = '请选择'. "文本
ls_fieldcat-edit = 'X'. "可编辑
ls_fieldcat-checkbox = 'X'. "多选
APPEND ls_fieldcat TO ot_fieldcat.
*ALV显示EXCEL模板字段值
ALV_APPEND_FIELD 'STATE' '状态' .
ALV_APPEND_FIELD 'MESSAGE' '消息' .
ALV_APPEND_FIELD 'BNAME' '账号名' .
ALV_APPEND_FIELD 'NAME_LAST' '用户名' .
ALV_APPEND_FIELD 'PASSWORD' '密码' .
ALV_APPEND_FIELD 'FUNCTION' '职能' .
ALV_APPEND_FIELD 'DEPARTMENT' '部门' .
ALV_APPEND_FIELD 'PROFILE' '权限' .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_layout
*&---------------------------------------------------------------------*
*& ALV页面显示
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_layout .
CLEAR gs_layout.
gs_layout-zebra = 'X'. "斑马线显示
gs_layout-cwidth_opt = 'X'. "自适应宽度
gs_layout-sel_mode = 'A'. "选择模式:多选/单选
ENDFORM.
*&---------------------------------------------------------------------*
*& Form fem_display
*&---------------------------------------------------------------------*
*& 调用ALV函数
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_display .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid "按钮
i_callback_pf_status_set = 'SET_PF_STATUS' "按钮
i_callback_user_command = 'ALV_USER_COMMAND' "按钮
is_layout_lvc = gs_layout "layout工作区
it_fieldcat_lvc = gt_fieldcat "fieldcat结构
i_save = 'A' "保存
TABLES
t_outtab = gt_itab[] "取gt_itab取数
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
* "添加STANDARD GUI
*----------------------------------------------------------------------*
FORM set_pf_status USING pt_exclude TYPE kkblo_t_extab.
DATA:lt_exclude TYPE kkblo_t_extab WITH HEADER LINE.
SET PF-STATUS 'STANDARD' EXCLUDING lt_exclude[].
ENDFORM.
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
* 按钮事件
*----------------------------------------------------------------------*
FORM alv_user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
DATA:ref_grid TYPE REF TO cl_gui_alv_grid.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = ref_grid.
CALL METHOD ref_grid->check_changed_data. "更改
CALL METHOD ref_grid->refresh_table_display. "刷新内表
CASE r_ucomm.
WHEN '&ALL1'. "全选
LOOP AT gt_itab[] ASSIGNING <fs_itab>." INTO gt_itab."
<fs_itab>-checkbox = 'X'.
ENDLOOP.
WHEN '&SAL1'. "取消全选
LOOP AT gt_itab[] ASSIGNING <fs_itab>.
<fs_itab>-checkbox = ''.
ENDLOOP.
WHEN 'SET'.
PERFORM frm_bipi. "调用BAPI
PERFORM re_alv. "刷新ALV
ENDCASE.
CALL METHOD ref_grid->check_changed_data.
CALL METHOD ref_grid->refresh_table_display. " 刷新
rs_selfield-refresh = 'X'. "刷新内表
ENDFORM.
*&---------------------------------------------------------------------*
*& FORM FRM_CO01_BIPI
*&---------------------------------------------------------------------*
* BAPI
*----------------------------------------------------------------------*
FORM frm_bipi.
"声明BAPI相关参数
DATA: ls_username LIKE bapibname, "账户名
ls_password LIKE bapipwd, "密码
ls_logondata LIKE bapilogond, "登录数据
ls_address LIKE bapiaddr3, "用户名
lt_profile TYPE TABLE OF bapiprof,
ls_profile LIKE LINE OF lt_profile,
lt_return LIKE STANDARD TABLE OF bapiret2 WITH HEADER LINE, "返回值
ls_return LIKE LINE OF lt_return.
DATA: lv_username LIKE bapibname-bapibname.
DATA: lv_dest TYPE rfcdest.
DATA: lv_errmsg TYPE string,
lv_msg TYPE string,
message1 TYPE string.
"循环gt_itab中checkbox = 'X' AND state <> 'E'条件的值
LOOP AT gt_itab ASSIGNING <fs_itab> WHERE checkbox = 'X'." AND state <> 'E'.
"数据赋值
ls_username-bapibname = <fs_itab>-bname. "账户名
ls_logondata-ustyp = 'A'. "用户类型
ls_password-bapipwd = <fs_itab>-password. "密码
ls_address-lastname = <fs_itab>-name_last. "姓名
ls_address-function = <fs_itab>-function. "职能
ls_address-department = <fs_itab>-department. "部门
*初始化相应的变量
CLEAR: lt_return[] , ls_return , lt_profile[] , ls_profile.
CLEAR:<fs_itab>-state.
CLEAR:<fs_itab>-message. "清空消息字段
*创建用户
CALL FUNCTION 'BAPI_USER_CREATE1'
EXPORTING
username = ls_username
logondata = ls_logondata
password = ls_password
address = ls_address
TABLES
return = lt_return.
"执行结果信息处理
CLEAR lv_errmsg.
LOOP AT lt_return WHERE type = 'E' OR type = 'A'.
CLEAR lv_msg.
CALL FUNCTION 'MESSAGE_TEXT_BUILD' "调用消息函数
EXPORTING
msgid = lt_return-id
msgnr = lt_return-number
msgv1 = lt_return-message_v1
msgv2 = lt_return-message_v2
msgv3 = lt_return-message_v3
msgv4 = lt_return-message_v4
IMPORTING
message_text_output = lv_msg.
lv_errmsg = |{ lv_errmsg }{ lv_msg };|.
ENDLOOP.
READ TABLE lt_return INTO ls_return WITH KEY type = 'E'.
IF sy-subrc = 0.
"回滚事务
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
<fs_itab>-state = ls_return-type.
<fs_itab>-message = lv_errmsg.
ELSE.
REFRESH:lt_return.
lv_username = <fs_itab>-bname.
ls_profile-bapiprof = <fs_itab>-profile.
ls_profile-bapitype = 'C'.
ls_profile-bapiaktps = 'X'.
APPEND ls_profile TO lt_profile.
"用户权限
CALL FUNCTION 'BAPI_USER_PROFILES_ASSIGN' DESTINATION lv_dest
EXPORTING
username = lv_username
TABLES
profiles = lt_profile
return = lt_return.
READ TABLE lt_return INTO ls_return WITH KEY type = 'E'.
IF sy-subrc = 0.
WRITE '将配置文件分配给用户错误'.
ELSE.
ENDIF.
ENDIF.
IF lv_errmsg IS NOT INITIAL.
"回滚事务
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
<fs_itab>-state = ls_return-type.
<fs_itab>-message = lv_errmsg.
ELSE.
"提交事务
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
<fs_itab>-state = 'S'.
<fs_itab>-message = '创建成功'.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& FORM re_alv
*&---------------------------------------------------------------------*
* ALV按钮事件后自动刷新列宽度
*----------------------------------------------------------------------*
FORM re_alv.
DATA:lv_grid TYPE REF TO cl_gui_alv_grid,
ls_layout TYPE lvc_s_layo. "这一句很关键
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lv_grid.
* 获取ALV变化过后的布局参数
CALL METHOD lv_grid->get_frontend_layout
IMPORTING
es_layout = ls_layout.
* 重新回写自适应宽度
ls_layout-cwidth_opt = 'X'.
* 回写ALV变化过后的布局参数
CALL METHOD lv_grid->set_frontend_layout
EXPORTING
is_layout = ls_layout.
* 刷新ALV布局
CALL METHOD lv_grid->refresh_table_display.
ENDFORM.
*Messages
*----------------------------------------------------------
*
* Message class: 00
*001 &1&2&3&4&5&6&7&8