SAP dialog 程序 以及 ITS Mobile发布 实例

发布时间 2023-03-31 11:04:02作者: otowa

在做 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,有什么问题也欢迎在评论区提出,大家一起成长