new key: filter ruduce for cond switch value corresponding
condational operator COND & SWITCH ,
COND dtype|#( WHEN log_exp1 THEN result1
[ WHEN log_exp2 THEN result2 ] …
[ ELSE resultn ] ) …
SWITCH dtype|#( operand
WHEN const1 THEN result1
[ WHEN const2 THEN result2 ]
[ ELSE resultn ] ) …
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( )
).
DATA(text) = NEW class( )->meth( SWITCH #( sy-langu
WHEN 'd' THEN 'DE'
WHEN 'e' THEN 'EN'
ELSE THROW cx_langu_not_supported( ) ) ).
CORRESPONDING operator
原文链接:https://blog.youkuaiyun.com/zhongguomao/article/details/104523827
注意:如果使用内联表达式引用一个不存在的记录,则会出现Dump。SAP因此建议应该指定一个字段符号并检查sy-subrc。
ASSIGN lt_tab[ 1 ] to FIELD–SYMBOL(<ls_tab>).
IF sy–subrc = 0.…
ENDIF.
*------------------declareation------------------------------------------------------------------------
DATA(text) = `ABC`.
LOOP AT itab INTO DATA(wa).
ENDLOOP.
-----------------object---------------------------------------------------------------------------------
DATA a1 TYPE i.
DATA a2 TYPE i.
oref->meth( IMPORTING p1 = a1
IMPORTING p2 = a2).
oref->meth(
IMPORTING p1 = DATA(a1)
IMPORTING p2 = DATA(a2) ).
------------FIELD-SYMBOLS-------------------------------------------------------------------
FIELD-SYMBOLS: <line> type
LOOP AT itab ASSIGNING <line>.
ENDLOOP.
LOOP AT itab ASSIGNING FIELD-SYMBOL(<line>).
ENDLOOP.
READ TABLE itab ASSIGNING FIELD-SYMBOL(<line>).
SELECT * FROM dbtab INTO TABLE DATA(itab) WHERE fld1 = @lv_fld1.
SELECT * FROM dbtab INTO TABLE @DATA(itab) WHERE fld1 = @lv_fld1.
-------------------Table Expressions - 内表读取---------------------
--------- Read Table index
before 7.40 READ TABLE itab INDEX idx INTO wa.
7.40 wa = itab[ idx ].
7.40 wa = itab[ KEY key INDEX idx ].
---------Read Table using key
READ TABLE itab INDEX idx USING KEY key INTO wa.
wa = itab[ KEY key INDEX idx ].
---------Read Table with key
READ TABLE itab WITH KEY col1 = …
col2 = …
INTO wa.
wa = itab[ col1 = … col2 = …].
------------Read Table with key components
READ TABLE itab WITH TABLE KEY key COMPONENTS col1 = …
col2 = …
INTO wa.
wa = itab[ KEY key col1 = … col2 = …].
*-------------------Does record exist?
READ TABLE itab … TRANSPORTING NO FIELDS.
IF sy-subrc = 0.
ENDIF
IF line_exists( itab[ … ] ).
ENDIF.
---------------Get table index
DATA idx type sy-tabix.
READ TABLE … TRANSPORTING NO FIELDS.
idx = sy-tabix
DATA(idx) = line_index( itab[ … ] ).
* *&---------------------------------------------------------------------*
*& Report YTEST_CDS01
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ytest_cds01.
PERFORM frm_declaration.
PERFORM frm_for.
RETURN.
PERFORM frm_innter_table.
PERFORM frm_cdsview.
PERFORM frm_fliter.
PERFORM frm_reduce.
* 测试没通过,
*cl_salv_gui_table_ida=>create_for_cds_view( iv_cds_view_name = 'ydemo_c_rstatus' )->fullscreen()->display().
* 测试没通过,
*SELECT a~bukrs,a~belnr,b~sgtxt
* FROM bkpf AS a INNER JOIN mseg AS b
* ON right( a~belnr,5 ) = right( b~belnr,5 )
* INTO TABLE @DATA(lt_doc).
*&---------------------------------------------------------------------*
*& Form FRM_FLITER
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_fliter .
DATA: lt_flights_all TYPE STANDARD TABLE OF spfli
WITH NON-UNIQUE SORTED KEY carrid COMPONENTS carrid,
lt_flight_final TYPE STANDARD TABLE OF spfli.
TYPES: BEGIN OF ty_sorted,
carrid TYPE spfli-carrid,
END OF ty_sorted.
DATA: filter_tab1 TYPE SORTED TABLE OF ty_sorted WITH UNIQUE KEY carrid.
filter_tab1 = VALUE #(
( carrid = 'AH' )
( carrid = 'LH' )
).
SELECT * FROM spfli INTO TABLE @lt_flights_all.
DATA: filter_tab TYPE SORTED TABLE OF spfli-carrid WITH UNIQUE KEY table_line.
*下面这个方法报错,可能版本问题
* filter_tab = VALUE #(
* ( 'AH' )
* ( '' )
* ).
lt_flight_final = FILTER #(
lt_flights_all IN filter_tab
WHERE carrid = table_line ).
cl_demo_output=>write( 'test rudce' ).
LOOP AT lt_flights_all ASSIGNING FIELD-SYMBOL(<fs>).
WRITE:/ <fs>-carrid,<fs>-connid.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_REDUCE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_reduce .
TYPES:BEGIN OF ty_data,
carrid TYPE ydemo_c_rstatus-carrid,
connid TYPE ydemo_c_rstatus-connid,
planetype TYPE ydemo_c_status-planetype,
END OF ty_data.
TYPES: ty_t_data TYPE STANDARD TABLE OF ty_data.
DATA: lt_tab1 TYPE STANDARD TABLE OF ty_data.
DATA: lt_tab TYPE ty_t_data." 为什么要定义TY_T_DATA ????
"\_spfliptype是VIEW ydemo_c_Rstatus 中的association view 的名字,
* VIEW ydemo_c_Rstatus 并不包含planetype 这个字段,但是出可以访问
SELECT carrid,
connid,
\_spfliptype-planetype AS plane_type
FROM ydemo_c_rstatus
WHERE ydemo_c_rstatus~carrid = 'LH'
AND \_spfliptype-planetype = 'A319' INTO TABLE @lt_tab.
WRITE: lines( lt_tab[] ).
* append
APPEND VALUE #( carrid = 'wq' connid = '223' planetype = 'nj' ) TO lt_tab.
DATA(lv_lines) = lines( lt_tab ).
* reduce
DATA(lv_lines_g) = REDUCE i(
INIT x = 0
FOR ls_tab IN lt_tab WHERE ( carrid = 'LH' )
NEXT x = x + 1
).
cl_demo_output=>write( lv_lines ) .
cl_demo_output=>write( lv_lines_g ).
* reduce
DATA(result) = REDUCE string(
INIT text = `Count up:`
FOR n = 1 UNTIL n > 10
NEXT text = text && | { n }| ).
cl_demo_output=>write( result ) .
* intertable insert
lt_tab = VALUE #(
( carrid = 'qq' connid = '123' planetype = 'nj' )
( carrid = 'q1' connid = '123' planetype = 'nj' )
).
WRITE / 'test reduce ' .
LOOP AT lt_tab ASSIGNING FIELD-SYMBOL(<fs>).
WRITE:/ <fs>-carrid,<fs>-connid,<fs>-planetype.
ENDLOOP.
WRITE / 'test reduce ' .
cl_demo_output=>write( lt_tab ) .
TYPES outref TYPE REF TO if_demo_output.
DATA(output) = REDUCE outref(
INIT out11 = cl_demo_output=>new( )
text1 = 'COUNT '
FOR n = 1 UNTIL n > 11
NEXT out11 = out11->write( text1 )
text1 = | 'TEST' { n } 'end' | ).
output->display( ).
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CDSVIEW
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_cdsview .
TYPES:BEGIN OF ty_data,
carrid TYPE ydemo_c_rstatus-carrid,
connid TYPE ydemo_c_rstatus-connid,
planetype TYPE ydemo_c_status-planetype,
END OF ty_data.
TYPES: ty_t_data TYPE STANDARD TABLE OF ty_data.
DATA: lt_tab TYPE ty_t_data.
"\_spfliptype是VIEW ydemo_c_Rstatus 中的association view 的名字,
* VIEW ydemo_c_Rstatus 并不包含planetype 这个字段,但是出可以访问
SELECT carrid,
connid,
\_spfliptype-planetype AS plane_type
FROM ydemo_c_rstatus
WHERE ydemo_c_rstatus~carrid = 'LH'
AND \_spfliptype-planetype = 'A319' INTO TABLE @lt_tab.
WRITE: lines( lt_tab[] ).
WRITE / 'test cds' .
LOOP AT lt_tab ASSIGNING FIELD-SYMBOL(<fs>).
WRITE:/ <fs>-carrid,<fs>-connid,<fs>-planetype.
ENDLOOP.
* cl_demo_output=>write( lt_tab ) .
WRITE / 'test cds' .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_INNTER_TABLE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_innter_table .
TYPES: BEGIN OF ty_bkpf,
belnr LIKE bkpf-belnr,
END OF ty_bkpf.
DATA: lt_bkpf TYPE STANDARD TABLE OF ty_bkpf.
DATA: lt_bkpf_all TYPE STANDARD TABLE OF bkpf.
lt_bkpf = VALUE #(
( belnr = '0100000006' )
( belnr = '0100000007' )
( belnr = '0100000008' ) ).
*----- inner join 内表
*----- 在SQL命令中不能使用多个内部表。
SELECT a~*
FROM bkpf AS a
INNER JOIN @lt_bkpf AS b
ON a~belnr = b~belnr
INTO TABLE @lt_bkpf_all.
DATA(lv_line) = lines( lt_bkpf_all ).
WRITE:lv_line.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_FOR
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_for .
" FOR wa|<fs> IN itab [INDEX INTO idx] [cond]
"FOR i = … [THEN expr] UNTIL|WHILE log_exp
DATA gs_t001 TYPE t001.
TYPES:ty_t001 TYPE t001-bukrs,
ty_t_t001 TYPE TABLE OF ty_t001 WITH EMPTY KEY.
DATA lines TYPE i.
SELECT * FROM t001 INTO TABLE @DATA(gt_t001) UP TO 10 ROWS.
SELECT SINGLE * FROM t001 INTO @gs_t001 .
* for 相当LOOP gt_t001, 把BUKRS值放入一个内表
DATA(gt_t0012) = VALUE ty_t_t001( FOR ls_t001 IN gt_t001 ( ls_t001-bukrs ) ).
*当加上where条件时
DATA(gt_t0013) = VALUE ty_t_t001( FOR ls_t001 IN gt_t001 WHERE ( bukrs = '5300' ) (x`x` ls_t001-bukrs ) ).
"for with THEN and UNTIL | WHERE
*旧语法:
TYPES:BEGIN OF ty_line,
a TYPE i,
b TYPE i,
c TYPE i,
END OF ty_line.
TYPES: ty_t_line TYPE TABLE OF ty_line WITH EMPTY KEY.
DATA j TYPE i.
DATA gt_lines1 TYPE ty_t_line.
FIELD-SYMBOLS <ls_line1> TYPE ty_line.
j = 0.
*旧语法:
DO.
j = j + 1.
IF j > 10. EXIT. ENDIF.
APPEND INITIAL LINE TO gt_lines1 ASSIGNING <ls_line1>.
<ls_line1>-a = j.
<ls_line1>-b = j + 1.
<ls_line1>-c = j + 2.
ENDDO.
*新语法 x未表达式中隐式定义的变量
DATA(gt_lines2) = VALUE ty_t_line( FOR i = 1 THEN i + 1 UNTIL i > 10
( a = i
b = i + 1
c = i + 2 ) ).
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DECLARATION
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_declaration .
* 注意:如果使用内联表达式引用一个不存在的记录,则会出现Dump。SAP因此建议应该指定一个字段符号并检查sy-subrc。
*
*ASSIGN lt_tab[ 1 ] to FIELD–SYMBOL(<ls_tab>).
*IF sy–subrc = 0.
*…
*ENDIF.
DATA(text) = `ABC`.
LOOP AT itab INTO DATA(wa).
ENDLOOP.
*-----------object-----------------------------------
*DATA a1 TYPE i.
*DATA a2 TYPE i.
*oref->meth( IMPORTING p1 = a1
*
* IMPORTING p2 = a2).
*
*oref->meth(
* IMPORTING p1 = DATA(a1)
* IMPORTING p2 = DATA(a2) ).
*------------FIELD-SYMBOLS----------------------------
*FIELD-SYMBOLS: <line> type
*LOOP AT itab ASSIGNING <line>.
*ENDLOOP.
*LOOP AT itab ASSIGNING FIELD-SYMBOL(<line>).
*ENDLOOP.
* READ TABLE itab ASSIGNING FIELD-SYMBOL(<line>).
*SELECT * FROM dbtab INTO TABLE DATA(itab) WHERE fld1 = @lv_fld1.
*SELECT * FROM dbtab INTO TABLE @DATA(itab) WHERE fld1 = @lv_fld1.
*-------------------Table Expressions - 内表读取-------------------------
* --------- Read Table index
* before 7.40 READ TABLE itab INDEX idx INTO wa.
* 7.40 wa = itab[ idx ].
* 7.40 wa = itab[ KEY key INDEX idx ].
* ---------Read Table using key
*READ TABLE itab INDEX idx USING KEY key INTO wa.
*wa = itab[ KEY key INDEX idx ].
*
*---------Read Table with key
*READ TABLE itab WITH KEY col1 = …
* col2 = …
* INTO wa.
*wa = itab[ col1 = … col2 = …].
"------------Read Table with key components
*READ TABLE itab WITH TABLE KEY key COMPONENTS col1 = …
* col2 = …
* INTO wa.
*wa = itab[ KEY key col1 = … col2 = …].
*
**-------------------Does record exist?
*
*READ TABLE itab … TRANSPORTING NO FIELDS.
*IF sy-subrc = 0.
*ENDIF
*
*IF line_exists( itab[ … ] ).
*ENDIF.
*---------------Get table index
*
*DATA idx type sy-tabix.
*READ TABLE … TRANSPORTING NO FIELDS.
*idx = sy-tabix
*
*DATA(idx) = line_index( itab[ … ] ).
ENDFORM.