目录
开发类型:
新增BUDGETCODE号的预算合并查询报表
开发申请:
运行效果如下:(该界面称为选择屏幕)

报表界面如下:(该界面也称为ALV界面)

开发步骤:
因为该需求是将多个字段从各自表中查询出来最后展示到页面供用户查看,所以是报表开发,使用事务代码SE38进行开发

点击回车进入SE38界面,输入一个新的自建程序流水号码,必须使用Z***开头,这里新建了一个自建程序ZGYX0001,点击创建按钮(如果程序命名重复、已经存在则会提示创建失败)

填写标题后,选择程序的属性为可执行程序,点击保存,会继续弹窗
这里需要注意:我们在实际开发的时候需要在属性-包:选择相应的模块,ZZFI、ZZMM、ZZSD等模块,然后点击保存按钮,程序开发完成后则可以进行上线到正式环境。而如果是自行测试的程序,则可以点击”本地对象”按钮,后面则不能上线到正式环境。完成之后可以直接生成以下界面:

代码(截图)如下:
1、首先使用关键字 TABLES 声明本次开发涉及到的表
(在选择屏幕的字段参照、ALV的展示参照时会使用到,如果分不清的话就全部填上)这次开发只使用了EBAN 和 ZTMM0048,其余的可以不写,下面的图片是错的,但是不会报错,可以多填,不可以少填。

2、使用关键字TYPES 创建ALV报表结构

3、使用关键字DATA 创建内表工作区和结构

4、DEFINE定义ALV报表的宏(相当于ALV的展示框架)
这个和后面填充ALV展示函数有关
FIELDNAME 是ALV的字段名称,内表定义的字段
KEY 是表明字段是否是关键字,X 或空
SELTEXT 是字段最终在报表展示界面显示的抬头名称
TABNAME 是字段对应的后台表,可以设置为空填SPACE

5、设计选择屏幕
选择屏幕是用于给用户前端输入数据,后台根据用户输入的数据进行数据筛选的依据。常用的有两种,单选和多选:SELECT-OPTIONS 是多选(是一个值范围); PARAMETERS 是单选

6、设计事件的调用顺序(先取数,再赋值,最后展示)SELECTION
(PBO\PAI事件,后面会单独讲)初学开发就按照下列设置就可以了:把取数子例程(FRM_GET_DATA)写在START-OF-SELECTION事件下面,表明用户在填写完选择屏幕之后,点击执行按钮即进入取数的子例程

7、取数子程序form
我解释一下代码,取数子例程里面首先使用了两个SELECT,分别从EBAN\ZTMM0048两个后台表里面取了数。ZTMM0048是BUDGETCODE的后台储存表,budgetcode是主键;EBAN表里面储存了budgetcode的使用记录
代码的意思是:按照用户在选择屏幕中输入的数据S_CODE,去EBAN表中查找ZZBUDGETCODE字段等于S_CODE时对应行的所有字段(*表示所有字段),放入内表GT_EBAN中,但是由于我们在之前设置过(GT_EBAN TYPE STANDARD TABLE OF TY_EBAN),并且结构TY_EBAN 里面只有BUDGETCODE、BANFN、BANFN、MENGE、ZZPRICE、LOEKZ这几个字段,所以也只有这几个字段会取值出来放入GT_EBAN里面。
ZTMM0048表同理。
SELECT取完数放入内表后,接着进行了一个数据校验,是如果说ZTMM0048表里面没有符合条件的数据时,就结束程序,弹出报错MESSAGE.如果数据校验通过,就继续进行ALV报表的赋值,数据填充。一般在LOOP..ENDLOOP里面进行。
因为BUDGETCODE在ZTMM0048表里面是主键具有唯一性,所以我们以GT_ZTMM0048为主要LOOP对象,意在将每一个BUDGETCODE数据无重复地写进ALV报表里。
APPEND GS_ALV TO GT_ALV.这个语句是最常使用的添加数据到内表里的语句。将GS_ALV的数据添加到GT_ALV数据里面。

8、展示ALV数据子程序form

在子程序外面声明的变量是全局通用的,子程序里面声明的变量只能在当前子程序里面使用,即局部变量。
代码完成后,进行语法检查
没有语法错误,即可以激活,点击旁边的激活按钮,选中当前的程序名,变成黄色背景,点击勾号,会显示对象已激活提示,如下图


9、点击文本元素按钮,进行选择屏幕按钮文字设计


将名为S_CODE的筛选框,文本列变成开发申请上的描述,点击激活


代码和文本元素都激活之后,点击运行按钮

运行结果如下

报表左上方的名称是之前创建程序时,报表的名称描述,即

输入测试数据,查看数据是否成功查询,如果有数据问题,继续使用SE38修改程序
补充说明:
我刚刚在编辑文章的时候发现其实开发申请有点问题:ZTMM0048是后台表的名称,以Z开头表明是自建的;EBAN也是后台表的名称,是一个标准表,里面储存的是采购申请的数据。事务代码指的是我们这个程序在做完之后,给程序附上一个”超链接“指令,用户在首页输入事务代码就可以执行我们的这个程序。一个程序可以分配到多个事务代码。
(后面会分配一个章节专门讲给不同的程序分配事务代码,在实际开发工作中较为常见的那种)
事务代码可以是业务顾问在系统中查询后,指定分配一个事务代码写在开发申请上面,我们在程序写好后分配给这次的程序就好了;如果业务顾问在开发申请上面没有指定事务代码,但是需要一个事务代码来使用(一般报表程序都需要分配事务代码的),我们就可以按照自己公司的事务代码创建规范,来分配一个事务代码流水号给这次的程序。
每次修改完之后都进行代码语法检查、激活,一定要激活,更新的代码才会生效!!
2024.07.04 重新编辑了这一节,emmm最开始是没有准备写代码解释的,后面还是写上来了,还是写全一点,学习起来整体性比较好,减少百度次数。但是PBO\PAI模块确实太多了,放进来的话会显得很冗杂。就单独放一个模块吧,因为偏向“理论”,点又特别小,而且属于进阶的学习了吧。初学的话,就从我这个简单的DEMO实操里面一边学一边写,成就感比较高,有利于学习的积极性!会有哇塞!WZNB的感觉~
我刚刚好像说了一个绕口令~
代码如下:
最后,我附上代码吧!
(为什么没有ABAP语言的选项,我选了JAVA,看着怪怪的,EMM能复制就还行吧)
REPORT ZFMR0005.
TABLES:ZTMM0048,EBAN.
TYPES:BEGIN OF TY_ALV,
MANDT TYPE MANDT, "集团
BUDGETCODE TYPE ZTMM0048-BUDGETCODE, "budgetcode号
ZZYSZJE TYPE ZTMM0048-ZZYSZJE, "预算总金额
ZZCGSQJE TYPE EBAN-PREIS, "采购申请总金额
ZZSYJE TYPE ZTMM0048-ZZYSZJE, "剩余金额
END OF TY_ALV.
TYPES:
BEGIN OF TY_EBAN,
ZZBUDGETCODE TYPE EBAN-ZZBUDGETCODE,
BANFN TYPE EBAN-BANFN,
BNFPO TYPE EBAN-BNFPO,
MENGE TYPE EBAN-MENGE,
* PREIS TYPE EBAN-PREIS,注释 BY GYX 20230815
ZZPRICE TYPE EBAN-ZZPRICE,"ADD BY GYX 修改取值逻辑 20230815
LOEKZ TYPE EBAN-LOEKZ,
END OF TY_EBAN.
DATA: GT_ALV TYPE STANDARD TABLE OF TY_ALV,
GS_ALV TYPE TY_ALV,
GT_EBAN TYPE STANDARD TABLE OF TY_EBAN,
GS_EBAN TYPE TY_EBAN,
GT_ZTMM0048 TYPE STANDARD TABLE OF ZTMM0048,
GS_ZTMM0048 TYPE ZTMM0048.
DATA: GT_FCAT TYPE SLIS_T_FIELDCAT_ALV,
GS_FCAT TYPE SLIS_FIELDCAT_ALV,
GS_FIELD TYPE SLIS_T_FIELDCAT_ALV,
LAYOUT TYPE SLIS_LAYOUT_ALV.
DEFINE MACRO_APPEND_FIELDCAT.
CLEAR:GS_FCAT.
GS_FCAT-FIELDNAME = &1.
GS_FCAT-KEY = &2.
GS_FCAT-SELTEXT_S = &3.
GS_FCAT-SELTEXT_M = &3.
GS_FCAT-SELTEXT_L = &3.
GS_FCAT-REF_TABNAME = &4.
* GS_FCAT-NO_ZERO = &5. "不显示前导0
APPEND GS_FCAT TO GT_FCAT.
END-OF-DEFINITION.
*&---------------------------------------------------------------------*
*& 选择屏幕
*&---------------------------------------------------------------------*
*SELECTION-SCREEN
*PARAMETERS:P_CODE TYPE EBAN-ZZBUDGETCODE OBLIGATORY.
SELECT-OPTIONS:S_CODE FOR EBAN-ZZBUDGETCODE OBLIGATORY.
AT SELECTION-SCREEN.
* PERFORM FRM_BEFORE_EXECUTE.
START-OF-SELECTION.
DATA(l_guid) = zcl_util_log=>create_log( ).
PERFORM FRM_GET_DATA.
zcl_util_log=>save_log( l_guid )."保存日志到数据库 ADD BY GYX D20230720
PERFORM FRM_ALV_DISPLAY .
END-OF-SELECTION.
FORM FRM_GET_DATA.
SELECT
*
FROM EBAN
INTO CORRESPONDING FIELDS OF TABLE GT_EBAN
* WHERE ZZBUDGETCODE = P_CODE
WHERE ZZBUDGETCODE IN S_CODE
.
SELECT *
FROM ZTMM0048
INTO CORRESPONDING FIELDS OF TABLE GT_ZTMM0048
* WHERE BUDGETCODE = P_CODE.
WHERE BUDGETCODE IN S_CODE.
IF GT_ZTMM0048 IS INITIAL.
MESSAGE '该BUDGETCODE不存在,请联系IE!' TYPE 'E' DISPLAY LIKE 'E'.
ELSE.
LOOP AT GT_ZTMM0048 INTO GS_ZTMM0048.
CLEAR:GS_ALV-ZZCGSQJE.
LOOP AT GT_EBAN INTO GS_EBAN WHERE ZZBUDGETCODE = GS_ZTMM0048-BUDGETCODE AND LOEKZ <> 'X'.
* GS_ALV-ZZCGSQJE = GS_ALV-ZZCGSQJE + GS_EBAN-PREIS * GS_EBAN-MENGE.注释 BY GYX 20230815
GS_ALV-ZZCGSQJE = GS_ALV-ZZCGSQJE + GS_EBAN-ZZPRICE * GS_EBAN-MENGE.
ENDLOOP.
GS_ALV-MANDT = GS_ZTMM0048-MANDT.
GS_ALV-BUDGETCODE = GS_ZTMM0048-BUDGETCODE.
GS_ALV-ZZYSZJE = GS_ZTMM0048-ZZYSZJE.
GS_ALV-ZZSYJE = GS_ALV-ZZYSZJE - GS_ALV-ZZCGSQJE.
APPEND GS_ALV TO GT_ALV.
CLEAR:GS_ALV,GS_EBAN.
ENDLOOP.
ENDIF.
ENDFORM.
FORM FRM_ALV_DISPLAY.
LAYOUT-COLWIDTH_OPTIMIZE = ABAP_TRUE.
MACRO_APPEND_FIELDCAT 'MANDT' ABAP_TRUE '集团' SPACE .
MACRO_APPEND_FIELDCAT 'BUDGETCODE' ABAP_TRUE 'BUDGETCODE编码' SPACE .
MACRO_APPEND_FIELDCAT 'ZZYSZJE' ABAP_TRUE '预算总金额' SPACE .
MACRO_APPEND_FIELDCAT 'ZZCGSQJE' ABAP_TRUE '采购申请总金额' SPACE .
MACRO_APPEND_FIELDCAT 'ZZSYJE' ABAP_TRUE '剩余金额' SPACE .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_CALLBACK_PROGRAM = SY-REPID
* i_callback_pf_status_set = 'FRM_SET_pf_STATUS'
* i_callback_user_command = 'FRM_USER_COMMNAD'
IS_LAYOUT = LAYOUT
IT_FIELDCAT = GT_FCAT "LT_FIELDCAT
I_DEFAULT = 'X'
I_SAVE = ABAP_TRUE
TABLES
T_OUTTAB = GT_ALV
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.
545

被折叠的 条评论
为什么被折叠?



