【11】SAP ABAP性能优化 - SQL中CONCAT保留字符串拼接中的空格

1. CONCAT的问题

SAP的OPEN SQL中提供了丰富的字符串操作函数,其中较为常用的是CONCAT关键字,通过CONCAT可以实现两个字段字符串的拼接,但在拼接过程中,字符串间的空格会被“吃掉”,将拼接的结果组成一个完整连续的字符。

但很多情况下,我们是希望保留字段中的空格的,那么如何实现呢?

结合上篇博客【10】SAP ABAP性能优化 - 在SQL语句中操作String查询复合主键AWKEY中介绍的SQL中CONCA的用法,本文中将进一步介绍保留“空格”的方式。

2. 双重REPLACE实现空格的保留

为了保留空格,我们使用双重replace的方式,其核心代码如下:

示例代码:

TYPES: BEGIN OF ts_doc_key,
         bukrs TYPE bkpf-bukrs,
         belnr TYPE bkpf-belnr,
         gjahr TYPE bkpf-gjahr,
       END OF ts_doc_key,
       BEGIN OF ts_doc_header,
         bukrs TYPE bkpf-bukrs,
         belnr TYPE bkpf-belnr,
         gjahr TYPE bkpf-gjahr,
         awtyp TYPE bkpf-awtyp,
         awsys TYPE bkpf-awsys,
         awkey TYPE bkpf-awkey,
       END OF ts_doc_header.

DATA: lt_doc_key TYPE SORTED TABLE OF ts_doc_key WITH UNIQUE KEY bukrs belnr gjahr.
DATA: lt_header1 TYPE STANDARD TABLE OF ts_doc_header WITH EMPTY KEY,
      lt_header2 TYPE STANDARD TABLE OF ts_doc_header WITH EMPTY KEY,
      lt_header3 TYPE STANDARD TABLE OF ts_doc_header WITH EMPTY KEY
      .

BREAK-POINT.

**********************************************************************
*  CONCAT - Keep Blank 
**********************************************************************
* prepare 10 document keys
SELECT bukrs,
       belnr,
       gjahr
  FROM bkpf
  WHERE ( awtyp = 'BKPF' OR awtyp = 'BKPFF') AND ( bukrs = '88' OR bukrs = 'AAA') AND awkey IS NOT INITIAL
   INTO TABLE @lt_doc_key   UP TO 10 ROWS.

* different result
SELECT  a~bukrs AS bukrs,
        a~belnr AS belnr,
        a~gjahr AS gjahr,
        a~awtyp AS awtyp,
        a~awsys AS awsys,
        a~awkey AS awkey,
        concat( concat( b~belnr , b~bukrs ), b~gjahr ) AS wrong_awkey,
        concat( b~belnr, replace( replace( concat( rpad( b~bukrs, 4, '*' ), b~gjahr  ),
                                          '*', ' + ' ),
                                 '+', ' ' ) )
               AS right_awkey
FROM bkpf AS a INNER JOIN @lt_doc_key AS b
  ON a~bukrs = b~bukrs AND a~belnr = b~belnr
WHERE a~awtyp = 'BKPF' OR a~awtyp = 'BKPFF'
INTO TABLE @DATA(lt_result).

* concat ( BUKRS, BELNR, GJAHR ) to join the composite key BKPF-AWKEY.
SELECT a~bukrs,
       a~belnr,
       a~gjahr,
       a~awtyp,
       a~awsys,
       a~awkey
  FROM bkpf AS a INNER JOIN @lt_doc_key AS b
    ON a~awkey = concat( b~belnr, replace( replace( concat( rpad( b~bukrs, 4, '*' ), b~gjahr  ),
                                                    '*', ' + ' ),
                                           '+', ' ' ) )
 WHERE a~awtyp = 'BKPF' OR a~awtyp = 'BKPFF'
  INTO TABLE @lt_header1.

BREAK-POINT.

可以看到单纯CONCAT, 以及在拼接字符串时使用双重REPLACE后,实现保留空格的对比效果。

3. 字符串操作函数汇总

SAP在OPEN SQL中提供了丰富的字符串操作函数,对于遇到的具体问题,可以参照下面的程序寻找合适的解决方案。

REPORT demo_sql_function_string.

CLASS demo DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS main.
ENDCLASS.

CLASS demo IMPLEMENTATION.
  METHOD main.
    DELETE FROM demo_expressions.
    INSERT demo_expressions FROM TABLE @( VALUE #(
      ( id = 'X'
        char1 = ' 0123'
        char2 = 'aAaA' ) ) ).

    SELECT SINGLE
           char1 AS text1,
           char2 AS text2,
           CONCAT(            char1,char2 )     AS concat,
           CONCAT_WITH_SPACE( char1,char2, 1 )  AS concat_with_space,
           INSTR(             char1,'12' )      AS instr,
           LEFT(              char1,3 )         AS left,
           LENGTH(            char1 )           AS length,
           LOWER(             char2 )           AS lower,
           LPAD(              char1,10,'x' )    AS lpad,
           LTRIM(             char1,' ' )       AS ltrim,
           REPLACE(           char1,'12','__' ) AS replace,
           RIGHT(             char1,3 )         as right,
           RPAD(              char1,10,'x' )    AS rpad,
           RTRIM(             char1,'3' )       AS rtrim,
           SUBSTRING(         char1,3,3 )       AS substring,
           UPPER(             char2 )           AS upper
           FROM demo_expressions
           INTO @DATA(result).

    cl_demo_output=>display( result ).
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  demo=>main( ).

 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
《从实例学SAP ABAP编程1-10章》是一本SAP ABAP编程的经典入门教材。本书从简单的SAP ABAP编程入手,通过多个实例向读者展示了SAP ABAP编程的核心概念和语法。 在第一章,本书通过一个简单的例子介绍了SAP ABAP编程的基础知识,讲解了ABAP编辑器、ABAP数据字典和ABAP Workbench等重要工具的用法。 在第二章,本书通过一个简单的例子向读者介绍了ABAP表格的创建和维护,并讲解了一些与表格相关的SAP ABAP编程的语法和概念。 在第三章,本书介绍了SAP ABAP编程的面向对象编程,通过几个例子向读者展示了如何使用类、对象和继承等概念进行SAP ABAP编程。 在第四章,本书介绍了SAP ABAP编程的函数模块,向读者讲解了如何创建和调用函数模块,以及如何在SAP系统使用函数模块。 在第五章,本书介绍了SAP ABAP编程的异常处理,向读者讲解了如何使用TRY/CATCH语句处理SAP系统的异常情况。 在第六章,本书介绍了SAP ABAP编程的Web服务,向读者讲解了如何创建和使用SAP系统的Web服务,以及如何使用HTTP和SOAP协议进行数据通信。 在第七章,本书介绍了SAP ABAP编程的ALV报表,向读者讲解了如何创建和维护SAP系统的ALV报表,以及如何对报表进行数据操作和定制。 在第八章,本书介绍了SAP ABAP编程的BADI和Enhancement点,向读者讲解了如何使用BADI和Enhancement点扩展和修改SAP系统的业务逻辑。 在第九章,本书介绍了SAP ABAP编程的Smart Form,向读者讲解了如何使用Smart Form创建和维护SAP系统的表单。 在第十章,本书介绍了SAP ABAP编程SAP HANA数据库,向读者讲解了如何使用SAP HANA数据库进行高效的数据处理和分析。 通过阅读本书,读者可以快速掌握SAP ABAP编程的核心知识和技能,从而能够独立进行SAP系统的开发和维护工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十年铸器

给作者赏杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值