20分钟真正理解SmartForm
01、SmartForm介绍
SmartForm是SAP设置单据的工具,用于SAP单据的设置与打印,主要原理是类似于Qt开发(即软件界面开发),笔者会从Qt开发的视角去剖析SmartForm,结合笔者的心得,以期给读者带来不一样的感悟。
02、Qt开发的原理
Qt开发是一种图形用户界面应用框架,用于开发桌面端软件,原理图大致如下。
03、Qt开发的视角去分析SmartForm
SmartForm是SAP开发报表的框架,具体界面如下。
基于**Qt开发的原理分析SmartForm**,原理图如下所示。
04、SmartForm的优势与不足
SmartForm的优势
- 后端代码编写简单 :访问后端代码仅查询好表头和表单的数据,传入到对应的函数即可。
- 减轻开发人员负担:界面设计全界面化,无需代码编写,各界面设计模块负责对应的功能,减轻开发人员的负担。
SmartForm的不足
- 难理解 :对初学者小白而言难以理解,不知道数据的传输流程,不理解各界面设计模块之间的联系。
- 界面设计复杂:笔者觉得SAP本意是减少开发人员的复杂,但界面设计复杂繁琐,创建新窗口和模板时,界面窗口内并没有更详细的预览显示,初学者没有直观的理解,激活容易报错,降低学习的积极性。
05、基于SmartForm开发一个单据并打印
Smartform具体流程,参考这个博主:https://blog.youkuaiyun.com/java_zhong1990/article/details/132455896
笔者偷懒了,笔者也是参照这个博客,结合自己对SmartForm理解进行的开发,抱歉哈,内容太多了,会显得很冗余
(1)后端代码的编写
本文创建ZSD_VBAP表,读者可根据自己的需求进行更改,具体创建表流程,可参考这个博主:https://blog.youkuaiyun.com/weixin_45387285/article/details/128233642
TABLES: ZSD_VBAP.
SELECTION-SCREEN:BEGIN OF BLOCK b0 WITH FRAME TITLE TEXT-001.
"PARAMETERS: pa_file TYPE rlgrap-filename ."文件夹上传
SELECTION-SCREEN:END OF BLOCK b0.
INITIALIZATION.
* PERform INI_SELECTION_SCREEN. " 初始化选择屏上的变量
AT SELECTION-SCREEN.
* PERform INI_DATA. " 选择屏幕输入值的验证
START-OF-SELECTION.
* PERform PRECESS_DATA. " 主要数据处理逻辑
" --- 1 通过smartfroms 取到对应的函数名称, ZSF_SALESORDER --> /1BCDWB/SF00000039
DATA: lv_formname TYPE tdsfname.
DATA: w_sfname TYPE rs38l_fnam.
lv_formname = 'ZSD_SF_LONG'. "改成自己的SMART名字
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
formname = lv_formname
IMPORTING
fm_name = w_sfname
EXCEPTIONS
no_form = 1
no_function_module = 2
OTHERS = 3.
" --- 2 设置打印控制
DATA: w_control TYPE ssfctrlop,
w_output_options TYPE ssfcompop.
DATA: w_job_output_options TYPE ssfcresop.
w_output_options-tdimmed = 'X'.
w_output_options-tddelete = 'X'.
w_output_options-tddest = 'LP01'.
w_control-no_open = 'X'. "没有新的假脱机请求
w_control-no_close = 'X'. "不关闭假脱机请求
" --- 3 打开输出请求 SSF
CALL FUNCTION 'SSF_OPEN'
EXPORTING
output_options = w_output_options
control_parameters = w_control
IMPORTING
job_output_options = w_job_output_options
EXCEPTIONS
formatting_error = 1
internal_error = 2
send_error = 3
user_canceled = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'I' "sy-msgty
NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
RETURN.
ENDIF.
" --- 4 调用smartfrom 函数 ,传入打印参数
DATA: ls_head like zsd_vbak,
ls_item TYPE zsd_vbap,
lt_item TYPE STANDARD TABLE OF zsd_vbap.
REFRESH:lt_item.
CLEAR:ls_head.
ls_head-kunnr = 'ABCD666'.
ls_head-name1 = '闯哥'.
ls_head-vbeln = 'A1018'.
CLEAR:ls_item.
SELECT *
INTO CORRESPONDING FIELDS OF TABLE lt_item
FROM ZSD_VBAP.
CALL FUNCTION w_sfname
EXPORTING
control_parameters = w_control
zls_vbak = ls_head
IMPORTING
job_output_options = w_job_output_options
TABLES
zsd_vbap = lt_item
EXCEPTIONS
formatting_error = 1
internal_error = 2
send_error = 3
user_canceled = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno DISPLAY LIKE 'E'
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
LEAVE LIST-PROCESSING.
ENDIF.
* lv_i = lv_i + 1.
* ENDDO.
" --- 5 关闭打印机设置
DATA: job_output_options TYPE ssfcrescl.
CALL FUNCTION 'SSF_CLOSE'
IMPORTING
job_output_info = job_output_options
EXCEPTIONS
formatting_error = 1
internal_error = 2
send_error = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'I' "sy-msgty
NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
RETURN.
ENDIF.
(2)界面设计
进入Smartform界面