SAP dialog 程序 以及 ITS Mobile发布 实例
在做 dialog+ITS Mobiel的时候遇到了很多的问题
查询了很多资料以及SAP官网资料 好在是终于解决了
发现了其实国内查找到的SAP ITS Mobile的资料确实很少
这里写一个详细demo以及过程记录一下 通过手机端访问自开发的dialog程序。
这里有一个比较重要的点 先提一下,在做dialog屏幕布局的时候
如果不涉及ITS Mobile,就不影响
如果涉及ITS Mobile,在做布局的时候,请参考SAP Note 1037715 - ITSmobile: Supported screen elements 查看移动端支持的屏幕控件,如果不支持,在使用ITS创建屏幕的时候是会报错的,切记。
最终结果展示
因为程序流程略长,先看下结果是否是你们需要的
SAP客户端测试如下
查询屏幕->结果屏幕
手机端测试如下
选择屏幕->结果屏幕
dialog程序
这里的dialog程序用的比较简单,只涉及两个屏幕,一个用于查询,一个展示查询结果
PBO和PAI
编写dialog的重点就是pbo和pai
pbo:process begin output 程序开始是 从程序->屏幕的显示字段
pai:process after input 程序结束 从屏幕->程序的写入字段
创建程序
事务码se38
新建程序Y_PNJ_DEMO04,程序放在本地包下即可
主程序代码
这里我把程序进行了分类
REPORT Y_PNJ_DEMO04.
"工具类 我把用到的代码 都提出来了 写在程序里,因此 这里可以注释
*INCLUDE zxxr_conv_common.
"变量 放在top包含文件
INCLUDE Y_PNJ_DEMO04TOP.
"pbo 放在o01包含文件
INCLUDE Y_PNJ_DEMO04O01.
"pai 放在i01包含文件
INCLUDE Y_PNJ_DEMO04I01.
"事件 放在e01包含文件
INCLUDE Y_PNJ_DEMO04E01.
"例程 放在p01包含文件
INCLUDE Y_PNJ_DEMO04P01.
定义变量
在Y_PNJ_DEMO04TOP包含文件中写入程序中所用到的变量
我这里做的例子是获取库存数据
TYPES: BEGIN OF ty_mard,
matnr TYPE mard-matnr,
werks TYPE mard-werks,
lgort TYPE mard-lgort,
labst TYPE mard-labst,
speme TYPE mard-speme,
END OF ty_mard.
DATA: gv_matnr TYPE mard-matnr.
DATA: gt_mard TYPE STANDARD TABLE OF ty_mard,
gs_mard TYPE ty_mard.
DATA: gt_fieldcat TYPE lvc_t_fcat,
gs_layout TYPE lvc_s_layo.
DATA: ok_code TYPE sy-ucomm, " 用于接收屏幕操作
save_ok TYPE sy-ucomm. " 接入ok_code屏幕操作 并清空ok_code
DATA : wa_container TYPE scrfname VALUE 'S_MARD', " 容器名
alv_grid TYPE REF TO cl_gui_alv_grid, " alv 类
wa_custom_container TYPE REF TO cl_gui_custom_container. " 容器 类
创建GUI标题以及GUI状态
创建GUI标题
程序->创建->GUI标题
创建GUI状态
程序->创建->GUI状态->配置功能键 BACK EXIT CANC
其中back为正常应用程序功能,EXIT和CANC为退出命令
创建屏幕9000
屏幕创建
程序->创建->屏幕->设定为9000
布局编辑
布局入口
整体展示
查询参数
按钮
属性
描述随意填写即可,最好是能让自己一眼看出来屏幕是做什么的
元素清单
只要添加 ok_code即可,其余的在你绘制布局的会自动生成
逻辑流代码:
PROCESS BEFORE OUTPUT.
MODULE status_9000.
PROCESS AFTER INPUT.
MODULE user_command_9000.
MODULE user_exit_9000 AT EXIT-COMMAND.
创建module
将MODULE status_9000 放在 INCLUDE Y_PNJ_DEMO04O01 包含文件下
将MODULE user_command_9000 以及 MODULE user_exit_9000 AT EXIT-COMMAND 放在 INCLUDE Y_PNJ_DEMO04I01 包含文件下
Y_PNJ_DEMO04O01包含文件
设置之前创建的GUI标题以及GUI状态
MODULE status_9000 OUTPUT.
SET PF-STATUS 'STATUS'.
SET TITLEBAR 'TITLE' WITH sy-dynnr.
ENDMODULE.
Y_PNJ_DEMO04I01包含文件
MODULE user_command_9000 INPUT.
save_ok = ok_code.
CLEAR:ok_code.
CASE save_ok.
WHEN 'BACK'.
LEAVE PROGRAM.
WHEN 'DISP'.
"获取数据
PERFORM frm_get_mard.
"获取fieldcat 和 layout
PERFORM frm_set_fieldcat.
PERFORM frm_set_layout.
"调用9001屏幕
CALL SCREEN 9001.
WHEN OTHERS.
ENDCASE.
ENDMODULE.
MODULE user_exit_9000 INPUT.
CASE save_ok.
WHEN 'EXIT'.
LEAVE PROGRAM.
WHEN 'CANC'.
LEAVE PROGRAM.
WHEN OTHERS.
ENDCASE.
ENDMODULE.
包含文件Y_PNJ_DEMO04P01
在上面9000屏幕调用9001屏幕时通过例程取数,例程相关代码写入Y_PNJ_DEMO04P01包含文件
*&---------------------------------------------------------------------*
*& Form frm_get_mard
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_get_mard .
"内外码转换,原本这个 宏是封装在 工具类包含文件了 这里我把这个单独提出来了,主程序里的工具类包含文件可以注释
DEFINE _conv_matnr. " 物料编码内外码转换
CASE &1.
WHEN 'IN'.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = &2
IMPORTING
output = &2
EXCEPTIONS
length_error = 1
error_message = 99.
WHEN 'OUT'.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
EXPORTING
input = &2
IMPORTING
output = &2
EXCEPTIONS
error_message = 99.
WHEN OTHERS.
ENDCASE.
END-OF-DEFINITION.
_conv_matnr 'IN' gv_matnr.
IF gv_matnr IS NOT INITIAL.
SELECT
FROM mard
FIELDS
mard~matnr,
mard~werks,
mard~lgort,
mard~labst,
mard~speme
WHERE mard~matnr = @gv_matnr
INTO CORRESPONDING FIELDS OF TABLE @gt_mard.
ELSE.
SELECT
FROM mard
FIELDS
mard~matnr,
mard~werks,
mard~lgort,
mard~labst,
mard~speme
INTO CORRESPONDING FIELDS OF TABLE @gt_mard.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_fieldcat
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_set_fieldcat .
DEFINE _set_fieldcat.
APPEND VALUE #(
fieldname = &1
ref_table = &2
ref_field = &3
coltext = &4
scrtext_l = &4
scrtext_m = &4
scrtext_s = &4
) TO gt_fieldcat.
END-OF-DEFINITION.
_set_fieldcat 'MATNR' 'MARD' 'MATNR' '物料号'.
_set_fieldcat 'WERKS' 'MARD' 'WERKS' '工厂'.
_set_fieldcat 'LGORT' 'MARD' 'LGORT' '存储地点'.
_set_fieldcat 'LABST' 'MARD' 'LABST' '未限制库存'.
_set_fieldcat 'SPEME' 'MARD' 'SPEME' '冻结库存'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_layout
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_set_layout .
gs_layout = VALUE #( zebra = abap_on
cwidth_opt = abap_on ).
ENDFORM.
创建屏幕9001
步骤类似9000,参考创建即可
布局展示
名称要和在Y_PNJ_DEMO04TOP包含文件里设置的变量一致
元素清单
和9000一致,添加ok_code即可
逻辑流
PROCESS BEFORE OUTPUT.
MODULE status_9001.
PROCESS AFTER INPUT.
MODULE user_command_9001.
MODULE user_exit_9001 AT EXIT-COMMAND.
创建module
和9000一样,pbo和pai放入各自的包含文件中去
Y_PNJ_DEMO04O01包含文件
新增如下代码
MODULE status_9001 OUTPUT.
SET PF-STATUS 'STATUS'.
SET TITLEBAR 'TITLE' WITH sy-dynnr.
"如果容器不存在,创建容器
IF wa_custom_container IS INITIAL .
CREATE OBJECT wa_custom_container
EXPORTING
container_name = wa_container.
ENDIF.
"在容器中创建alv
CREATE OBJECT alv_grid
EXPORTING
i_parent = wa_custom_container.
"填入数据
CALL METHOD alv_grid->set_table_for_first_display
EXPORTING
i_structure_name = 'GS_MARD'
is_layout = gs_layout
CHANGING
it_outtab = gt_mard
it_fieldcatalog = gt_fieldcat.
ENDMODULE.
Y_PNJ_DEMO04I01包含文件
新增如下代码
MODULE user_command_9001 INPUT.
save_ok = ok_code.
CLEAR:ok_code.
CASE save_ok.
WHEN 'BACK'.
LEAVE TO SCREEN 9000.
WHEN OTHERS.
ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module USER_EXIT_9001 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_exit_9001 INPUT.
CASE save_ok.
WHEN 'EXIT'.
LEAVE TO SCREEN 9000.
WHEN 'CANC'.
LEAVE PROGRAM.
WHEN OTHERS.
ENDCASE.
ENDMODULE.
编写事件
在程序开始时 调用9000屏幕
也就是在 Y_PNJ_DEMO04E01 包含文件下 编写如下代码
START-OF-SELECTION.
CALL SCREEN 9000.
SAP客户端测试如下
查询屏幕->结果屏幕
ITS Mobile配置
创建事务码
dialog程序创建事务码,并指定出实屏幕9000
事务码:se93
创建Internet服务
事务码:se80
选择开发对象->本地对象
程序->创建->其他(1)->Internet服务
服务名和事务码保持一致即可,之前有过一次不一致,结果一直不成功,也没查出来原因,所以保持一致稳妥一些
服务创建后底下会默认一个主题99,因为我这里已经在主题下创建屏幕了 因此这个图片是我新建一个Internet服务后截取拼接的
创建编辑器模板
这里选择编辑器模板就行,其实html模板更方便,会直接生成相关html代码,但是对于布局里的容器里的alv的展示有点问题,在手机端访问会报错,因此选择编辑器模板
注意这里的屏幕,你的程序中有几个屏幕就要创建几个屏幕的编辑器模板
创建完成后可以根据自己的需要去修改 不过一般也不需要去修改什么
根据编辑器模板创建HTML模板
HTML模板
自动生成模板如下,一般也不需要修改
完成服务
服务名右击->发布->完成服务
激活服务
事务码SICF
服务路径:/sap/bc/gui/sap/its/
创建一个新的服务
服务名和Internet服务名以及事务码保持一致即可
GUI配置
参数名称 | 值 |
---|---|
~ITSMOBILE | 1 |
~TRANSACTION | ZDIALOGTEST2 |
~THEME | 99 |
~GENERATEDYNPRO | 1 |
~SOURCES | ZDIALOGTEST2 |
~ALVGRIDPAGESIZE | 10 |
处理器清单配置
处理器:CL_HTTP_EXT_ITS
激活服务
测试服务
输入账号密码
记住这个网址
要登录需要配置自己电脑的hosts文件,这个可以百度配置一下就行
如果不想配置hosts文件,那就把域名改成SAP的ip地址即可
移动端测试
选择屏幕->结果屏幕
到此一个dialog + ITS Mobile的流程就走完了,因为我也算是初学ITS Mobile,有什么问题也欢迎在评论区提出,大家一起成长