当前位置: 首页 > news >正文

在 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 界面了。

相关文章:

  • Matlab激光雷达相机联合标定经验分享
  • JVM<二>JVM调优(你想要的调优都在这里了)
  • Flowable监听器动态调用Springcloud接口
  • 数字电路和模拟电路-3二极管与三极管、基本逻辑运算
  • 机器学习——BP神经网络详细介绍及案例Python代码实现
  • 了解如何通过 UltraEdit丨UEStudio 中的窗口停靠系统显示、控制和配置文件选项卡
  • Flutter SDK 自带的 10 个最有用的 Widget
  • 计算机网络-应用层篇-HTTP协议
  • Kafka 认证二:ScramLoginModule 认证及 Java 连接测试
  • 1024程序员节主题征文 | 程序员节节日祝福语大全
  • 【DETR 论文解读】End-to-End Object Detection with Transformer
  • 分类和回归-决策树算法(ID3、C4.5和CART)
  • JSP综合测评管理系统myeclipse定制开发SQLServer数据库网页模式java编程jdbc
  • 【微服务】如何实现微服务集群的高可靠?
  • 万字带你入门Go语言(建议收藏)
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • CSS 三角实现
  • JavaScript新鲜事·第5期
  • js ES6 求数组的交集,并集,还有差集
  • js操作时间(持续更新)
  • Python_网络编程
  • Python学习之路13-记分
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 动态魔术使用DBMS_SQL
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 收藏好这篇,别再只说“数据劫持”了
  • 手机端车牌号码键盘的vue组件
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 移动端唤起键盘时取消position:fixed定位
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 怎样选择前端框架
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • 2017年360最后一道编程题
  • Spring Batch JSON 支持
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (floyd+补集) poj 3275
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)h264中avc和flv数据的解析
  • (转)IOS中获取各种文件的目录路径的方法
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .form文件_一篇文章学会文件上传
  • .gitignore文件---让git自动忽略指定文件
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET CORE 第一节 创建基本的 asp.net core
  • .Net Core和.Net Standard直观理解
  • .net mvc部分视图
  • .Net Winform开发笔记(一)