目录
SM30相关操作... 1
前提条件:创建的表必须支持表维护... 1
一、建立表维护,维护数据... 1
二、使用FM调用表维护,维护数据... 3
三、创建Tcode维护表维护... 4
四、使用BDC实现有限制条件的表维护... 7
前提条件:创建的表必须支持表维护
一、建立表维护,维护数据
SE11创建表维护:
点击保存即可,
SE80可见生成的FunctionGroup
二、使用FM调用表维护,维护数据
FM:VIEW_MAINTENANCE_CALL
代码如下:
其他参数自己查看FM,必输如上:
执行结果如下:
其中,action是只模式,显示/修改/传输
具体取值范围可以参考函数描述:
显示如下:
三、创建Tcode维护表维护
前台业务是不能直接sm30维护数据的,所以需要给他们创建tcode,
也会为此tcode分配权限,方便管控
Se93
一般只需要维护这两个参数
保存即可
输入tcode回车直接进入,
如果不勾选跳过第一个屏幕,执行结果是 :
有时候需要对维护的数据进行控制,可使用第二种,Eenter conditions
但是如果使用tcode或者调用FM方式控制显示数据我没有实现,
所以我就是用了BDC录屏:(录屏单独去介绍,这里不赘述)
代码见最后,效果如下:
特别注意的是:
点击返回时,进入的不是刚才的选择屏幕,而是:
为解决此,
我给刚bdc程序分配tcode:ZLM_SM30_BDC
在视图函数组中
添加了一个自定义的module: mdl_get_command
下面代码仅仅是简单范例,到时候需要考虑的有多个tcode
sy-ucomm = ende 或者 = abr 或者= okay 或者 = back等等的
BDC程序如下:
*&---------------------------------------------------------------------*
*& Report ZLM_TEST_SM30_BDC
*&
*&---------------------------------------------------------------------*
*&使用bdc调用带有控制的SM30表维护
*&---------------------------------------------------------------------*
REPORT zlm_test_sm30_bdc.
*&---------------------------------------------------------------------*
*& "BDC 变量
*&---------------------------------------------------------------------*
DATA: v_mode TYPE char1,
bdcdata LIKE bdcdata OCCURS 0 WITH HEADER LINE,
messtab LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE.
DATA: l_mm TYPE flag VALUE 'X'.
*&---------------------------------------------------------------------*
*& "选择屏幕
*&---------------------------------------------------------------------*
PARAMETERS:p_cmcode TYPE zmm00t_y_078-comcode.
START-OF-SELECTION.
EXPORT l_mm TO MEMORY ID 'M1'.
PERFORM frm_sub_bdc USING p_cmcode.
*&---------------------------------------------------------------------*
*& "BDC FORM区
*&---------------------------------------------------------------------*
FORM frm_sub_bdc USING p_cmcode TYPE zmm00t_y_078-comcode.
PERFORM bdc_dynpro USING 'SAPMSVMA' '0100'.
PERFORM bdc_field USING 'BDC_CURSOR'
'VIMDYNFLDS-LTD_DTA_AR'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=UPD'.
PERFORM bdc_field USING 'VIEWNAME'
'ZMM00T_Y_078'. "视图名称
PERFORM bdc_field USING 'VIMDYNFLDS-LTD_DTA_NO'
'' . "无限制模式赋值为空,或者不要这句话
PERFORM bdc_field USING 'VIMDYNFLDS-LTD_DTA_AR'
'X' . "限制模式为X
PERFORM bdc_dynpro USING 'SAPLSVIX' '0210'.
PERFORM bdc_field USING 'BDC_CURSOR'
'MARK_CHECKBOX(06)'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=OKAY'.
PERFORM bdc_field USING 'MARK_CHECKBOX(02)'
'X'. "控制条件选第二个复选框(COMCODE)
PERFORM bdc_dynpro USING 'SAPLSVIX' '0100'.
PERFORM bdc_field USING 'BDC_CURSOR'
'D0100_FIELD_TAB-UPPER_LIMIT(02)'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=OKAY'.
PERFORM bdc_field USING 'D0100_FIELD_TAB-LOWER_LIMIT(01)'
p_cmcode. "限制条件值下限(LOWER_LIMIT)还可以添加上限制(UPPER_LIMIT)
PERFORM bdc_dynpro USING 'SAPLZMM00T_Y_078' '0001'.
PERFORM bdc_field USING 'BDC_CURSOR'
'VIM_POSITION_INFO'.
CALL TRANSACTION 'SM30' USING bdcdata
MODE 'E' MESSAGES INTO messtab. "这里必须使用E类型
*A 显示所有屏幕
*E 显示错误
*N 后台的处理
*P 后台处理;可以调试
ENDFORM. "sub_bdc
"BDC 相关
*----------------------------------------------------------------------*
* Start new screen *
*----------------------------------------------------------------------*
FORM bdc_dynpro USING program dynpro.
CLEAR bdcdata.
bdcdata-program = program.
bdcdata-dynpro = dynpro.
bdcdata-dynbegin = 'X'.
APPEND bdcdata.
ENDFORM. "BDC_DYNPRO
*----------------------------------------------------------------------*
* Insert field *
*----------------------------------------------------------------------*
FORM bdc_field USING fnam fval.
IF fnam = 'BDC_OKCODE' AND fval = '/EBACK'.
LEAVE TO SCREEN 0.
ENDIF.
CLEAR bdcdata.
bdcdata-fnam = fnam.
bdcdata-fval = fval.
APPEND bdcdata.
ENDFORM. "BDC_FIELD
如果哪位不是使用bdc实现的最后一种情况,请告诉我一声,我也学习学习,谢谢