SAP实用代码(更新中)

参考:
SAP新语法
SAP新语法
SAP-ABAP-SELECT语法SQL语法详解

DATA : gt_sfli LIKE TABLE OF sflight,
        gt_sfli2 LIKE TABLE OF sflight.

SELECT * FROM sflight INTO CORRESPONDING FIELDS OF TABLE  gt_sfli.

*读取表中特定的行数据,(1.判断是否有index2.catch异常CX_SY_ITAB_LINE_NOT_FOUND)
DATA(ls_data) = gt_sfli[ 1 ] .
*------------------------------------------------------------------------------------------------------------
* line_exists判断内表中行是否有满足条件的,无需LOOP判断
 IF line_exists( gt_sfli[ CARRID = 'AA'  PLANETYPE = 'A340-600' ] ). "和Read的区别??? 都不能包含 <>.如何解决这个问题?

  ENDIF.
所以需要读取一条<> 某个值的该怎么办呢?
1.Loop
  如果只想取得内部表中不等于某条件的一条记录,那么请使用下面变通方法。
       LOOP AT itab WHERE KEY <> ‘XX’.
          此处取得第一条记录。
          EXIT.
       ENDLOOP.
2.REDUCE

```sql
定义数据类型
DATA it_spfli TYPE TABLE OF spfli.
DATA wa_spfli TYPE spfli.

*读取数据库中的内容
SELECT * FROM spfli
INTO TABLE it_spfli.

*DATA(lv_lines) = REDUCE i( INIT x = 0 FOR wa IN it_spfli WHERE ( CARRID <> 'AA' ) NEXT x = x + 1 ).
DATA(ls_line) = reduce spfli( init res TYPE spfli
                              for <fs_man> in  it_spfli WHERE ( CARRID <> 'AA' )
                               NEXT res = <fs_man> ).

*------------------------------------------------------------------------------------------------------------
*select 内表,可以对内表使用sql的语法。例如:取内表某一列的最大值,就可以直接MAX,无需排序后,读第一行,
*需要append a表 to B表时,但A表字段与B表字段数量不一致时,可以使用
SELECT FROM sflight AS a
FIELDS CARRID
APPENDING CORRESPONDING FIELDS OF TABLE @gt_sfli2.

"待补充

*------------------------------------------------------------------------------------------------------------

"前导零
DATA: lv_field TYPE CHAR12 VALUE 000000123.
lv_field = |{ lv_field ALPHA = OUT }|."去前导0
lv_field = |{ lv_field ALPHA = IN }|. "加前导0

*------------------------------------------------------------------------------------------------------------
*对Rang表赋值
DATA: lr_data type TABLE OF /ATL/DATE_RANGE.
lr_data[] = VALUE #( sign = ‘I’ option = ‘BT’ ( low = 1 high = 2 )
( low = 3 high = 4 )
( low = 4 high = 5 )
option = ‘EQ’ ( low = 6 ) ).

*赋值指定条件的数据
CLEAR:gt_sfli2.
gt_sfli2[] = value #( for wa in gt_sfli where ( CARRID = ‘AA’ and PLANETYPE = ‘A340-600’ ) ( wa ) ).
*------------------------------------------------------------------------------------------------------------
*.Group 分组循环
loop at gt_sfli into data(ls_data1) group by ( CARRID = ls_data-CARRID ) ascending assigning field-symbol().
loop at group assigning field-symbol().

endloop.
endloop.
*------------------------------------------------------------------------------------------------------------
*动态条件分组 分组处理,不像at end of 那样需要调整字段顺序。
DATA: lv_field1 TYPE c VALUE ‘B’.
LOOP AT gt_sfli ASSIGNING FIELD-SYMBOL(<fs_ls>) GROUP BY SWITCH string( lv_field1 WHEN ‘A’
THEN | BELNR = <DYN_WA>-BELNR|
WHEN ‘B’
THEN | BELNR = <DYN_WA>-BELNR WAERS = <DYN_WA>-WAERS | ) ASSIGNING FIELD-SYMBOL().
LOOP AT GROUP ASSIGNING FIELD-SYMBOL().
ENDLOOP.
ENDLOOP.
*------------------------------------------------------------------------------------------------------------
*Replace
DATA(lv_string1) = ‘statements’.
DATA(lv_string2) = ‘asffasfa’…
write: replace( val = lv_string1
sub = ‘sta’
case = abap_true
with = to_upper( lv_string2 ) "如果发现sta,用lv_char2的大写替换
occ = 2 )."如果occ为正,则从左边开始计数;如果occ为负,则从右数。值1、2、…表示第一,第二,事件。取值为-1、-2、…表示最后一个,倒数第二个,。
*------------------------------------------------------------------------------------------------------------
*Conv 转换为当前用户的日期格式

WRITE: |Converte Date: { CONV d( sy-datum + 7 ) DATE = USER } |."CONV conversion data type

*------------------------------------------------------------------------------------------------------------
*Case 抓异常,分异常类型报错

  • TRY.

  •  CATCH cx_root INTO DATA(exc).
    
  •    CASE TYPE OF exc.
    
  •      WHEN TYPE cx_sy_arithmetic_error.
    
  •        out->display( 'Arithmetic error' ).
    
  •      WHEN TYPE cx_sy_conversion_error.
    
  •        out->display( 'Conversion error' ).
    
  •      WHEN OTHERS.
    
  •        out->display( 'Other error' ).
    
  •    ENDCASE.
    
  • ENDTRY.

  • Conditional Operator
    *根据不同条件赋值,一般是写Case或If,下面这些可以在定义时赋值,并且在else中抓取异常

**COND:

  • DATA(time) = COND string(
  •      WHEN sy-timlo < '120000' THEN |{ sy-timlo TIME = ISO } AM|
    
  •      WHEN sy-timlo > '120000' THEN |{ CONV t( sy-timlo - 12 * 3600 ) TIME = ISO } PM|
    
  •      WHEN sy-timlo = '120000' THEN |High Noon|
    
  •      ELSE THROW cx_cant_be( ) ).
    

**Switch:

  • DATA(number) = SWITCH string( sy-index
    
  •                            WHEN 1 THEN 'one'
    
  •                            WHEN 2 THEN 'two'
    
  •                            WHEN 3 THEN 'three'
    
  •                            ELSE THROW cx_overflow( ) ).
    


1. RANGES语句:要用与选择表相同的结构创建内表,可使用RANGES语句,如下所示:

```sql
ranges s_HKONT for bsis-HKONT.

s_HKONT-sign = 'I'.
s_hkont-option = 'BT'.
s_hkont-low = '0010010000'.
s_hkont-high = '0010019999'.

append s_hkont.

s_HKONT-sign = 'I'.
s_hkont-option = 'BT'.
s_hkont-low = '0010020000'.
s_hkont-high = '0010029999'.

append s_hkont.

DESCRIBE TABLE lt_mat LINES lv_cont.

这行的意思是 计算内表 lt_mat 的行数 ,将行数放到变量 lv_cont 里。

该语句可以判断内表是否为空,使用语句: DESCRIBE TABLE ITAB LINES VARIABLE.判断系统变量sy-subrc是否为0,如果为0就表示不空,反之为空!

 DESCRIBE TABLE ITAB LINES VARIABLE

IF NOT P_VARIANT IS INITIAL.
    WX_VARIANT-VARIANT = P_VARIANT.
ENDIF.

&---------------------------------------------------------------------
*& Report YTEST1
&---------------------------------------------------------------------
*&
&---------------------------------------------------------------------
REPORT ytest1.

TYPES:BEGIN OF ty_tab,
tabix TYPE sy-tabix,
END OF ty_tab.
DATA:lt_tab TYPE TABLE OF ty_tab.

lt_tab = VALUE #( ( tabix = 1 )
( tabix = 1 )
( tabix = 1 )
( tabix = 2 ) ).

"表记录是否存在
CHECK line_exists( lt_tab[ tabix = 1 ] ).

"获取行号
DATA(lv_index) = line_index( lt_tab[ tabix = 1 ] ).

"获取行内容
DATA(ls_tab) = lt_tab[ tabix = 1 ].

"获取满足条件的行数
DATA(lv_lines) = REDUCE i( INIT x = 0 FOR wa IN lt_tab WHERE ( tabix = 1 ) NEXT x = x + 1 ).

"合计行数据
DATA(lv_tabix) = REDUCE i( INIT x = 0 FOR wa IN lt_tab WHERE ( tabix = 1 ) NEXT x = x + wa-tabix ).

substring截取字符串
concat合并字符串

SELECT SINGLE edatu, ezeit, vbeln FROM XXXX as a
WHERE
substring( @ZOBJKY,1,10 ) = a~vbeln
AND a~posnr = concat( ‘00’ , substring( @ZOBJKY,11,14 ) )
INTO CORRESPONDING FIELDS OF @ls_vbep.

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值