上一篇文章连煽情加引诱,嚯,果不其然,小伙伴们吃这一套,都纷纷表示已经搬好马扎,准备好了啤酒饮料花生米,坐等如何把这一坨程序融入到SM30了。
虽然我这几天忙的有点头大,但是俺们向来一言九鼎,决不食言,还是言简意赅的来一个无废话版的使用方法,下面用一个实例来说明:
假设有这么一个配置表:
需求是:工厂、库存地、物料、数量都是用户输入,基本单位自动带过来物料的基本单位。在SM30维护的时候需要带出来库存地名称,物料描述,但是不需要保存(插一句,但凡在自定义表里面保存诸如物料描述等主数据描述的,都是雏儿,描述一变更就傻眼)。
1、首先给表定义好外键:
外键的用途一个是SM30维护的时候能自动带出来Search Help,再就是可以做值的有效性检查,还有就是自动带出描述也需要有外键。
2.、创建一个维护视图ZSM30T3V:
非常不建议直接对表做表维护生成器,原因挺多,比如我们这次要做的,如果直接对表ZSM30T3做表维护生成器,如果想带出来库存地的描述和物料描述就得费很大劲,还要写SM30的Event,所以大家都养成创建一个维护视图再创建维护生成器的习惯。
有三个字段设置为R(只读),是因为两个描述需要自动带出来,不样修改,另一个是单位,也是自动带出来的,也不让修改。
3、现在,一个表格维护器就做好了,可以使用SM30来维护:
输入该输入的,能带出来该带出来的,很好。
好了,进入今天的正题了,先新建一个I类型程序,
程序名:ZSM30ADDONI01,把昨天的那一坨代码贴进去,保存,激活之。
这个步骤只需要做这一次,以后就不需要做了。
接着就要开始打补丁了,相当的简单,掏出来程序:ZSM30ADDON,填上刚维护视图的名称,点一下执行,Duang~走你~
欧了,现在再去SM30看看:
就这么简单?对,就是这么简单。
因为复制的ZSM30ADDON的GUI状态,按钮都已经加好了,所以没有添加按钮的过程。
对函数组的修改主要有下面这些:
下面是自动Duang程序ZSM30ADDON的代码:
*&---------------------------------------------------------------------*
*& SM30扩展功能
*& Baitianzhen 2019-7-24
*&---------------------------------------------------------------------*
REPORT zsm30status NO STANDARD PAGE HEADING .
TABLES: tvdir,tvimf.
DATA: h TYPE d020s.
DATA: f TYPE TABLE OF d021s WITH HEADER LINE.
DATA: e TYPE TABLE OF d022s WITH HEADER LINE.
DATA: m TYPE TABLE OF d023s WITH HEADER LINE.
DATA: dy_id TYPE dynpro_id,
dy_msg TYPE char256,
dy_lnr TYPE sy-tabix,
dy_wrd TYPE d021s-fnam.
DATA: lines TYPE i.
DATA: trkorr TYPE e070-trkorr.
DATA: funcpool TYPE trdir-name. "维护程序生成的函数组主程序名
DATA: inc_name TYPE program VALUE 'ZSM30ADDONI01'.
DATA: it_pcode TYPE STANDARD TABLE OF char256.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE btxt1.
PARAMETERS p_mview TYPE viewname16 OBLIGATORY.
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE btxt2.
PARAMETERS: p_copy AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF BLOCK b2.
AT SELECTION-SCREEN OUTPUT.
btxt1 = '维护视图'.
btxt2 = '选项'.
%_p_mview_%_app_%-text = '维护视图名称'.
%_p_copy_%_app_%-text = 'COPY工具栏'.
START-OF-SELECTION.
SELECT SINGLE * FROM tvdir WHERE tabname = p_mview.
IF sy-subrc <> 0 OR tvdir-area = ''.
MESSAGE s000(oo) WITH '还没有维护视图'.
ELSEIF tvdir-bastab = 'X'.
MESSAGE s000(oo) WITH '不是针对视图创建的Table maintenance'.
ELSE.
CONCATENATE 'SAPL' tvdir-area INTO funcpool.
IF p_copy = 'X'.
CALL FUNCTION 'RS_CUA_COPY'
EXPORTING
cobjectname = funcpool
objectname = 'ZSM30ADDON'
suppress_checks = 'X'
EXCEPTIONS
OTHERS = 9.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
CALL FUNCTION 'RS_TOOL_ACCESS'
EXPORTING
operation = 'ACTIVATE'
object_name = funcpool
enclosing_object = funcpool
object_type = 'CUAD'
EXCEPTIONS
OTHERS = 9.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
tvimf-tabname = p_mview.
tvimf-event = 'ST'.
tvimf-formname = funcpool.
MODIFY tvimf FROM tvimf.
UPDATE eudb SET langu = sy-langu
WHERE relid = 'CU' AND
name = funcpool.
ENDIF.
IF tvdir-devclass <> '$TMP'.
PERFORM tvimf_request USING p_mview.
ENDIF.
***屏幕流添加MODULE
dy_id-prog = funcpool.
dy_id-dnum = tvdir-liste.
IMPORT DYNPRO h f e m ID dy_id.
FIND 'HIDE_POSITION_BUTTON' IN TABLE e IGNORING CASE.
IF sy-subrc <> 0.
FIND 'LISTE_INITIALISIEREN' IN TABLE e IGNORING CASE MATCH LINE lines.
IF sy-subrc = 0.
lines = lines + 1.
INSERT ' MODULE HIDE_POSITION_BUTTON.' INTO e INDEX lines.
ENDIF.
ENDIF.
FIND 'ZSM30ADDON_COMMAND' IN TABLE e IGNORING CASE.
IF sy-subrc <> 0.
APPEND ' MODULE ZSM30ADDON_COMMAND.' TO e.
ENDIF.
CALL FUNCTION 'RS_CORR_INSERT'
EXPORTING
global_lock = ' ' " 'LIMU DYNP'
object = dy_id
object_class = 'SCRP'
master_language = sy-langu
korrnum = trkorr
IMPORTING
korrnum = trkorr
EXCEPTIONS
OTHERS = 04.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
EXPORT DYNPRO h f e m ID dy_id.
GENERATE DYNPRO h f e m ID dy_id MESSAGE dy_msg LINE dy_lnr WORD dy_wrd.
***在函数组添加INCLUDE语句
READ REPORT funcpool INTO it_pcode.
FIND 'ZSM30ADDONI01' IN TABLE it_pcode IGNORING CASE.
IF sy-subrc <> 0.
APPEND ` INCLUDE ZSM30ADDONI01.` TO it_pcode.
INSERT REPORT funcpool FROM it_pcode .
ENDIF.
CALL FUNCTION 'REPS_OBJECT_GENERATE'
EXPORTING
i_program = funcpool
i_with_dialog = 'X'
EXCEPTIONS
syntax_error = 1
generation_error = 2
OTHERS = 3.
MESSAGE s000(oo) WITH '完成'.
ENDIF.
*&---------------------------------------------------------------------*
*& Form tvimf_request
*&---------------------------------------------------------------------*
FORM tvimf_request USING viewname.
DATA: trkorr TYPE e070-trkorr,
task TYPE e070-trkorr,
e071k TYPE e071k OCCURS 0 WITH HEADER LINE,
e071 TYPE e071 OCCURS 0 WITH HEADER LINE.
DATA: vim_name TYPE vim_name.
vim_name = viewname.
e071-objfunc = 'K'.
e071-pgmid = 'R3TR'.
e071-object = 'TABU'.
e071-obj_name = 'TVIMF'.
APPEND e071.
e071k-pgmid = 'R3TR'.
e071k-mastertype = 'TABU'.
e071k-object = 'TABU'.
e071k-mastername = 'TVIMF'.
e071k-objname = 'TVIMF'.
CONCATENATE vim_name 'ST' INTO e071k-tabkey RESPECTING BLANKS.
APPEND e071k.
CALL FUNCTION 'TR_ORDER_CHOICE_CORRECTION'
EXPORTING
iv_category = 'SYST'
IMPORTING
ev_order = trkorr
ev_task = task
EXCEPTIONS
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 FUNCTION 'TR_APPEND_TO_COMM_OBJS_KEYS'
EXPORTING
wi_simulation = ' '
wi_suppress_key_check = ' '
wi_trkorr = task
TABLES
wt_e071 = e071
wt_e071k = e071k
EXCEPTIONS
OTHERS = 68.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM. "tvimf_request
考虑到让兄弟不再经历挨个添加按钮的艰辛,我把程序ZSM30ADDON使用SAPLINK打了一个包放到QQ群:15881589的群文件里面了,因为GUI状态的特殊性,不保证工具栏能够好用。
最保险最简单的方式是参考这个:通过请求跨系统COPY程序、配置等 ,通过请求的方式把程序传到系统。请求文件也在群文件里面。
如果想完全自己添加按钮,打造一个完全符合自己审美的工具栏,做法请移步:SM30添加排序功能