READ TABLE WITH KEY和READ TABLE WITH TABLE KEY的区别

243 阅读2分钟

Created by Jerry Wang on Jul 04, 2014

使用下面的report测试这两种语法的区别:
clipboard1

REPORT ztest_key.
TYPES: BEGIN OF ty_data,
         index TYPE int4,
         name  TYPE char10,
         score TYPE int4,
         text  TYPE string,
       END OF ty_data.
TYPES: tt_data1 TYPE STANDARD TABLE OF ty_data,
       "tt_data2 type STANDARD  TABLE OF ty_data with UNIQUE key dsf. SYNTAX ERROR
       tt_data2 TYPE SORTED TABLE OF ty_data WITH UNIQUE KEY score,
       tt_data3 TYPE SORTED TABLE OF ty_data WITH UNIQUE KEY primary_key COMPONENTS name score
         WITH NON-UNIQUE SORTED KEY k1 COMPONENTS text.
DATA: lt_table1 TYPE tt_data1,
      lt_table2 TYPE tt_data2,
      lt_table3 TYPE tt_data3.
READ TABLE lt_table1 TRANSPORTING NO FIELDS WITH KEY index = 1.
READ TABLE lt_table1 TRANSPORTING NO FIELDS WITH KEY name = 'Jerry'.
READ TABLE lt_table1 TRANSPORTING NO FIELDS WITH KEY score = 20.
READ TABLE lt_table1 TRANSPORTING NO FIELDS WITH KEY text = 'Jerry'.
"READ TABLE lt_table1 TRANSPORTING NO FIELDS WITH TABLE KEY index = 1.
" Specification for component "NAME" of key "PRIMARY_KEY" of table "LT_TABLE1" is missing or incomplete.
" Key must be completely provided.
READ TABLE lt_table1 TRANSPORTING NO FIELDS WITH TABLE KEY name = 'Jerry' text = 'Text'.
READ TABLE lt_table2 TRANSPORTING NO FIELDS WITH KEY index = 1.
READ TABLE lt_table2 TRANSPORTING NO FIELDS WITH KEY name = 'Jerry'.
READ TABLE lt_table2 TRANSPORTING NO FIELDS WITH KEY score = 20.
READ TABLE lt_table2 TRANSPORTING NO FIELDS WITH KEY text = 'Jerry'.
"Syntax error
"READ TABLE lt_table2 TRANSPORTING NO FIELDS WITH TABLE KEY index = 1.
"syntax error
"READ TABLE lt_table2 TRANSPORTING NO FIELDS WITH TABLE KEY name = 'Jerry'.
READ TABLE lt_table2 TRANSPORTING NO FIELDS WITH TABLE KEY score = 20.
"Syntax error
"syntax error
"READ TABLE lt_table3 TRANSPORTING NO FIELDS WITH TABLE KEY text = 'Jerry'.
"syntax error
"READ TABLE lt_table3 TRANSPORTING NO FIELDS WITH TABLE KEY name = 'Jerry'.
"syntax error
"READ TABLE lt_table3 TRANSPORTING NO FIELDS WITH TABLE KEY score = 20.
READ TABLE lt_table3 TRANSPORTING NO FIELDS WITH TABLE KEY name = 'Jerry' score = 20.
READ TABLE lt_table3 TRANSPORTING NO FIELDS WITH TABLE KEY k1 COMPONENTS text = 'this is text'.
DATA(type1) = CAST cl_abap_tabledescr( cl_abap_typedescr=>describe_by_data( lt_table1 ) ).
DATA(lt_keys1) = type1->get_keys( ).
WRITE:/ 'Key information for lt_key1...' COLOR COL_KEY.
PERFORM print USING lt_keys1.
DATA(type2) = CAST cl_abap_tabledescr( cl_abap_typedescr=>describe_by_data( lt_table2 ) ).
DATA(lt_keys2) = type2->get_keys( ).
WRITE:/ 'Key information for lt_key2...' COLOR COL_KEY.
PERFORM print USING lt_keys2.
DATA(type3) = CAST cl_abap_tabledescr( cl_abap_typedescr=>describe_by_data( lt_table3 ) ).
DATA(lt_keys3) = type3->get_keys( ).
WRITE:/ 'Key information for lt_key3...' COLOR COL_KEY.
PERFORM print USING lt_keys3.
FORM print USING it_table TYPE abap_table_keydescr_tab.
  LOOP AT it_table ASSIGNING FIELD-SYMBOL(<item>) WHERE is_primary = abap_true.
    WRITE: / 'The following fields are primary key:' COLOR COL_GROUP.
    LOOP AT <item>-components ASSIGNING FIELD-SYMBOL(<data>).
      WRITE: / <data> COLOR COL_NEGATIVE.
    ENDLOOP.
  ENDLOOP.
  LOOP AT it_table ASSIGNING FIELD-SYMBOL(<item2>) WHERE is_primary = abap_false.
    WRITE: / 'The following fields are secondary key:' COLOR COL_POSITIVE.
    LOOP AT <item2>-components ASSIGNING FIELD-SYMBOL(<data2>).
      WRITE: / <data2> COLOR COL_TOTAL.
    ENDLOOP.
  ENDLOOP.
ENDFORM.

输出结果:
clipboard2

结论:

  1. READ TABLE WITH TABLE KEY后指定的是table primary key。 如果一个table定义了多个primary key,则必须将所有的key全部在语句中指定,否则会遇到syntax error “key must be completely provided”.
  2. READ TABLE WITH KEY 传入的是free search key, 支持仅仅传入primary key collection的某一个primary key或者secondary key。
  3. 可以使用RTTI的方式得到某个table的key 信息。