以批导用户为例的批导程序样例

作者:ABAP老白 约 7 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:ABAP, 开发
以批导用户为例的批导程序样例 - 封面图
以批导用户为例的批导程序样例 - 封面图

曾经有一次,我见到了一个公司的批导程序的程序规范和范例程序,看的我目瞪口呆,这个程序的啰嗦程度和故意写复杂的程度已经不是脱裤子放屁那么简单了,这简直就是爬到珠穆朗玛峰上放屁啊!就单说一个为了使用CLASS而使用CLASS就让人十分费解,一个批导程序而已,到底为什么要做的这么啰嗦?为了多评估一些人天吗?还是为了运维多几个岗位?

这显然和我坚持的程序以简洁高效为美的理念相反,作为一个理想主义者的ABAP无法忍受这类程序的存在和被推广使用,所以我写了一套程序样例,都是平常常用的功能,比如批导,比如ALV单纯显示、复杂交互等,给大家作为模板使用,这些程序的优点是简洁易用,

效率高, 易维护,一般情况下可以直接使用,如果要扩展功能也很方便。

本次分享的是本地上载类型的批导程序,这类程序的特点是数据由本地上载,在选择界面有导出模板格式的按钮,数据上载后ALV显示上载的数据,确认无误后点击按钮生成凭证/物料/账号等,执行完毕后需要能够显示详细的执行过程,比如BAPI的返回值,但是结果不需要存数据库表。

本程序的几点说明:

1、只支持剪贴板和TXT文件的上载,不支持Excel上载

2、有的参数是可能有好几个值的,可以用|分隔

3、双击多值参数可以弹出窗口显示明细列表

4、执行结果以红绿灯显示,双击执行信息列可以查看详细执行过程

5、根据ALV的Fieldcat字段,使用MASK的方式选择导入数据,更灵活

6、 演示 了如 何定义和使用 深层内表, 供初学者 学习。

关于只支持剪贴板和TXT文件上载,有同学可能会感到不解,为啥不支持Excel文件上载?

一般这么认为的都是没有怎么吃过Excel上载数据的亏的同学,因为Excel上载问题太多了!以往每年都要接到几起Excel上载或者失败或者错误的电话,然后给客户各种解释,还得给使用Office365的解释为啥别人可以上载但是他不可以。后来索性就只做剪贴板或者文本文件上载,刚开始还担心用户是不是习惯,后来发现用户非常乐意使用剪贴板的方法,直言比Excel还要方便很多,只需要复制上载的数据就可以了,甚至Excel的格式都不需要是固定格式了,而且速度要快很多很多。我大概从2018年开始使用这个方案,从那以后既没有用户抱怨不支持Excel上载,也再也没有收到上载失败或者错误的电话了。

程序的选择界面:

以批导用户为例的批导程序样例 - 封面图
以批导用户为例的批导程序样例 - 封面图

复制Excel数据后,点击执行按钮就会到数据展示界面:

以批导用户为例的批导程序样例 - 封面图
以批导用户为例的批导程序样例 - 封面图
以批导用户为例的批导程序样例 - 封面图
以批导用户为例的批导程序样例 - 封面图

对于参数为内表格式的,双击可以显示明细列表:

以批导用户为例的批导程序样例 - 封面图
以批导用户为例的批导程序样例 - 封面图

点击“Create”按钮后,开始创建用户并显示执行结果:

以批导用户为例的批导程序样例 - 封面图
以批导用户为例的批导程序样例 - 封面图

双击显示详细执行过程:

以批导用户为例的批导程序样例 - 封面图
以批导用户为例的批导程序样例 - 封面图

代码如下:

*&---------------------------------------------------------------------**& 批导用户.*& 本地上载数据类程序的模板程序*& Baitianzhen*&---------------------------------------------------------------------*REPORT zupload_user NO STANDARD PAGE HEADING.

TABLES: sscrfields,bapiadtel,bapiparam,bapiagr,bapiprof.DATA: gt_fldct TYPE lvc_t_fcat, gs_slayt TYPE lvc_s_layo.DATA: BEGIN OF gs_user, uname TYPE usr01-bname, "用户名 bcode TYPE xuncode, "密码 ustyp TYPE usr02-ustyp, "用户类型 gltgb TYPE usr02-gltgb, "有效至 tzone TYPE usr02-tzone, "时区 lname TYPE adrp-name_last, "姓 fname TYPE adrp-name_first, "名 dprtm TYPE adcp-department, "部门 tlnum TYPE adcp-tel_number, "电话号码 email TYPE adr6-smtp_addr, "电子邮件 langu TYPE usr01-langu, "登录语言 dcpfm TYPE usr01-dcpfm, "数值格式 datfm TYPE usr01-dcpfm, "日期格式 timfm TYPE usr01-timefm, "时间格式 spdev TYPE usr01-spld, "假脱机 paras TYPE string, "参数值(:|分隔) agrns TYPE string, "角色(|分隔) profs TYPE string, "参数文件(|分隔) resul TYPE char4, "结果 rtmsg TYPE string, "执行信息 ttele TYPE TABLE OF bapiadtel, "电话 tpara TYPE TABLE OF bapiparam, "拆分后的参数内表 tagrn TYPE TABLE OF bapiagr, "角色 tprof TYPE TABLE OF bapiprof, "参数文件 retab TYPE TABLE OF bapiret2, "BAPI执行输出消息 END OF gs_user.DATA: gt_user LIKE TABLE OF gs_user.DATA: gv_mask TYPE string. SELECTION-SCREEN FUNCTION KEY 1.SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE btxt1.PARAMETERS p_frclp RADIOBUTTON GROUP typ USER-COMMAND sele DEFAULT 'X'.PARAMETERS p_frtxt RADIOBUTTON GROUP typ.PARAMETERS p_file TYPE string OBLIGATORY DEFAULT 'c:\ZROLEUPS.txt' MODIF ID a.SELECTION-SCREEN END OF BLOCK b1.SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE btxt2.PARAMETERS p_dele AS CHECKBOX DEFAULT 'X'.SELECTION-SCREEN END OF BLOCK b2.

INITIALIZATION. gv_mask = 'XXXXXXXXXXXXXXXXXX'. PERFORM fill_fcat TABLES gt_fldct USING: 'UNAME' 'USR01' 'BNAME ' '账号'(f01), 'BCODE' ' ' ' ' '密码'(f02), 'USTYP' 'USR02' 'USTYP ' '用户类型'(f03), 'GLTGB' 'USR02' 'GLTGB ' '有效至'(f04), 'TZONE' 'USR02' 'TZONE ' '时区'(f05), 'LNAME' 'ADRP ' 'NAME_LAST ' '姓'(f06), 'FNAME' 'ADRP ' 'NAME_FIRST' '名'(f07), 'DPRTM' 'ADCP ' 'DEPARTMENT' '部门'(f08), 'TLNUM' 'ADCP ' 'TEL_NUMBER' '电话'(f09), 'EMAIL' 'ADR6 ' 'SMTP_ADDR ' '电子邮件'(f20), 'LANGU' 'USR01' 'LANGU ' '登录语言'(f10), 'DCPFM' 'USR01' 'DCPFM ' '数值格式'(f11), 'DATFM' 'USR01' 'DCPFM ' '日期格式'(f12), 'TIMFM' 'USR01' 'TIMEFM ' '时间格式'(f13), 'SPDEV' 'USR01' 'SPLD ' '假脱机'(f14), 'PARAS' 'RSREF' 'STRING ' '参数值(|:分隔)'(f15), 'AGRNS' 'RSREF' 'STRING ' '角色(|分隔)'(f16), 'PROFS' 'RSREF' 'STRING ' '参数文件(|分隔)'(f17), 'RESUL' 'RSMPE' 'ICON_ID ' '结果'(f18), 'RTMSG' 'RSREF' 'STRING ' '执行信息'(f19).

AT SELECTION-SCREEN OUTPUT. btxt1 = '数据来源'(t01). btxt2 = '选项'(t02). sscrfields-functxt_01 = '导出模板结构'(t04). %_p_frclp_%_app_%-text = '数据来自剪贴板(不要复制标题)'(t05). %_p_frtxt_%_app_%-text = '数据来自文本文件'(t06). %_p_file_%_app_%-text = '文本文件(不要标题行)'(t07). %_p_dele_%_app_%-text = '如用户已存在则先删除再重建'(t08). LOOP AT SCREEN. CASE 'X'. WHEN p_frclp. IF screen-group1 CA 'A'. screen-active = '0'. ENDIF. ENDCASE. MODIFY SCREEN. ENDLOOP.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file. CALL FUNCTION 'WS_FILENAME_GET' EXPORTING mask = ',文本文件(*.TXT),*.TXT,所有文件(*.*),*.*.' mode = 'O' IMPORTING filename = p_file EXCEPTIONS OTHERS = 5.

AT SELECTION-SCREEN. IF sscrfields-ucomm = 'FC01'. PERFORM export_tmpl_fcat TABLES gt_fldct USING gv_mask. ENDIF.

START-OF-SELECTION. PERFORM savelog(zreplog) USING sy-repid '' IF FOUND. PERFORM getdata. PERFORM outdata.

*&---------------------------------------------------------------------**& 上载数据并补充完整*&---------------------------------------------------------------------*FORM getdata. DATA: lt_tstr TYPE TABLE OF string WITH HEADER LINE, lv_str1 TYPE string, lv_str2 TYPE string.

PERFORM upload_data_fcat TABLES gt_user gt_fldct USING gv_mask p_frclp p_file.

LOOP AT gt_user INTO gs_user. IF gs_user-tlnum NE ''. bapiadtel-telephone = gs_user-tlnum. bapiadtel-r_3_user = 1. APPEND bapiadtel TO gs_user-ttele. ENDIF. IF gs_user-paras NE ''. CLEAR lt_tstr[]. SPLIT gs_user-paras AT '|' INTO TABLE lt_tstr. LOOP AT lt_tstr. SPLIT lt_tstr AT ':' INTO bapiparam-parid bapiparam-parva. SELECT SINGLE partext IN

...

ABAP老白

关于作者:ABAP老白

企业信息化与 SAP 技术顾问,长期专注 SAP ABAP、FI/CO、MM、SD 等模块的技术分享与实战经验总结。查看更多介绍

来源说明:本文内容由「以批导用户为例的批导程序样例.md」整理生成,仅用于内部技术分享与学习交流。