S4HANA For ABAP(3):Internal Table改变

1.14 Internal Table:Formulating Dynamic Where Conditions

动态Where条件

 

 

7.02版本,可以在Loop时使用动态Where条件;

1.15 Internal Table:Defining and Using Secondary Keys

 

主要使用的Secondary Keys,使用Non-unique sorted keys;

示例代码:

"test6
"secondary key
FORM f_test6.
  DATA:lt_spfli TYPE TABLE OF spfli
        WITH UNIQUE HASHED KEY k_hash COMPONENTS carrid connid countryfr
        WITH NON-UNIQUE SORTED KEY k_sort COMPONENTS carrid connid.
  SELECT * FROM spfli INTO TABLE lt_spfli.

  "loop时使用
  LOOP AT lt_spfli INTO DATA(ls_spfli) USING KEY k_sort WHERE carrid = 'AA' AND connid = '0001'.
  ENDLOOP.
  "read时使用
  READ TABLE lt_spfli INTO ls_spfli WITH KEY k_sort COMPONENTS carrid = 'AA' connid = '0001'.
  "当使用key读出记录需要更新时,必须使用对应key
  "sy-tabix记录的值会被key影响
  "更新时需要指定transporting字段,不能更新key值字段
  MODIFY lt_spfli USING KEY k_sort FROM ls_spfli INDEX sy-tabix
        TRANSPORTING countryfr.
ENDFORM

1.16 Internal Table:Processing Internal Tables Using Expressions

示例代码:

"test7
"表达式访问内表
FORM f_test7.
  DATA:lt_spfli TYPE TABLE OF spfli
       WITH NON-UNIQUE SORTED KEY k_sort
       COMPONENTS countryfr.
  DATA:ls_spfli LIKE LINE OF lt_spfli.
  DATA:lv_countryfr TYPE spfli-countryfr.
  SELECT * FROM spfli INTO TABLE lt_spfli.

  "line index从1开始
  ls_spfli = lt_spfli[ 1 ].
  WRITE:/ ls_spfli-carrid, ls_spfli-connid.
  "匹配多笔,只返回第一笔记录
  ls_spfli = lt_spfli[ carrid = 'AA' ].
  WRITE:/ ls_spfli-carrid, ls_spfli-connid.
  "使用key
  ls_spfli = lt_spfli[ KEY k_sort COMPONENTS countryfr = 'DE' ].
  WRITE:/ ls_spfli-carrid, ls_spfli-connid.
  "访问结构字段
  lv_countryfr = lt_spfli[ carrid = 'AA' ]-countryfr.

  "通过line index访问行
*  READ TABLE lt_spfli WITH KEY k_sort COMPONENTS countryfr = 'DE' TRANSPORTING NO FIELDS.
*  LOOP AT lt_spfli INTO ls_spfli FROM sy-tabix.
*  ENDLOOP.
  "line_index()方法
  "line_exists()方法
  "需要line_exists先判断访问数据行是否存在,
  "再使用line_index获取数据行
  IF line_exists( lt_spfli[ KEY k_sort COMPONENTS countryfr = 'DE' ] ).
    LOOP AT lt_spfli INTO ls_spfli
      FROM line_index( lt_spfli[ KEY k_sort COMPONENTS countryfr = 'DE' ] ).
    ENDLOOP.
  ENDIF.
ENDFORM.

1.17 Internal Table:Creating Comprehensions And Reductions

简化内表循环处理;

数据汇总方法;

示例代码:

"test8
"Creating Comprehensions And Reductions
FORM f_test8.
  DATA:lt_spfli TYPE TABLE OF spfli
       WITH NON-UNIQUE SORTED KEY s_sort COMPONENTS countryfr.
  DATA:lt_spfli2 TYPE TABLE OF spfli.
  DATA:ls_spfli LIKE LINE OF lt_spfli.
  TYPES:BEGIN OF s_ty1,
        carrid TYPE spfli-carrid,
        connid TYPE spfli-connid,

        END OF s_ty1.
  DATA:lt_ty1 TYPE TABLE OF s_ty1.
  DATA:ls_ty1 LIKE LINE OF lt_ty1.

  SELECT * FROM spfli INTO TABLE lt_spfli.
  "使用MOVE-CORRESPONDING进行内表赋值
  MOVE-CORRESPONDING lt_spfli TO lt_ty1.
  "保留lt_ty1已有记录
  "MOVE-CORRESPONDING lt_spfli TO lt_ty1 KEEPING TARGET LINES.
  "如果有嵌套结构赋值
  "MOVE-CORRESPONDING lt_spfli TO lt_ty1 EXPANDING NESTED TABLES.

  "不使用Loop,获取内表部分行
  lt_spfli2 = VALUE #( FOR wa IN lt_spfli
                             WHERE ( carrid = 'AA' )
                            ( wa ) ).
  "结合动态where条件,注意where两边括号不能有空格
  DATA:lv_carrid TYPE string VALUE 'AZ'.
  DATA:lv_connid TYPE string VALUE '0788'.
  DATA:lv_where TYPE string.
  lv_where = | CARRID = '{ lv_carrid }' AND CONNID = '{ lv_connid }' |.
  WRITE:/ lv_where.
  lt_spfli2 = VALUE #( FOR wa IN lt_spfli
                             WHERE (lv_where)
                            ( wa ) ).
  LOOP AT lt_spfli2 INTO DATA(ls_spfli2).
    WRITE:/ ls_spfli2-carrid,ls_spfli2-connid.
  ENDLOOP.

  "通过REDUCE,进行数据汇总
  DATA:lt_sflight TYPE TABLE OF sflight.
  DATA:ls_sflight LIKE LINE OF lt_sflight.
  TYPES:BEGIN OF s_ty2,
        carrid TYPE sflight-carrid,
        connid TYPE sflight-connid,
        sum_occ TYPE i,
        END OF s_ty2.
  DATA:lt_sflight2 TYPE TABLE OF s_ty2.
  DATA:lt_sflight3 TYPE TABLE OF s_ty2.
  DATA:lv_occ_total TYPE I.
  SELECT * FROM sflight INTO TABLE lt_sflight.
  "加总所有seatsocc
  lv_occ_total = REDUCE i( INIT i = 0
                   FOR ls_sflight2 IN lt_sflight
                   NEXT i = i + ls_sflight2-seatsocc
                  ).

  "根据carrid,connid分组汇总seatsocc
  LOOP AT lt_sflight INTO ls_sflight
    GROUP BY ( carrid = ls_sflight-carrid
               connid = ls_sflight-connid
               size = GROUP SIZE )
    ASCENDING ASSIGNING FIELD-SYMBOL(<fs_sflight>).
    lt_sflight2 = VALUE #( (
      carrid = <fs_sflight>-carrid
      connid = <fs_sflight>-connid
      sum_occ = REDUCE i( INIT i = 0
                          FOR line IN GROUP <fs_sflight>
                          NEXT i = i + line-seatsocc ) )
    ).
    MOVE-CORRESPONDING lt_sflight2 TO lt_sflight3 KEEPING TARGET LINES.
  ENDLOOP.
  LOOP AT lt_sflight3 ASSIGNING FIELD-SYMBOL(<fs_sflight3>).
    WRITE:/ <fs_sflight3>-carrid,<fs_sflight3>-connid,<fs_sflight3>-sum_occ.
  ENDLOOP.
ENDFORM

1.18 Internal Table:Defining and Using Meshes

通过定义Table之间外键关系,实现多表连接,减少访问时循环次数。

但是查询时,会将多表数据同时查询出来,是否会出现内存溢出?

示例:

"test9
"Defining and Using Meshes
"语法:
*TYPES BEGIN OF MESH mesh_type.
* node { TYPE {[REF TO] table_type}|ref_type }
*           | { LIKE {[REF TO] itab      }|dref     }
*                [association1],
*                [association2],
*                ...
*TYPES END OF MESH mesh_type.
"示例:DEMO_MESH*

"Mesh Node
"语法:
"{mesh-|<mesh>-|mesh_ref->}rnode\_associ[ ... ]\_assoc1[ ... ]\_assoc2[ ... ]
"1.{mesh-|<mesh>-|mesh_ref->}rnode
"rnode是mesh中定义的node,可以作为开始node或结束node;
"2. \_associ[ source [cond] ]
"通过association获取对应结果node数据,可以指定开始node数据筛选条件;
"3.\_assoc1[ [cond] ]\_assoc2[ [cond] ]
"可以链式使用association访问数据;

"Mesh Association
"语法:
  "\_assoc[+|*][ ... ]
  "| \_assoc~node[+|*][ ... ]
  "| \^_assoc~node[+|*][ ... ] ...
"示例:DEMO_MESH_REFLEXIVE_ASSOC_SNGL
"+,*主要用于自关联表树状关系
"+,获取开始node下所有子孙节点数据;
"*,包含开始node匹配数据,获取开始node下所有子孙节点数据;
"例如:
"课程ID 上阶课程 描述
"ID   PID  DESC
"1     0    t1
"2     1    t2
"3     2    t3
"4     0    t4
"5     1    t5
*TYPES:BEGIN OF line,
*    id  TYPE i,
*    pid TYPE i,
*    desc TYPE string,
*  END OF line.
*TYPES:t_itab TYPE SORTED TABLE OF line WITH UNIQUE KEY id
*             WITH NON-UNIQUE SORTED KEY by_parent
*             COMPONENTS pid,
*TYPES:BEGIN OF MESH t_mesh,
*        node TYPE t_itab
*        ASSOCIATION _node TO node ON pid = id
*        USING KEY by_parent,
*      END OF MESH t_mesh.
"需要查找所有课程ID为1的下阶课程
"mesh-node\_node[ mesh-node[ id = id ] ]
"返回:t2,t5两笔记录
"mesh-node\_node+[ mesh-node[ id = id ] ]
"返回:t2,t5,t3, t3返回因为他是孙子课程
"mesh-node\_node*[ mesh-node[ id = id ] ]
"返回:t2,t5,t3,t1  t1返回因为它符合初始条件

"Mesh Condition
"语法:
"{ col1 = val1 col2 = val2 ... }
"| { [USING KEY key] [WHERE log_exp] }
"设置筛选条件
"[USING KEY key] [WHERE log_exp]
"可以在下面语法中使用:
"LOOP AT mesh_path ...
"FOR  ... IN mesh_path ...
"INSERT ... INTO TABLE mesh_path ...
"MODIFY mesh_path.
"DELETE mesh_path.
"SET ASSOCIATION mesh_path ...

FORM f_test9.
  "定义MESH
  "不能使用standard table
  "TYPES:tt_customers TYPE TABLE OF scustom.
  "TYPES:tt_customers TYPE STANDARD TABLE OF scustom.
  "TYPES:tt_customers TYPE STANDARD TABLE OF scustom
  "      WITH NON-UNIQUE SORTED KEY k_sort COMPONENTS id name.
  "需要使用sorted table,hash table
  TYPES:tt_customers TYPE SORTED TABLE OF scustom WITH NON-UNIQUE KEY id name.
  TYPES:tt_books TYPE HASHED TABLE OF sbook WITH UNIQUE KEY carrid connid fldate bookid.
  TYPES:wa_books TYPE LINE OF tt_books.
  "定义mesh
  TYPES:BEGIN OF MESH m_custom_books,
        customers TYPE tt_customers ASSOCIATION _sbook TO books ON customid = id,
        books TYPE tt_books ASSOCIATION _scutomer TO customers ON id = customid,
       END OF MESH m_custom_books.

  "也可以定义多种key
  "SORT,HASH的UNIQUE KEY必须要指定
  TYPES:tt_scarr TYPE HASHED TABLE OF scarr
        WITH UNIQUE KEY carrid.
  TYPES:tt_spfli TYPE HASHED TABLE OF spfli
        WITH UNIQUE KEY carrid connid
        WITH NON-UNIQUE SORTED KEY k_sort_spfli COMPONENTS carrid.
  TYPES:tt_sflight TYPE HASHED TABLE OF sflight
        WITH UNIQUE KEY carrid connid fldate
        WITH NON-UNIQUE SORTED KEY k_sort_sflight COMPONENTS carrid connid.
  TYPES:tt_sairport TYPE HASHED TABLE OF sairport
        WITH UNIQUE KEY id.

  "定义mesh
  TYPES:BEGIN OF MESH m_flights_info,
    scarrs TYPE tt_scarr
      ASSOCIATION _spfli TO spflis
      ON carrid = carrid USING KEY k_sort_spfli,
    spflis TYPE tt_spfli
      "和sflight直接association
      ASSOCIATION _sflight TO sflights
      ON carrid = carrid
      AND connid = connid USING KEY k_sort_sflight
      "和airport之间association
      ASSOCIATION _sairport TO sairports
                   ON id = airpto,
                   "USING KEY primary_key,
    sflights TYPE tt_sflight,
    sairports TYPE tt_sairport,
  END OF MESH m_flights_info.
  "指针方式
  DATA:lm_custom_books3_ref TYPE REF TO DATA.
  FIELD-SYMBOLS:<fs_custom_books> TYPE m_custom_books.


  "创建mesh对象
  "方式1
  DATA:lm_custom_books TYPE m_custom_books.
  DATA:lm_flights_info TYPE m_flights_info.
  ASSIGN lm_custom_books TO <fs_custom_books>.
  "方式2
  DATA(lm_custom_books2) = NEW m_custom_books( ).
  DATA(lm_custom_books2_ref) = NEW m_custom_books( VALUE m_custom_books( ) ).
  lm_custom_books3_ref = REF #( lm_custom_books2 ).


  "填充mesh数据,这样数据过多同样会有内存限制?
  SELECT * FROM scustom INTO TABLE lm_custom_books-customers.
  SELECT * FROM sbook INTO TABLE @lm_custom_books-books.
  SELECT * FROM scarr INTO TABLE @lm_flights_info-scarrs.
  SELECT * FROM spfli INTO TABLE @lm_flights_info-spflis.
  SELECT * FROM sflight INTO TABLE @lm_flights_info-sflights.
  SELECT * FROM sairport INTO TABLE @lm_flights_info-sairports.

  "正反向数据访问
  "正向Forward associations,root node作为开始node;
  "反向Inverse associations,root node作为结束node;
  "正向数据访问
  "cutomers\_sbook
  "lt_result1数据类型和最后一个association对应表一致
  "根据customer表查询book表信息
  "lm_custom_books-customers\_sbook
  IF line_exists( lm_custom_books-customers\_sbook[
                  lm_custom_books-customers[ id = '00001134' ] ] ).
    DATA(lt_result1) = VALUE tt_books( ( lm_custom_books-customers\_sbook[
                      lm_custom_books-customers[ id = '00001134' ]
    ] ) ).
    "输出显示
    LOOP AT lt_result1 ASSIGNING FIELD-SYMBOL(<fs_result1>).
      WRITE:/ 'result1:',<fs_result1>-passname,<fs_result1>-order_date.
    ENDLOOP.
  ENDIF.

  "反向数据访问
  "lt_result2数据类型和~后的表类型一致
  "根据book表信息查询customer信息
  "lm_custom_books-books\^_sbook~customers
  IF line_exists( lm_custom_books-books\^_sbook~customers[
                        lm_custom_books-books[ customid = '00001134' ] ] ).
    DATA(lt_result2) = VALUE tt_customers( ( lm_custom_books-books\^_sbook~customers[
                        lm_custom_books-books[ customid = '00001134' ]
     ] ) ).
    "输出显示
    LOOP AT lt_result2 ASSIGNING FIELD-SYMBOL(<fs_result2>).
      WRITE:/ 'result2:',<fs_result2>-name,<fs_result2>-city.
    ENDLOOP.
  ENDIF.


  "根据customer表信息查询book信息
  "lm_custom_books-customers\^_scutomer~books
  IF line_exists( lm_custom_books-customers\^_scutomer~books[
                        lm_custom_books-customers[ id = '00001134' ] ] ).
    "VALUE中使用()表示返回table类型,
    "注意:如果匹配多笔,也只返回单笔记录!
    DATA(lt_result3) = VALUE tt_books( ( lm_custom_books-customers\^_scutomer~books[
                        lm_custom_books-customers[ id = '00001134' ] ] ) ).

    "VALUE中不使用(),表示返回工作区,单笔记录
    DATA(lt_result4) = VALUE wa_books( lm_custom_books-customers\^_scutomer~books[
                        lm_custom_books-customers[ id = '00001134' ] ] ).

  ENDIF.
  LOOP AT lt_result3 ASSIGNING FIELD-SYMBOL(<fs_result3>).
    WRITE:/ 'result3:',<fs_result3>-passname,<fs_result3>-order_date.
  ENDLOOP.
  WRITE:/ 'result4:',lt_result4-passname,lt_result4-order_date.


  "多层级正向association
  "lm_flights_info-scarrs\_spfli[]\_sflight[ ]
  IF line_exists( lm_flights_info-scarrs\_spfli[
                  lm_flights_info-scarrs[ carrid = 'AA' ] ]\_sflight[ ] ).
    "有多笔sflight记录,只返回单笔
    DATA(lt_result5) = VALUE tt_sflight( ( lm_flights_info-scarrs\_spfli[
                  lm_flights_info-scarrs[ carrid = 'AA' ] ]\_sflight[ ] ) ).

    "返回多笔记录
    DATA(lt_result6) = VALUE tt_sflight( FOR <fs_result6> IN lm_flights_info-scarrs\_spfli[
                  lm_flights_info-scarrs[ carrid = 'AA' ] ]\_sflight[ ]
                  ( <fs_result6> )
                  ).
  ENDIF.
  LOOP AT lt_result5 ASSIGNING FIELD-SYMBOL(<fs_result5>).
    WRITE:/ 'result5:',<fs_result5>-carrid,<fs_result5>-connid,<fs_result5>-fldate.
  ENDLOOP.
  "因为上面<fs_result6>已经被定义使用,
  "这里不能使用field symbol(<fs_result6>)
  "也不能直接使用fs_result6?
  "LOOP AT lt_result6 ASSIGNING FIELD-SYMBOL(<fs_result6>).
  "LOOP AT lt_result6 ASSIGNING <fs_result6>.
  LOOP AT lt_result6 ASSIGNING FIELD-SYMBOL(<fs_result61>).
    WRITE:/ 'result6:',<fs_result61>-carrid,<fs_result61>-connid,<fs_result61>-fldate.
  ENDLOOP.

  "多层级反向association
  "lm_flights_info-sflights\^_sflight~spflis[]\^_spfli~scarrs[]
  IF line_exists( lm_flights_info-sflights\^_sflight~spflis[
                  lm_flights_info-sflights[ carrid = 'AA' ] ]\^_spfli~scarrs[ ] ).
    DATA(lt_result7) = VALUE tt_scarr( FOR <fs_result7> IN lm_flights_info-sflights\^_sflight~spflis[
                  lm_flights_info-sflights[ carrid = 'AA' ] ]\^_spfli~scarrs[ ]
                  ( <fs_result7> ) ).

    "使用field symbol保存结果
    "注意:这里返回是工作区类型
    ASSIGN lm_flights_info-sflights\^_sflight~spflis[
           lm_flights_info-sflights[ carrid = 'AA' ] ]\^_spfli~scarrs[ ]
    TO FIELD-SYMBOL(<fs_result72>).
  ENDIF.
  LOOP AT lt_result7 ASSIGNING FIELD-SYMBOL(<fs_result71>).
    WRITE:/ 'result7:',<fs_result71>-carrid,<fs_result71>-carrname,<fs_result71>-url.
  ENDLOOP.
  WRITE:/ 'result72:',<fs_result72>-carrid,<fs_result72>-carrname,<fs_result72>-url.


  "Loop AT 语句
  "LOOP AT mesh_path result.
  "...
  "ENDLOOP.
  LOOP AT lm_flights_info-spflis\_sflight[
          lm_flights_info-spflis[ carrid = 'AA' connid = '0064' ]
          WHERE fldate = '20220423'
          "AND currency = 'USD'
          ]
    INTO DATA(ls_sflight).
    WRITE:/ 'Loop at:',ls_sflight-connid,ls_sflight-fldate,ls_sflight-price.
  ENDLOOP.
  "注意:
  "lm_flights_info-spflis[ carrid = 'AA' ]时
  "table:spfli有两笔匹配记录,connid = '0017' or '0064'
  "但只会返回第一笔数据carrid = 'AA' connid = '0017'
  "然后额外条件WHERE connid = '0064'时不会返回任何记录;
  LOOP AT lm_flights_info-spflis\_sflight[
          lm_flights_info-spflis[ carrid = 'AA' connid = '0064' ]
          "lm_flights_info-spflis[ carrid = 'AA' ]
          "WHERE  connid = '0064'
          ]
    INTO DATA(ls_sflight1).
    WRITE:/ 'Loop at1:',ls_sflight1-connid,ls_sflight1-fldate,ls_sflight1-price.
  ENDLOOP.
  "lm_flights_info-scarrs\_spfli[]\_sairport[]
  LOOP AT lm_flights_info-scarrs\_spfli[
          lm_flights_info-scarrs[ carrname = 'Alitalia' ]
          WHERE countryto = 'JP'
          ]\_sairport[ USING KEY primary_key ]
       INTO DATA(ls_sairport).
        "INTO DATA(ls_spfli).
    WRITE:/ 'Loop at2:',ls_sairport-id,ls_sairport-name.
    "WRITE:/ 'Loop at2:',ls_spfli-carrid,ls_spfli-connid.
  ENDLOOP.


  "FOR IN语句
  "FOR wa|<fs> IN mesh_path [let_exp]
  DATA:lt_sflights TYPE tt_sflight.
  lt_sflights = VALUE tt_sflight(
    FOR ls_sflights IN lm_flights_info-scarrs\_spfli[
        lm_flights_info-scarrs[ carrname = 'American Airlines' ] ]\_sflight[ ]
    ( ls_sflights )
  ).
  "输出结果
  LOOP AT lt_sflights INTO DATA(ls_sflights2).
    WRITE:/ 'FOR IN:',ls_sflights2-carrid,ls_sflights2-connid,ls_sflights2-fldate.
  ENDLOOP.
  "结合REDUCE汇总
  DATA(lv_sum) = REDUCE sflight-paymentsum(
    INIT v_sum TYPE sflight-paymentsum
    FOR ls_sflights3 IN lm_flights_info-scarrs\_spfli[
        lm_flights_info-scarrs[ carrname = 'American Airlines' ] ]\_sflight[ ]
    NEXT v_sum = v_sum + ls_sflights3-paymentsum
  ).
  WRITE:/ 'FOR IN2:',lv_sum.



  "定义mesh
  TYPES:BEGIN OF s_line1,
        id TYPE i,
        desc TYPE string,
        END OF s_line1.
  TYPES:BEGIN OF s_line2,
        id TYPE i,
        name TYPE string,
        desc TYPE string,
        END OF s_line2.
  TYPES:tt_line1 TYPE SORTED TABLE OF s_line1
        WITH NON-UNIQUE KEY id.
  TYPES:tt_line2 TYPE SORTED TABLE OF s_line2
        WITH NON-UNIQUE KEY id
        WITH NON-UNIQUE SORTED KEY k_1 COMPONENTS id name.
  TYPES:BEGIN OF MESH m_line,
        line1 TYPE tt_line1
        ASSOCIATION _line2 TO line2 ON id = id,
        line2 TYPE tt_line2,
        END OF MESH m_line.
  "INSERT语句
  "INSERT line_spec INTO TABLE mesh_path result.
  "插入时,如果UNIQUE Key不能插入重复值
  DATA:lm_line TYPE m_line.
  lm_line-line1 = VALUE #(
    ( id = 1 desc = 'line11' )
    ( id = 2 desc = 'line12' )
    ( id = 3 desc = 'line13' )
  ).
  lm_line-line2 = VALUE #(
    ( id = 1 desc = 'line21' )
    ( id = 2 desc = 'line22' )
    ( id = 2 desc = 'line222' )
  ).
  INSERT VALUE s_line1( desc = 'line14' ) INTO TABLE lm_line-line1.
  INSERT LINES OF VALUE tt_line1(
    ( id = 5 desc = 'line15' )
    ( desc = 'line16' )
   ) INTO TABLE lm_line-line1.
  INSERT INITIAL LINE INTO TABLE lm_line-line1.
  DATA:ls_line1 LIKE LINE OF lm_line-line1.
  LOOP AT lm_line-line1 INTO ls_line1.
    WRITE:/ 'Insert:',ls_line1-id,ls_line1-desc.
  ENDLOOP.

  INSERT VALUE s_line2( name = 'name1' desc = 'line24' ) INTO TABLE lm_line-line1\_line2[
  lm_line-line1[ 1 ] ].
  DATA:ls_line2 LIKE LINE OF lm_line-line2.
  LOOP AT lm_line-line2 INTO ls_line2.
    WRITE:/ 'Insert:',ls_line2-id,ls_line2-name,ls_line2-desc.
  ENDLOOP.

  "Modify语句
  "MODIFY { TABLE mesh_path [USING KEY keyname] FROM wa
  "     [TRANSPORTING comp1 comp2 ...] result }
  " | { mesh_path FROM wa [TRANSPORTING comp1 comp2 ...] }.
  "MODIFY TABLE只修改符合条件单笔
  MODIFY TABLE lm_line-line1\_line2[
  lm_line-line1[ id = 2 ] ]
  FROM VALUE s_line2( name = 'modify1' desc = 'line66' ).
  MODIFY TABLE lm_line-line1\_line2[
  lm_line-line1[ id = 0 ] ]
  FROM VALUE s_line2( name = 'modify2' )
  TRANSPORTING name.
  "输出显示
  LOOP AT lm_line-line2 INTO ls_line2.
    WRITE:/ 'Modify:',ls_line2-id,ls_line2-name,ls_line2-desc.
  ENDLOOP.
  "MODIFY 修改符合条件多笔
  MODIFY lm_line-line1\_line2[
  lm_line-line1[ id = 2 ] ]
  FROM VALUE s_line2( name = 'modify multi' )
  TRANSPORTING name.
  "输出显示
  LOOP AT lm_line-line2 INTO ls_line2.
    WRITE:/ 'Modify:',ls_line2-id,ls_line2-name,ls_line2-desc.
  ENDLOOP.


  "Delete语句
  "DELETE { TABLE mesh_path table_key } | { mesh_path }.
*  "删除单笔记录
*  "1.删除line1中第4行id=1对应line2中id=1单行数据
*  DELETE TABLE lm_line-line1\_line2[
*  lm_line-line1[ 4 ] ].
*  "输出显示
*  LOOP AT lm_line-line2 INTO ls_line2.
*    WRITE:/ 'DELETE:',ls_line2-id,ls_line2-name,ls_line2-desc.
*  ENDLOOP.
*  "2.使用TABLE KEY删除
*  DELETE TABLE lm_line-line1\_line2[
*  lm_line-line1[ 5 ] ]
*  WITH TABLE KEY k_1 COMPONENTS name = 'modify multi'.
*  "输出显示
*  LOOP AT lm_line-line2 INTO ls_line2.
*    WRITE:/ 'DELETE1:',ls_line2-id,ls_line2-name,ls_line2-desc.
*  ENDLOOP.
*  "3.使用VALUE指定行域值删除
*  DELETE TABLE lm_line-line1\_line2[
*  lm_line-line1[ 5 ] ]
*  FROM VALUE s_line2( name = 'modify multi' )
*  USING KEY k_1.

  "删除多笔记录
  "1.line1第5行id = 2,删除line2中所有id=2记录
*  DELETE lm_line-line1\_line2[
*  lm_line-line1[ 5 ] ].
  "2.where条件删除
  DELETE lm_line-line1\_line2[
  lm_line-line1[ 5 ]
  WHERE desc = 'line22' ].
  "通过sy-subrc判断是否删除成功
  IF sy-subrc = 0.
    WRITE:/ 'delete success'.
  ELSE.
    WRITE:/ 'delete failed'.
  ENDIF.



  "定义mesh
  TYPES:BEGIN OF s_1,
        col1 TYPE i,
        col2 TYPE i,
        END OF s_1.
  TYPES:BEGIN OF s_2,
        col1 TYPE i,
        col2 TYPE i,
        col3 TYPE i,
        col4 TYPE i,
        END OF s_2.
  TYPES:BEGIN OF s_3,
        col3 TYPE i,
        col4 TYPE i,
        END OF s_3.
  TYPES:tt_1 TYPE SORTED TABLE OF s_1
        WITH NON-UNIQUE KEY col1 col2.
  TYPES:tt_2 TYPE SORTED TABLE OF s_2
        WITH NON-UNIQUE KEY col1 col2.
  TYPES:tt_3 TYPE SORTED TABLE OF s_3
        WITH NON-UNIQUE KEY col3.
  TYPES:BEGIN OF MESH m_1,
        t1 TYPE tt_1
        ASSOCIATION _t2 TO t2 ON col1 = col1 AND col2 = col2,
        t2 TYPE tt_2
        ASSOCIATION _t3 TO t3 ON col3 = col3 AND col4 = col4,
        t3 TYPE tt_3,
        END OF MESH m_1.
  "SET ASSOCIATION语句
  "SET ASSOCIATION mesh_path { = wa    } | { LIKE wa } | { INITIAL }.
  "只会将association对应域值赋值给前置表对应字段
  "如果col4没有在association条件,则值不会写入
  DATA:lm_1 TYPE m_1.
  lm_1-t1 = VALUE #(
      ( col1 = 1 col2 = 11 )
      ( col1 = 2 col2 = 12 ) ).
  lm_1-t2 = VALUE #(
      ( col1 = 1 col2 = 11 )
      ( col1 = 2 col2 = 222 ) ).
  lm_1-t3 = VALUE #(
      ( col3 = 31 col4 = 331 )
      ( col3 = 32 col4 = 332 ) ).
  "set association
  "方式1:根据assiciation:_t3设置t2的col3,col4
  "这句设置不成功?
  "只能初始化设置值然后需要带出association值时使用?
  "DATA(ls_2) = VALUE s_2( col1 = 1 col2 = 11 ).
  "SET ASSOCIATION lm_1-t2\_t3[ ls_2 ] = lm_1-t3[ 2 ].
  INSERT INITIAL LINE INTO TABLE
  lm_1-t1\_t2[ VALUE s_1( col1 = 1 col2 = 12 ) ]
  ASSIGNING FIELD-SYMBOL(<line2>).
  SET ASSOCIATION lm_1-t2\_t3[ <line2> ] = lm_1-t3[ 1 ].
  "方式2:从节点1开始,实现相同效果
  "根据assiciation:_t3设置t2的col3,col4
  SET ASSOCIATION lm_1-t1\_t2[ VALUE s_1( col1 = 1 col2 = 11 ) ]\_t3[ ] = lm_1-t3[ 2 ].

  "SET ASSOCIATION mesh_path LIKE wa
  INSERT INITIAL LINE INTO TABLE
  lm_1-t1\_t2[ VALUE s_1( col1 = 1 col2 = 13 ) ]
  ASSIGNING FIELD-SYMBOL(<line22>).
  SET ASSOCIATION lm_1-t2\_t3[ <line22> ] LIKE VALUE s_2( col3 = 333 col4 = 3334 ).

ENDFORM.

 

posted @ 2023-03-17 08:09  渔歌晚唱  阅读(164)  评论(0编辑  收藏  举报