导航

Read Table Binary Search读得field一定要按照Sort的顺序

Posted on 2010-12-23 23:20  Sophy Jue 空间  阅读(1413)  评论(0编辑  收藏  举报

如果 Sort int_tab1 by aaa bbb ccc.

则 Read table with key bbb=… ccc=… aaa=… Binary search. 肯定会缺少很多返回记录,这样是错误的。

一定要和sort时候的field顺序一样。

 

**  但是如果是sorted table,那么无论是否顺序一致,都无要紧。都能找到正确的值。

 

测试程序

DATA:
  lt_afvc TYPE TABLE OF afvc,
  lv_i1 TYPE sytabix,
  lv_i2 TYPE sytabix,
  lv_cnt TYPE i.  
FIELD-SYMBOLS:
  <afvc> TYPE afvc,
  <afvc1> TYPE afvc,
  <afvc2> TYPE afvc.
SELECT * FROM afvc INTO TABLE lt_afvc.
SORT lt_afvc BY aufpl aplzl arbid.
LOOP AT lt_afvc ASSIGNING <afvc>.
READ TABLE lt_afvc ASSIGNING <afvc1> WITH KEY
    arbid = <afvc>-arbid  aplzl = <afvc>-aplzl  aufpl = <afvc>-aufpl
BINARY SEARCH.
  lv_i1 = sy-tabix.
READ TABLE lt_afvc ASSIGNING <afvc2> WITH KEY
    aufpl = <afvc>-aufpl  aplzl = <afvc>-aplzl  arbid = <afvc>-arbid
BINARY SEARCH.
  lv_i2 = sy-tabix.
IF lv_i1 NE lv_i2.
    lv_cnt = lv_cnt + 1.
WRITE: / lv_i1, 30 lv_i2, 50 <afvc>-aufpl, 65 <afvc>-aplzl, 75 <afvc>-arbid.
ENDIF.
ENDLOOP.
uline.
WRITE: / 'Number of mismatches: ', 20 lv_cnt.
lv_cnt = lines( lt_afvc ).
WRITE: / 'Number of checks: ', 20 lv_cnt.

问题:

那么如果read table with key aaa=… bbb=… binary search. 结果会有缺失么?

下面证明不会缺失。

测试程序

*&---------------------------------------------------------------------*
*& Report  ZTEST_BINARY_SEARCH
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT  ZTEST_BINARY_SEARCH.
data: IT_VBAP TYPE STANDARD TABLE OF VBAP WITH HEADER LINE,
      IT_VBAP2 TYPE STANDARD TABLE OF VBAP WITH HEADER LINE,
      IT_VBAP3 TYPE STANDARD TABLE OF VBAP WITH HEADER LINE,
      IT_XTAb TYPE STANDARD TABLE OF VBAK WITH HEADER LINE.
data: cr_usrname type vbak-ernam,
      doc_nr type vbak-vbeln,
      doc_nr2 type vbak-vbeln..
cr_usrname = 'CURA'.
doc_nr = '0000005081'.
doc_nr2 = '0000005081'.
SELECT * FROM VBAK INTO TABLE IT_XTAB
WHERE ERNAM = CR_USRNAME.
IF SY-SUBRC <> 0.
MESSAGE E010(ZSOP).
EXIT.
ENDIF.
SELECT DISTINCT MANDT VBELN POSNR KWMENG KBMENG MATNR ARKTX NETWR
                                                KWMENG VRKME WAERK
                                                LPRIO VSTEL ROUTE
                                                WERKS MWSBP
FROM VBAP INTO CORRESPONDING FIELDS OF TABLE IT_VBAP
FOR ALL ENTRIES IN IT_XTAB
WHERE VBELN = IT_XTAB-VBELN
ORDER BY PRIMARY KEY.
it_vbap2[] = it_vbap[].
write: /, 'standard read table ------------- ', /.
do 5 times.
do.
read table IT_VBAP2 WITH KEY VBELN = doc_nr.
if sy-subrc <> 0.
exit.
endif.
write: /,'Vbeln', it_vbap2-vbeln, '  Posnr', it_vbap2-posnr.
delete it_vbap2 index sy-tabix.
enddo.
write: /, 'loop index:', sy-index.
  doc_nr = doc_nr + 1.
call function 'CONVERSION_EXIT_ALPHA_INPUT'
exporting
input  = doc_nr
importing
output = doc_nr.
enddo.
it_vbap3[] = it_vbap[].
write: /, 'binary read table ------------ ', /.
do 5 times.
do.
read table IT_VBAP3 WITH KEY VBELN = doc_nr2 BINARY SEARCH.
if sy-subrc <> 0.
exit.
endif.
write: /,'Vbeln', it_vbap3-vbeln, '  Posnr', it_vbap3-posnr.
delete it_vbap3 index sy-tabix.
enddo.
write: /, 'loop index:', sy-index.
add 1 to doc_nr2.
call function 'CONVERSION_EXIT_ALPHA_INPUT'
exporting
input  = doc_nr2
importing
output = doc_nr2.
enddo.