在 ABAP 开发工具运行时错误显示界面里植入思否猫

我们开发人员每天编程,调试代码,不可避免地会遇到运行时异常和运行时错误。一旦运行时错误发生,程序会非正常终止,标志着程序的实际执行情况同我们的预期有差异,想必每一位开发人员看到运行时错误心情都不会太好。

笔者平时使用的后台开发语言是 ABAP,使用的开发 IDE 是 SAPGUI,因此尝试着把思否社区的吉祥物,一只可爱的思否猫,植入到 ABAP 运行时错误显示界面上来,试图让思否猫给遇到运行时错误的倒霉的开发人员一丝慰藉。

ABAP 开发工具里显示运行时错误的事物码为 ST22,其标准实现 ABAP 程序名称为 SAPMS380.

按照笔者文章介绍的步骤开发完成后,效果如下:

这是在我的 ABAP 系统里的实现效果:

下面是详细的实现步骤。

我们使用 ABAP 增强工具,对这个系统级别的 ABAP 报表进行增强,在增强里创建我们自己的植入思否猫的逻辑。

我们在这个报表的 READ_SNAPT 的 subroutine 里做增强,这个 subroutine 在运行时异常的具体内容,从数据库表读取到 ST22 界面时调用,因此这是一个最佳的植入思否猫图案的 hook 所在:

名叫 read_snapt 的 subroutine,其输出参数 text_out, 存放的就是显示在 ST22 事物码运行时的明细信息,因此我们创建一个隐式增强,把思否猫对应的字符格式的图案,添加到输出参数 text_out 即可。

隐式增强的源代码如下图所示:

ENHANCEMENT 1  ZST22_ENHANCEMENT.    "active version
data: lt_god like text_out[] with header line.

  define add_line.
    append &1 to lt_god.
  end-of-definition.

  add_line: ''.

  if ttype = 'W'. "// What happened?
    insert lines of lt_god into text_out index 1.
  endif.
ENDENHANCEMENT.

代码实现有 5 个关键点:

  1. 给 subroutine READ_SNAPT 创建隐式增强。
  2. 定义一个内表 lt_god,用于存储思否猫的字符图案内容。
  3. 定义一个宏,用于将思否猫逐行的字符图案内容,拼接到内表 lt_god 中。
  4. 在增强实现里调用 add_line 宏,将完整的思否猫图案内容,注入到内表 lt_god 中。
  5. 将内表 lt_god 包含的思否猫图案完整内容,添加到 subroutine read_snapt 的输出参数 text_out 中,这样思否猫的字符图案,将会出现在 ST22 显示界面的头部。

至此 ABAP 系统的增强工作就实现完毕了,剩下的则是将官网下载的思否猫图片,转换成纯粹的字符显示形式,这样我们就可以将这些字符,直接粘贴到前文介绍的 READ_SNAPT subroutine 实现的隐式增强内部。

42 行 Python 代码即可搞定:

import base64
import re
from io import BytesIO
from PIL import Image
import base64

file_path = 'C:/temp/cat.png'
 
img = Image.open(file_path)

char = list('M3NB6Q#OC?7>!:–;. ')

# 颜色值映射字符串
def get_char(r, g, b, alpha=256):
    if alpha == 0:
        return ' '

    grey = (2126 * r + 7152 * g + 722 * b) / 10000

    char_idx = int((grey / (alpha + 1.0)) * len(char))
    return char[char_idx]

img = Image.open(file_path)

img_widht = img.size[0]
img_height = img.size[1]

# 设定缩放比例
scale_width = 0.2  # 0.75
scale_height = 0.2  # 0.5

# 缩放图片
img = img.resize((int(img_widht*scale_width),
                 int(img_height*scale_height)), Image.NEAREST)

text = ''
for i in range(int(img_height*scale_height)):
    for j in range(int(img_widht*scale_width)):
        text += get_char(*img.getpixel((j, i)))
    text += '\n'

print(text)

我们使用 Python 提供的 PIL 库,读取包含思否猫的图片文件,取得其宽度和高度之后,逐一便利图片每一行的每一个像素,将其 RGB 值利用公式转换成灰度值,再把这些灰度值转换成字符数组 char 的索引。这样,思否猫图片的每一个像素,就唯一对应字符数组里的一个字符。我们把这些字符拼接到输出变量 text 里。

将上述 Python 代码另存为成 cat.py 文件,利用命令行 python cat.py > result.txt, 然后将 result.txt 的内容复制到 ABAP 报表 SAPMS380 的隐式增强实现里即可。

最后我们做一个测试,新建一个 ABAP 报表,随便写一句会引起运行时异常的代码,比如 ASSERT 1 = 0,然后执行:

我们会立即跳转到 ST22 事物码的运行时错误输出界面,Runtime Errors 字段值为 ASSERTION_FAILED, 这正是 ASSERT 1 = 0 引起的运行时错误。

从图中可以看到,思否猫的图案已经成功嵌入到 ST22 界面了。

原文地址:https://cloud.tencent.com/developer/article/2138135

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340