首页 > 解决方案 > 在同一个表上循环时二进制搜索不起作用

问题描述

我正在制作一个导出带有一些数据 T_DATA [] 的表的函数。当我遍历一个内部表(T_ENTRIES[])并在 T_DATA[] 上使用二进制搜索时,有一部分。在循环之前, T_DATA[] 按我在 read 语句中使用的键排序。出于某种原因,即使在两个表中都有相同的键,读取也会失败很多时间。

如果我删除二进制搜索,它工作得很好。

这是在函数中声明为导出的表的常见问题吗?

因为当我将表 (T_DATA[]) 移动到不同的内部表并对其使用二进制搜索时,它工作正常。

谢谢!

SORT t_patient_list[] BY kunnr.

LOOP AT lt_cov_entry[] ASSIGNING FIELD-SYMBOL(<ls_cov_entry>).

  READ TABLE t_patient_list[]
  ASSIGNING FIELD-SYMBOL(<fs_patient_list>)
  WITH KEY  kunnr = <ls_cov_entry>-kunnr.
  BINARY SEARCH.

  IF sy-subrc <> 0.
    CLEAR ls_patient_record.
    MOVE-CORRESPONDING <ls_cov_entry> TO ls_patient_record.
    APPEND ls_patient_record TO t_patient_list[].
  ELSE.
    <fs_patient_list>-hosp_type = <ls_cov_entry>-hosp_type.
  ENDIF.

ENDLOOP.

标签: abapbinary-search

解决方案


它不起作用,BINARY SEARCH因为APPEND破坏了订购。最好的解决方案是定义t_patient_listSORTEDby kunnr1

如果你不能这样做,你应该使用INSERT ... INDEX sy-tabix而不是APPEND,因为即使是失败的也READ TABLE将它设置为正确的值:

SORT t_patient_list[] BY kunnr.

LOOP AT lt_cov_entry[] ASSIGNING FIELD-SYMBOL(<ls_cov_entry>).
  READ TABLE t_patient_list[]
      ASSIGNING FIELD-SYMBOL(<fs_patient_list>)
      WITH KEY kunnr = <ls_cov_entry>-kunnr
      BINARY SEARCH.

  IF sy-subrc <> 0.
    CLEAR ls_patient_record.
    MOVE-CORRESPONDING <ls_cov_entry> TO ls_patient_record.
    INSERT ls_patient_record INTO t_patient_list[] INDEX sy-tabix.
  ELSE.
    <fs_patient_list>-hosp_type = <ls_cov_entry>-hosp_type.
  ENDIF.
ENDLOOP.

1)如果可以改成SORTED,还是需要把APPEND换成INSERT,只是去掉INDEX部分。


推荐阅读