SM30是SAP提供的一个很方便进行表内容维护的工具,也是顾问不需要偷偷摸摸就能使用的一个数据导入工具,SAP自己的配置也大多是利用SM30里面完成,应用极广。
但是!SM30有几个非常不爽的缺陷,在维护数据比较多的时候会造成很大困扰和麻烦,比如没有排序、查找(包含模糊查找)、批量导入、导出、详细且直观的修改日志查看等等。
下面的代码就是给SM30补全这些功能。
先看下功能介绍:
如下图,我想找到物料描述里面有“开关”的行
这时候只要把光标放到物料描述这一列里面随便哪一行,然后优雅的按下Ctrl+F,或者点一下搜索按钮,立刻就会弹出一个对话框:”Sir,需要为您找点啥?”
“我想找到物料描述包含'开关'的” “No Problem,您直接输入开关俩字,然后再劳驾回个车”
找到的数据就显示在最上面的行了:
如果意犹未尽,还需要找到其他带“开关”的,只需要再按Ctrl+G
其实有了查找,排序也可以没有,但是谁能拒绝多一个趁手的功能呢?
排排序而已,这个功能说起来很简单,其实程序实现起来,,比说起来还要简单。用起来就更简单了,只要把光标放到想排序的列,降序、升序,随心所欲。
虽然我通常基本使用SE11/SE16/SE16N/S416N/S416D/S416H/ S4H16D/ S4H16H/S
4H16N来导出数据,但是用户依然希望在没有令人羡慕的查表权限的时候能导出他们维护的数据,多么淳朴的需求,这个必须满足。
只要点一下这个按钮,数据就都导出到文本文件了哦,而且还带着标题!
甚至点这个也可以直接用ALV来查看哦:
天哪,SM30没有批导入!多么丧心病狂!如果我说这个玩意才是真正限制着使用SM30维护大数据量的罪魁祸首,大概很多人会眼含热泪的说对对对对对对。
事实上,这个功能是如此的重要也是如此的难做,以至于我立志做这个功能的那一天熬夜到鸡叫都没有搞定,以至于随后几天又淋淋啦啦测试了好多场景才逐步完善好。
说了一顿有的没的,先看看导入的例子哈。很简单,只要在随便哪个地方,Excel、WORD、文本文件,复制出需要导入的数据(制表符分隔哦),点一下粘贴按钮,吧唧,妥了!导入多少条给你提示的明明白白的,如果有主键重复的,还能自动给去掉呢。有客官说一次性能导入多少条?万儿八千的没问题,三万五万也凑合,看你机器性能啦。
表更改日志这个东西吧,怎么说呢,可能你很久都用不到一次。一旦用到了,但是你没有,那就只能傻眼(有土豪客户能在PRD开表更改日志的除外)。
(说到日志,我写的ZILOG记录接口日志是最好用的, 不接受任何反驳! , 但是接受任何挑战。看似简单的
一个程序奇妙无穷玩法多样,既能记录飞快不耽误接口时间又能查询如飞让你查起来得心应手,很多公司拿着我第一版开源的改来改去,但总归是比我的后续版本差很多)
说远了,那么这个SM30日志有啥特点呢?
好用,直观,细节拉满,一切为用户着想就是它的特点,看看界面就知道了:
删除 的 数据:
更改的数据:有更改数据带黄底色显示,并标明了改前和改后的值
(最后图是之前数据,所以看上去字段不一样)
其实最后还有一个批量更改列数据的功能,但是用途不是那么大,纯粹是凑数的功能,不讲了,不值一提。
下面就是群众喜闻乐见的展示源码环节了 (暂不包含日志功能 ) ,谢谢我就能拿走。
下篇文章讲下如何改造生成的表格维护器,如何把这些代码塞进去。
*&---------------------------------------------------------------------**程序描述: 通用程序,给SM30增加排序/查找/导出/导入/批量修改/记录更改日志等功能*说明:需要把表做一个维护视图,不支持直接对表做SM30*----------------------------------------------------------------------**Baitianzhen 2019*----------------------------------------------------------------------*
*----------------------------------------------------------------------** 灰掉定位按钮* 在排序后,定位按钮会失效*----------------------------------------------------------------------*MODULE hide_position_button OUTPUT. LOOP AT SCREEN. IF screen-name = 'VIM_POSI_PUSH'. screen-input = '0'. MODIFY SCREEN. ENDIF. ENDLOOP.ENDMODULE. "hide_position_button OUTPUT
*&---------------------------------------------------------------------**& Module ZSM30ADDON_COMMAND INPUT*&---------------------------------------------------------------------*MODULE zsm30addon_command INPUT. IF function(4) = 'SEAR'. PERFORM tc_search. ELSEIF function(4) = 'SORT'. PERFORM sort_table. ELSEIF function(4) = 'EXPT'. PERFORM export. ELSEIF function = 'UPLD'. PERFORM upload. ELSEIF function = 'BATMOD'. PERFORM batch_change. ENDIF.ENDMODULE. " SEARCH_TABLE INPUT
*&---------------------------------------------------------------------**& 批量更改功能*& 选择需要批量更改的行,然后把光标放到需要更改的列,按批量更改按钮*& 如果没有选择行,则更改所有的行的值*&---------------------------------------------------------------------*FORM batch_change. DATA: lv_colnam TYPE name_feld, lv_tabnam TYPE char30, lv_fldnam TYPE char30. DATA: ls_column TYPE scxtab_column. DATA: lv_string TYPE string. FIELD-SYMBOLS: <lv_fldval> TYPE any.
GET CURSOR FIELD lv_colnam. SPLIT lv_colnam AT '-' INTO lv_tabnam lv_fldnam.
READ TABLE <vim_tctrl>-cols INTO ls_column WITH KEY screen-name = lv_colnam. IF sy-subrc <> 0 OR ls_column-screen-input = 0. RETURN. ENDIF.
PERFORM popup_getvalue USING lv_tabnam lv_colnam '' CHANGING lv_string sy-subrc. CHECK sy-subrc = 0.
LOOP AT extract. IF mark_extract > 0. CHECK <xmark> = 'M'. ENDIF.
ASSIGN COMPONENT lv_fldnam OF STRUCTURE extract TO <lv_fldval>. IF sy-subrc = 0. <lv_fldval> = lv_string. ENDIF.
IF <xact> <> 'N'. <xact> = 'U'. ENDIF. <status>-upd_flag = 'X'. MOVE-CORRESPONDING <vim_extract_struc> TO <table1>. PERFORM update_tab. ENDLOOP.ENDFORM.*&---------------------------------------------------------------------**& 批量上载数据*& 使用方法为在Excel复制数据后,按粘贴按钮即可把数据批量导入*& 数据格式为SM30"新条目"界面中所看到的列*& 如果是C类型数据,且没有指定区分大小写,则转为大写*& 如果已经存在相同主键数据,则本条数据不导入,并有提示*& 如果存在转换例程,会转为内部格式*&---------------------------------------------------------------------*FORM upload. DATA: ls_column TYPE scxtab_column. DATA: lv_fmname TYPE rs38l_fnam. DATA: lv_insrow TYPE i, lv_delrow TYPE i. DATA: lt_fldcat TYPE lvc_t_fcat, ls_fldcat TYPE lvc_s_fcat. DATA: lr_table TYPE REF TO data, lr_lines TYPE REF TO data.* DATA: ls_exfld TYPE vimexclfld. FIELD-SYMBOLS: <lt_table> TYPE STANDARD TABLE, <ls_lines> TYPE any, <lv_field> TYPE any.
"数据格式为SM30"新条目"界面中所看到的列 LOOP AT <vim_tctrl>-cols INTO ls_column. SPLIT ls_column-screen-name AT '-' INTO ls_fldcat-ref_table ls_fldcat-ref_field.* READ TABLE excl_rpl_tab INTO ls_exfld WITH KEY fieldname = ls_fldcat-ref_field.* CHECK sy-subrc <> 0. ls_fldcat-fieldname = ls_fldcat-ref_field. APPEND ls_fldcat TO lt_fldcat. ENDLOOP.
"生成动态内表,以接受剪贴板数据 CALL METHOD cl_alv_table_create=>create_dynamic_table EXPORTING it_fieldcatalog = lt_fldcat IMPORTING ep_table = lr_table. ASSIGN lr_table->* TO <lt_table>. CREATE DATA lr_lines LIKE LINE OF <lt_table>. ASSIGN lr_lines->* TO <ls_lines>."导入剪贴板数据 PERFORM cliptoitab TABLES <lt_table>.
nextline = 1. LOOP AT extract INTO extract. IF <xact> = 'N'. nextline = nextline + 1. ENDIF. ENDLOOP.
LOOP AT <lt_table>...