快速SAP GUI程序转换为FIORI研究

好多程序在SAP GUI上已运行正常,是想快速转程序到FIORI中使用,最直接的办法是从并头做FIORI,我们的多数SAPgui程序在读取数据显示到ALV,然后再对ALV选中行处理,而读取数据时逻辑很复杂,并不能使用简单的SELECL及SELECT关连来得到,使用association,JOIN等来关联数据得不到我们需要的结果 ,所以取数据需要用ABAP来实现,而如取数据常用已在SAP gui中实现,所以可以调用SAP gui的程序来实现读取,但SAPGUI中程序通常是用于ALV显示,所以需要在现有ALV中增加代码判断不是前台事务码GUI显示时不显示ALV,而把ALV保存到内存中,并在CDS的查询中取出此内存数据,这样来实现使用现有SAPGUI程序的读取逻辑。

对数据行的按钮处理逻辑也是类似的,可以最好把现有GUI处理逻辑写为一个函数,这样在CDS中增加ACTION时也可直接调用函数功能,

1.创建CDS

使用define root custom entity来创建CDS,创建时可参考现在ALV显示的结构来创建,所以为了方便最好在创建GUI的程序时,ALV显示的结构 最好也是SE11先定义好,

2.创建查询类

在CDS的定义中使用了@ObjectModel.query.implementedBy: ‘ABAP:ZCL_GUI_TO_FIORI’,这里定义了当此CDS在FIORI中查询时会调用ZCL_GUI_TO_FIORI,此类引用了接口IF_RAP_QUERY_PROVIDER,我们把查询数据的功能写在IF_RAP_QUERY_PROVIDER~SELECT中,在此方法中SUBMIT ztest_21现有程序,并返回,需要注意,现在程序如是ALV程序需要在显示 ALV程序地方做一些判断处理SY-CALLD = ‘X’(),通用可以在ALV显示前判断 一下,如是正常的GUI操作就继续,否则把数据保存到内表中并退出。

3.创建WHERE查询条件转换为RANGES的功能类

在上一个类中lv_conditions的值是SELCET 中WHERE后面的条件字符串值 。所以在调用现在程序时需要把条件值转换为RANGES值 ,使用类似DATA(ii_bukrs) = zcl_rap_cache=>get_ranges_from_sql( iv_sql_condition = lv_conditions
                                                               iv_field_name    = ‘BUKRS’ ).
      rs_bukrs = CORRESPONDING #( ii_bukrs ).的调用方式得到ranges值。

后面就可以发布为FIORI,使用RAP的结构方式创建Service Definitions,Service Bindings就可以生成ODATA了,也可以直接在Service Bindings测试FIORI APP.也可以使用VSCODE发布一个APP并上传到SAP中。

4.其它问题说明

上面生成的FIORI APP有一个直接的问题,当在列表中点击一行显示一行数据的对象页时不能显示数据,而此时并不能得到前一步骤中执行ztest_21得到的数据列表,而此时如果要显示数据还得重新再次执行一次数据查询,而现实中,明细行的数据查询条件并不能直接带入到现在GUI程序中,并且再次按现有GUI逻辑查询数据也影响速度,

使用了IMPORT FROM MEMORY ID,还使用的也静太类方法,全局变量等方法都不能解决这个问题,所以的结论是,要解决点击行快速显示行对象页,最好的解决办法就是,在查询列表页数据查询完成后,把数据保存到透明表中,DBKEY使用查询条件MD5加密后得到,这样在一些不会变化的结果查询查,可以使用此作为查询条件快速查询出结果数据。

设想了一个表结构如下:

” 表名: ZRAP_CACHE
” 类型: 透明表 (SE11)

字段名类型说明
MANDTMANDT客户端(主键)
DBKEYCHAR32MD5唯一标识(主键)
CDS_NAMECHAR30CDS视图名称(主键)(如’ZI_GUI_TO_FIORI’)
USER_NAMESYUNAME创建用户
SESSION_IDCHAR32会话ID(可选,用于更细粒度隔离)
CREATE_TIMETIMESTAMPL创建时间戳(精度到毫秒)
DATA_RAWSTRING序列化后的表数据(XML/JSON)
DATA_SIZEINT4数据大小(字节,可选)
HITSINT4命中次数(可选,用于统计)

这样在读取到列表后把数据调用CALL TRANSFORMATION id SOURCE data = lt_data RESULT XML DATA(lv_new_xml).生成XML数据,并保存到表中,并把自己历史的此CDS的数据都删除,

在确认是明细对象页时l_is_detail = ‘X’.”明细显示时按用户+日期从表中取出所有的数据并转换为DATA( CALL TRANSFORMATION id SOURCE XML lv_xml RESULT data = lt_data.

)来分析出查询条件的数据,如找到一行就显示这一行,如没找只能出错(理论上应该都能找到)