美文网首页SAP
回答朋友提问:如何在 SAPGUI 自己绘制的 Screen 里

回答朋友提问:如何在 SAPGUI 自己绘制的 Screen 里

作者: 华山令狐冲 | 来源:发表于2024-07-20 10:01 被阅读0次

有朋友提问:

SAPGUI 里自己画的 Screen,能定制背景图片和颜色吗?

首先明确一点,SAPGUI 里自行开发 Screen,这算是传统 Dynpro 编程的范畴。

在传统 Dynpro 编程里,给自己创建的 Screen 里添加背景图片,这个需求可以实现,使用的技术是 SAP HTML Viewer.

SAP HTML Viewer 能够允许 ABAP 开发人员使用 HTML 语言来编写 Screen 的界面,这些界面可以通过 HTML 的原生语法来触发事件,以支持用户交互。

与传统 HTML 页面不同的是,前者的用户点击事件,通过运行在浏览器环境里的 JavaScript 代码响应。

而使用 SAP HTML Viewer 编写的页面,其用户点击事件,通过 Viewer 所在的 ABAP 报表内的 ABAP 代码响应并处理。

SAP HTML Viewer 编程这项技术属实非常非常古老了,诞生于上世纪,早于 SAP BSP 、SAP ABAP Webdynpro 和 SAP WebClient UI 这些基于浏览器的 UI 技术。

古老并不意味着无用。

事实上,ABAP 生态圈里大名鼎鼎的 ABAPGit,其 UI 就是采用 SAP HTML Viewer 绘制的。


上图是 ABAPGit 的 home 页面。下图是这个 home 页面通过 SAP HTML Viewer 渲染的入口:show_url 方法。


本文回答朋友的提问,简单介绍 SAP HTML Viewer 的工作原理。

SAP HTML Viewer 提供的 ABAP 编程接口,是名叫 CL_GUI_HTML_VIEWER 的类,如上图调试器里绿色高亮区域所示。

学习这个类的使用方法,最快捷的办法就是找到一个能够工作的现成例子。

笔者之前编写的 ABAP 从入门到提高的开发教程,里面有不少章节,都使用了 HTML Viewer 在 SAPGUI 里显示 PDF 文件。

不过可惜教程目前暂时无法访问,所以大家可以用 SAP 系统里自带的 Demo 报表,SAPHTML_EVENTS_DEMO 来学习。

这个报表执行后,能看到如下界面,其中嵌入了一个 HTML 页面,包含一个自定义的 Logo 和一张背景图片。这个 HTML 页面里包含一些可以触发事件的超链接和按钮。点击之后,能触发报表里的 ABAP 事件处理代码。

在 Screen Painter 里查看报表 SAPHTML_EVENTS_DEMO 的 Layout 设计。

其中定义了一个 Custom Control,名叫 HTML_CONTROL, 作为被嵌入的 HTML 页面的容器。

在报表的 ABAP 源代码的 PBO(Process Before Output)里,实例化这个 Custom Control(第 49 行),然后创建 CL_GUI_HTML_VIEWER 的实例,将 49 行创建好的 Custom Control 实例,通过构造函数传递给 HTML Viewer 实例,如下图第 53 行所示。

变量 html_control 存储的就是 HTML Viewer 实例。

然而余下的代码,我们并没有看到哪怕一行 HTML 源代码,只看到一个叫做 SAPHTML_EVENTS_DEMO_HOME 的对象 ID.

原来,我们需要在本地自行完成 HTML 的开发,然后将本地 HTML 文件,使用事务码 SMW0,上传到一个叫做 SAP Web Repository 的存储仓库去。

下图是已经上传完毕的该 HTML 页面文件,在 SAP Web Repository 中的存储截图。

时间为 2000 年 2 月 18 日,这个日子属实太遥远了。那一天我还在为当年的 7 月 7 日高考做着刷题冲刺。

通过工具栏的导出按钮,我们可以查看这个 HTML 页面的源代码:

源代码里的图例1,嵌入了一张图片,src 属性为 SAPLOGO.GIF. 同时第 5 行,给 BODY 元素即整个HTML 页面,通过 BACKGROUND 属性,维护了一张背景图片 HOME_BACKGROUND.GIF.

图例2 和图例3,定义了两个 FORM 元素,action 属性值的 SAPEVENT 前缀,告诉 ABAP 运行时,这两个 FORM 触发的事件,需要被 ABAP 应用内的代码拦截并处理。

SAPEVENT 前缀冒号后面的 SHOW_FRAMESET 即是具体的 ABAP 事件名称。ABAP 代码里根据这些事件名称,区分不同的 ABAP 事件并相应处理。

HTML 源代码里图片的显示,同样需要将待显示的文件,以本地文件的形式,上传到 SAP Web Repository 里。

下图 Object_id 指定的值就是将本地图片文件,上传到 SAP Web Repository 里使用的编号,Object_url 就是在 HTML 源文件里,用来赋给 img 元素 src 属性的值。

这两个值可以相同也可以不相同。

下图的语义是,我本地上传一个图片文件到 SAP Web Repository,使用 ID HTMLCNTL_TESTHTM2_SAPLOGO 来区分这个文件。

在 HTML 源代码里,通过 SAPLOGO.GIF 来显示这个文件。


下图是 Demo 报表里 SAP Logo 上传到 SAP Web Repository 里的记录,上传于 1997 年 2 月 28 日,当时香港都还没有回归......

同理,需要将作为背景显示的另一张图片,也上传到 SAP Web Repository 里去。

最后剩下的就是如何在 ABAP 代码里,接收 HTML 文件里触发的用户点击事件。

这其实就是传统 Dynpro 编程里的事件处理,这里不再赘述:

在 SAP 官网帮助文档里也有详细的事件处理介绍:

https://help.sap.com/doc/saphelp_snc700_ehp01/7.0.1/en-US/84/4a1c86a93311d2bd6e080009b4534c/frameset.htm

欢迎大家加入我的知识星球,一起讨论 SAP 业务和开发技术。

相关文章

  • Canvas

    1.Render Mode Screen overlay; 把画面绘制到设想机画面上 Screen Camera...

  • 迷糊

    提问 回答 吗啡 提问 回答 冰毒 提问 回答 中毒 提问 回答 病入膏肓了吧 提问 回答 爱国

  • 文章结论的这三种形式你听说过吗?

    前面,我讲过“问答思维”,所谓思考就是“提问—回答”,这里的回答,就是用结论来回答。当自己向自己提问,或别人向你提...

  • 我成了捅马蜂窝的人

    我在知乎回答问题,有个人提问如何帮助朋友走出负面情绪模式。我回答说你首先要学会保护自己。然后这个提问的人就在我的评...

  • 金牌讲师胡老师开课啦

    提问:如何在朋友圈做一个给力的捧场王? 回答:不知道,请胡老师教教我 01 旅游类 核心要点: 表现出羡慕嫉妒,就...

  • SAPGUI 里的 Belize Theme

    为了能够尽快使现有 SAPGUI 中运行的应用程序的外观和感觉适应 Fiori 2.0 设计和可用性范例——从技术...

  • 每日能量播报-Kin91 宇宙的蓝猴

    今天的提问是:“我如何在当下活出自己?” 我的回答是:“纯粹的玩乐,看破幻象。” 来到了蓝风暴波符的最后一天了,走...

  • 提问的回答

    感恩一路以来,我还可以再次找到自己,在这个只向钱看的年代,我却义无反顾的去追随内心那个自己,直到找到一个完整的回来

  • 提问?回答!

    进步的过程也就是求知的过程,所有的疑问被解决了,自然就会越来越强大。 可以说提问是求知的敲门砖...

  • 提问 ?回答!

    周五、周六、周日主要工作目标: 重要紧急:打电话回访家长! 听过讲座家长如何问 1问: 筛选出没报名测评的!询问是...

网友评论

    本文标题:回答朋友提问:如何在 SAPGUI 自己绘制的 Screen 里

    本文链接:https://www.haomeiwen.com/subject/rturhjtx.html