SAP-ABAP-SQL语句中CAST字段类型转换示例,CONCAT连接示例,SUBSTRING截断示例

本文只针对S/4 HANA 1809 及更高版本有效。

话不多说,先上示例代码,然后再慢慢讲解

  REPORT ZLQT_CAST.

  GET TIME STAMP FIELD DATA(timestamp).
  DELETE FROM demo_expressions.
  INSERT demo_expressions FROM @(
    VALUE #( id = 'X' timestamp1 = timestamp ) ).

  SELECT SINGLE
         FROM demo_expressions
         FIELDS CAST( CAST( DIV( timestamp1 , 1000000 )
                        AS CHAR )
                  AS DATS ) AS date,
                CAST( SUBSTRING( CAST( timestamp1
                                   AS CHAR ), 9, 6 )
                  AS TIMS ) AS time
         INTO @DATA(wa).

  cl_demo_output=>display( wa ).

输出截图

CAST,SUBSTRING,CONCAT联合起来在一个语句中使用


  SELECT  MSEG~WERKS ,
          MSEG~CPUDT_MKPF  ,
          MSEG~BUDAT_MKPF  ,
          MSEG~VBELN_IM  ,
          LIPS~VGBEL     ,
          VBAK~BSTNK     ,
          CONCAT( '      ' , CONCAT(  MSEG~VBELN_IM , SUBSTRING( CAST( MSEG~BUDAT_MKPF AS CHAR ),1,4 ) ) )   AS AWKEY
    ""为了构造20位char类型字段,与bkpf~awkey连表CONCAT 只能连接两个字段,所以这里用了两个CONCAT语句SUBSTRING只能剪切char类型字段,所以用cast转为char
    FROM  MSEG
    INNER  JOIN LIPS ON MSEG~VBELN_IM = LIPS~VBELN
    INNER  JOIN VBAK ON LIPS~VGBEL = VBAK~VBELN
    WHERE MSEG~BWART IN ( 'Z21' , 'Z22' )
    AND   MSEG~VBELN_IM <> ''
    AND   MSEG~WERKS = @P_BUKRS
    AND   MSEG~CPUDT_MKPF IN @S_BUDAT
    INTO  TABLE @DATA(LT_MSEG) .
    DELETE ADJACENT DUPLICATES FROM  LT_MSEG COMPARING ALL FIELDS .

1. 

 GET TIME STAMP FIELD DATA(timestamp).

作用是获取当前服务器时间,存储到timetamp。DATA(timestamp)是快速定义timestamp 。此时timestamp是P类型,此时该值等于20211020081246。

2.
 

 DELETE FROM demo_expressions.
  INSERT demo_expressions FROM @(
    VALUE #( id = 'X' timestamp1 = timestamp ) ).

这两句是对透明表demo_expressions做操作,先删除表数据,然后插入一行数据,为后面的sql语句做准备。

3.这段sql语句要从最里面的括号看起


  SELECT SINGLE
         FROM demo_expressions
         FIELDS CAST( CAST( DIV( timestamp1 , 1000000 )
                        AS CHAR )
                  AS DATS ) AS date,
                CAST( SUBSTRING( CAST( timestamp1
                                   AS CHAR ), 9, 6 )
                  AS TIMS ) AS time
         INTO @DATA(wa).
DIV( timestamp1 , 1000000 )

timestamp除1000000取正此时timestamp=20211020  。

然后再看次内层括号,根据上面的运算可以同等转换为

CAST( DIV( timestamp1 , 1000000 )  AS CHAR )
CAST( 20211020 AS CHAR )

做完此次运算后timestamp=20211020此时为char类型

然后再往外层括号看,此时原代码可以转换为

FIELDS CAST( CAST( DIV( timestamp1 , 1000000 )    AS CHAR )  AS DATS ) AS date,
FIELDS CAST( 20211020 AS DATS ) AS date,

AS DATS  代表类型转换为DATS类型,AS date代表select 语句中timestamp的别名是date。

至此该部分sql已经解释完了。后部分的sql也很有意思,大家可以尝试解读下。

后半部分的sql是先强转为CHAR类型,再使用SUBSTRING将数据截取出来,然后再强转为时间类型。

SAP,可以使用ABAP语言来获取字段的长度。引用\[1\]的代码示例展示了如何使用cl_abap_list_utilities=>dynamic_output_length方法来获取字符串的长度。例如,可以使用以下代码来获取字符串lv_str的长度: DATA: lv_str TYPE string, lv_len TYPE i. lv_str = '123456789'. lv_len = cl_abap_list_utilities=>dynamic_output_length( lv_str ). WRITE lv_len. 引用\[2\]的代码示例展示了如何使用ABAP来获取结构体字段的长度。通过使用cl_abap_structdescr类的describe_by_data方法,可以获取结构体字段的名称、类型、长度和小数位数。以下是一个示例代码: DATA: ls_mara TYPE mara. DATA: cl_descr TYPE REF TO cl_abap_structdescr. cl_descr ?= cl_abap_typedescr=>describe_by_data( ls_mara ). WRITE: / '字段名称 ', "字段名称 '字段类型 ', '字段长度 ', '字段小数位'. LOOP AT cl_descr->components ASSIGNING FIELD-SYMBOL(<fs_comp>). WRITE: / <fs_comp>-name, "字段名称 <fs_comp>-type_kind, "字段类型 <fs_comp>-length, "字段长度 <fs_comp>-decimals. "字段小数位 ENDLOOP. 如果需要在程序根据字段长度进行判断,可以使用类方法cl_abap_list_utilities=>dynamic_output_length来获取字段的长度,并根据需要进行处理。引用\[3\]的代码示例展示了如何使用if语句来判断字段长度,并根据条件进行相应的处理。 data: lv_len type i. lv_len = cl_abap_list_utilities=>dynamic_output_length( w_vbkd1-bstkd_e ). if lv_len <= 10. call function 'CONVERSION_EXIT_ALPHA_INPUT' exporting input = w_vbkd1-bstkd_e importing output = w_vbkd-vbeln. endif. 通过以上方法,可以在SAP获取字段的长度并进行相应的处理。 #### 引用[.reference_title] - *1* [SAP-ABAP-获取字符长度](https://blog.csdn.net/weixin_42152522/article/details/124099897)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [SAP 获取内表字段名](https://blog.csdn.net/JYH1999/article/details/128326994)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [SAP ABAP 使用类方法获取字符串长度](https://blog.csdn.net/wxyix7/article/details/130217712)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值