需求:源系统中
mb52无法满足,现在需要在原有的基础上对mb52所对应的程序进行修改增加字段
1.我们以面向对象的方式进行对MB52对应的程序分析
2.报表程序一本分为哪几部分
3.哪些字段是需要展示的
首先我们操作一下MB52大致就会有个思路.
按照下面的选择(具体根据个人的业务需求来,这里只是演示)

然后呢就会出现alv报表.
注意:如果你在复制该RM07MLBS后发现没有alv显示

发现是这样显示的.
解决方案

我们MB52找到程序RM07MLBS
使用SE93

我们不在原程序RM07MLBS中进行修改,而是直接复制一份使用.
复制完成之后先以SE80那样的结构去熟悉一下程序代码,他有六千多行,没有必要每行都了解.挑重点就行.
熟悉之后你会发现我们主要使用的是就这几个子程序:如下

前一个是宏定义,后一个就是alv输出了
然后字段只需要在bestand中添加即可

到这里我们的字段就添加完成了,接下来就是宏定义了.
找到macro_fill_fieldcat宏定义,我们主要看&1234这个对应的
&1:字段名
&2:表名
&3:字段可见性

然后就添加添加字段的宏定义即可

宏定义我们就添加完成,接下来就是数据查询.
数据查询的话就是两大步 查询数据和修改数据.
注意:lv_index = sy-tabix 不需要加一

查询代码(根据个人业务去查询数据)
IF bestand[] IS NOT INITIAL.
*具体数据查询SQL逻辑
SELECT t134t~mtbez ,t134t~mtart FROM t134t
INNER JOIN mara ON mara~mtart = t134t~mtart
INTO TABLE @DATA(lt_mtbez)
FOR ALL ENTRIES IN @bestand
WHERE t134t~mtart = @bestand-mtart .
SELECT zbmcl ,zggxh ,groes ,matnr
FROM mara
INTO TABLE @DATA(lt_mara)
FOR ALL ENTRIES IN @bestand
WHERE matnr = @bestand-matnr.
SELECT wgbez,matkl FROM t023t
INTO TABLE @DATA(lt_matkl)
FOR ALL ENTRIES IN @bestand
WHERE matkl = @bestand-matkl.
SELECT lgobe,lgort FROM t001l
INTO TABLE @DATA(lt_lgobe)
FOR ALL ENTRIES IN @bestand
WHERE lgort = @bestand-lgort.
SELECT atwrt,mch1~charg FROM mch1
INNER JOIN mchb ON mchb~charg = mch1~charg
INNER JOIN ausp ON ausp~objek = mch1~cuobj_bm
INTO TABLE @DATA(lt_atwrt)
FOR ALL ENTRIES IN @bestand
WHERE mch1~charg = @bestand-charg .
SELECT sobkz FROM mkol
INTO TABLE @DATA(lt_sobkz)
WHERE sobkz = 0.
LOOP AT lt_sobkz INTO DATA(ls_sobkz) WHERE sobkz = 0.
SELECT name1,lifnr FROM lfa1
INTO TABLE @DATA(lt_name1)
FOR ALL ENTRIES IN @bestand
WHERE lifnr = @bestand-lifnr.
ENDLOOP.
ENDIF.
*把查询的数据修改到bestand
LOOP AT bestand.
lv_index = sy-tabix .
*读取查询出来的数据内表,读取条件
READ TABLE lt_mtbez INTO DATA(ls_mtbez) WITH KEY mtart = bestand-mtart .
IF sy-subrc = 0.
bestand-mtbez = ls_mtbez-mtbez.
ENDIF.
READ TABLE lt_mara INTO DATA(ls_mara) WITH KEY matnr = bestand-matnr.
IF sy-subrc = 0.
bestand-zbmcl = ls_mara-zbmcl.
bestand-zggxh = ls_mara-zggxh.
bestand-groes = ls_mara-groes.
ENDIF.
READ TABLE lt_matkl INTO DATA(ls_matkl) WITH KEY matkl = bestand-matkl.
IF sy-subrc = 0.
bestand-wgbez = ls_matkl-wgbez.
ENDIF.
READ TABLE lt_lgobe INTO DATA(ls_lgobe) WITH KEY lgort = bestand-lgort.
IF sy-subrc = 0.
bestand-lgobe = ls_lgobe-lgobe.
ENDIF.
READ TABLE lt_atwrt INTO DATA(ls_atwrt) WITH KEY charg = bestand-charg.
IF sy-subrc = 0.
bestand-atwrt = ls_atwrt-atwrt.
ENDIF.
READ TABLE lt_name1 INTO DATA(ls_name1) WITH KEY lifnr = bestand-lifnr.
IF sy-subrc = 0.
bestand-name1 = ls_name1-name1.
ENDIF.
*把读取到的数据赋值给bestand具体字中
MODIFY bestand INDEX lv_index.
ENDLOOP.
从理论上来讲,和我们开发的报表是一样的,只不过这个是系统给到功能比较强大
但我们在对他进行修改的时候,发开的逻辑思维是一样的.先看程序的结构然后再做
以上都是个人开发经验,欢迎留言区讨论!!!