上一篇文章连煽情加引诱,嚯,果不其然,小伙伴们吃这一套,都纷纷表示已经搬好马扎,准备好了啤酒饮料花生米,坐等如何把这一坨程序融入到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状态的特殊性,不保证工具栏能够好用。
...