S4 新语法测试

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.csdn.net/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.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值