`
JerryWang_SAP
  • 浏览: 1025703 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

关于SAP ABAP字符变量和字符串变量字符个数的一个知识点,和一个血案

阅读更多

今天是2020年5月2日,五一国际劳动节小长假的第二天。让我们继续劳动起来。

使用ABAP strlen函数计算下列这4个字符和字符串变量中包含的字符个数。

 

 

大家先别急着滑动屏幕,先试着自己计算一下,看和标准答案是否有出入。也许大家觉得这些小的知识点没什么用,但Jerry马上会分享一个我实际处理过的客户incident,正是由于类似这种看似不起眼的小知识点没有留意,最后影响了项目进展。

 

 

正确答案,依次是:

  • 2
  • 1
  • 19
  • 17

逐一解释。

strlen( lv_s ) = 2

整型变量的值,整数1,赋给字符串变量lv_s, 这里发生一个隐式类型转换。

SAP帮助文档里声明,整型变量赋给字符串变量时,如果整数为负数,则字符串变量末尾为"-";如果整数为正数,则字符串变量末尾为空白字符。换言之,当整型变量到字符串变量的隐式类型转换发生时,字符串变量末尾会多出一位,代表赋值源头的整型数的符号位。

 

 

lv_s多出来的这个空白字符在调试器里看得很清楚,2000正是空白字符的16进制编码。同时调试器里也能看到lv_s的字符串个数为2.

 

 

strlen( lv_s2 ) = 1

和前一例相比,lv_s2的复制操作没有出现隐式类型转换,而是直接被赋以了一个字符常量,故字符个数为1.

strlen( lv_ss) = 19

lv_ss的类型为SSTRING,实际就是一个CHAR20:

 

 

在调试器里,lv_ss有18个前导空白(leading blank)字符,字符"1"和1个尾部空白(trailing blank)字符组成,总共20个字符,调试器里的Technical Type显示为C(20).

 

 

那为什么strlen(lv_ss)不等于20,而等于19?SAP帮助文档里给出了答案——SSTRING即CHAR20这种变量,属于固定长度(fixed length)类型变量。当使用strlen函数计算这种变量的字符串个数时,尾部空白字符不应参加计数,所以要减一。

 

 

strlen( lv_s3) = 17

有了例三的基础,这个就很容易了。变量lv_s3类型是CHAR18,属于固定长度类型变量,因此strlen计算出的字符串个数为18 - 1 = 17.

第一个例子中,我们把一个整数直接赋给了一个字符串变量,发生了隐式类型转换。在实际项目中,这种隐式类型转换很容易出现在函数或者ABAP类方法的参数传递中。对于函数或ABAP类方法的形式参数,如果我们传递的实际参数类型和其类型不匹配,就会发生隐式类型转换,这种自动转换有时并非我们期望发生的,甚至容易被忽略。

看一个真实的例子。我曾经担任过一个俄罗斯的SAP CRM客户项目的Dev Angel,收到过一个性能相关的incident,客户打开某个UI的速度极其缓慢,甚至经常超时。

我通过调试,最终发现罪魁祸首位于下段代码。该代码从SAP CRM发起RFC调用,去SAP ERP读取数据,Max Hit设置为15,意思是期望ERP端至多返回15条记录。

 

 

然而从ERP端返回了总共408093条记录。显然,虽然通过硬编码指定Max Hit为15,却完全没有起到限制作用。

 

 

起初我想当然地认为这是ERP函数的bug,没有正确处理CRM调用端传递过来的Max Hit. 然而当我在调试器里单步执行到CRM函数内部查看iv_max_entries时,一下傻了眼:

 

 

它的值从15一下变成了3473457. 这个数字是什么鬼?!

再看函数的形式参数定义,iv_max_entries类型为整型,而二次开发顾问传入的硬编码值'15', 是一个字符值,我顿时恍然大悟。

 

 

'15'是怎么变成魔幻数字3473457的?

Jerry先不解释,而是请大家看下面这段代码:

 

 

执行,正好输出3473457这个魔幻数字。那么代码第四行31003500是哪里来的?其实就是字符串'15'的十六进制编码。

 

 

也就是说,二次开发顾问在RFC调用时,将硬编码的'15'传给了接受整型变量的函数参数IV_MAX_ENTRIES. 应该该参数类型为整型,所以'15'的十六进制编码'31003500'被自动转换成了对应的整型数3473457. 显然这不是开发顾问期望的行为,但因为程序能够继续运行,所以这个问题暂时被掩盖了。

而RFC调用完成之后,紧接着是一个嵌套的LOOP. 在Max Hit能按照期望工作的前提下,对于最多包含15条记录的内表,就算进行嵌套的LOOP操作也能很快完成。但如今因为Max Hit不工作,内表记录从最多15条一下子变成了超过40万条,在这么庞大规模的内表上进行嵌套LOOP操作,性能可想而知。

经历过这次incident的处理之后,我个人觉得,使用隐式类型转换的最佳实践就是根本不去用它。程序员在工作的时候,必须时刻清醒地知道自己在做什么,要扼住编译器的咽喉,而不要被编译器扼住了咽喉。

 

 

感谢阅读,祝大家五一节快乐。

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

0
0
分享到:
评论

相关推荐

    ABAP常用字符串操作

    ### ABAP常用字符串操作知识点详解 #### 一、字符串连接 在ABAP中,字符串连接是一种常见的操作方式,用于将两个或多个字符串合并成一个新的字符串。实现字符串连接的方法主要是通过`CONCATENATE`语句。 **语法...

    sapabap开发从入门到精通

    资源名称:sap abap开发从入门到精通 内容简介: 《SAP ABAP开发从入门到精通》以应用实例的形式,讲解了SAPABAP开发的相关知识点,详细介绍了SAPABAP开发者必须掌握的包与变更传输系统(CTS)、数据类型、数据库...

    SAP ABAP基础知识

    总的来说,SAP ABAP的基础知识涵盖数据类型、变量声明、系统变量、数据类型定义以及输出控制等方面,掌握这些基本概念是理解和编写SAP程序的第一步。通过深入学习和实践,开发者可以构建复杂的企业级应用程序以满足...

    SAP ABAP 电子书

    SAP ABAP(Advanced Business Application Programming)是SAP公司推出的一种高级业务应用编程语言,用于开发在SAP R/3和SAP NetWeaver平台上的应用程序。这些电子书提供了全面的资源,帮助学习者深入理解并掌握SAP ...

    SAP ABAP 开发环境和开发工具介绍

    SAP ABAP 开发环境和开发工具是 SAP 系统中最重要的组件之一,它提供了一个强大的开发平台,允许开发者创建、测试和部署 ABAP 程序。ABAP 是 SAP 系统中的主要编程语言,用于开发业务应用程序。 在 SAP 系统中,...

    ABAP开发从入门到精通-高清自学版 SAP+ABAP开发从入门到精通 SAP开发自学必读 SAP SAP开发自学入门到精通

    总之,"ABAP开发从入门到精通"的学习路径是一个全面的过程,不仅要求掌握编程基础,还要熟悉SAP系统的架构和业务流程。这个过程可能会涉及大量的实践项目,以便更好地将理论知识应用于实际工作场景。如果你对SAP和...

    SAP ABAP 实用程序开发攻略

    《SAP ABAP实用程序开发攻略》这篇文档主要向初学者介绍了SAP ABAP语言以及其在SAP系统开发中的应用,涵盖从基础知识到数据类型和开发工具的详细解释。 首先,文档开篇提到SAP技术架构及发展历程,这为读者提供了一...

    实战SAP程序开发——从实例学SAP ABAP编程.rar

    SAP是一种全球领先的业务软件系统,它用于企业管理各种复杂流程,包括财务、供应链、人力资源等。...实践是学习编程的最佳途径,这个资源提供了一个良好的起点,帮助你在SAP ABAP的世界里稳步前行。

    SAP ABAP初级培训手册

    本手册旨在为初级学员提供SAP ABAP的基本知识和实践经验,帮助他们快速掌握ABAP语言的基本语法和开发技术。以下是本手册的知识点概要: 一、ABAP基础语法 * ABAP语言的基本结构和组成 * 变量声明和赋值 * 数据类型...

    SAP ABAP官方教程

    《SAP ABAP官方教程》是一份针对SAP ABAP编程语言的重要学习资源,适合对这个领域感兴趣的初学者和有经验的开发者。ABAP(Advanced Business Application Programming)是SAP系统中的主要编程语言,用于开发企业级...

    sap abap query高级功能

    关于程序的生成,ABAP Query 还提供了一个独特的功能,即可以直接将查询转换为一个完整的 ABAP 报表程序。这样做可以让你进一步定制和优化生成的程序,包括调整性能、增加额外功能或修复潜在问题。这为那些需要更...

    SAP abap实例大全

    在深入探讨SAP ABAP的知识点之前,我们首先理解其基本概念:ABAP是一种过程驱动的语言,广泛用于构建SAP系统中的用户界面、业务逻辑和数据处理。 本资源包包含了一系列ABAP的实例代码,涵盖了从基础到高级的各种...

    SAP ABAP 1.4.4代码下载

    在实际应用中,SAP ABAP的开发者可能会使用SE80交易码来访问和编辑代码,或者通过ABAP Development Tools(ADT),这是一个基于Eclipse的现代开发环境,提供了更直观的界面和更强大的代码编辑、调试功能。...

    SAP ABAP入门PPT

    - 第一天的课程主要介绍了SAP ABAP的基础知识,包括ABAP的工作环境、开发工具——SAP Development Workbench(SE80),以及ABAP的数据类型、变量、常量和注释的基本概念。此外,还可能涉及基本的语法结构,如IF......

    SAP与ABAP字符的对应关系

    最全最易懂的SAP与ABAP字符的对应关系,MASTER DATA-主数据 Customer Master KNA1 Customer Basic Data KNB1 Customer Company Level Data客户的公司数据 KNVV Customer Sales Level Data 客户的销售数据 KNVP ...

    SAP ABAP编程手册

    10. **Web Dynpro ABAP**:这是ABAP的一个组件,用于开发基于Web的用户界面。这部分可能涵盖组件、视图和控制器的概念。 11. **ABAP测试和调试**:调试器的使用、单元测试和集成测试是软件开发的关键环节。手册将...

    《SAP ABAP开发详解与高端应用》.zip

    2. **数据类型**:在ABAP中,有多种数据类型,如CHAR、STRING、INT、FLOAT等,还有自定义数据类型和域,用于定义变量和常量。 3. **内部表**:内部表是ABAP中的动态数组,用于存储和处理大量数据。它们可以灵活地...

    ABAP字符串SQL Functions语法总结

    3. `INSTR(arg, sub)`: 这个函数用于在字符串`arg`中查找子字符串`sub`的第一个出现位置,区分大小写。如果找不到,结果为0。例如: ```abap SELECT matnr, INSTR(vpsta, 'CV') AS num, ernam INTO TABLE @DATA(gt_...

    SAP ABAP开发从入门到精通

    《SAP ABAP开发从入门到精通》以应用实例的形式,讲解了SAP ABAP开发的相关知识点,详细介绍了SAP ABAP开发者必须掌握的包与变更传输系统(CTS)、数据类型、数据库、模块化程序、内表、调试、ABAP数据字典、锁对象...

Global site tag (gtag.js) - Google Analytics