Read table ...binary search

Buenas tardes.

Estoy usando un programa para actualizar la información del infotipo 1001, basados en un archivo con dos campos, como posicion y funcion , sin embargo al momento de consultar la tabla cuando hago read table y uso BINARY SEARCH , el sistema no me encuentra los registros.

report ZTEST2.


data lv_tabla TYPE dd02l-tabname.

FIELD-SYMBOLS:  <gfs_hrp1001> TYPE p1001.
TYPES: BEGIN OF gty_archivo,
         objid      TYPE p1001-objid,
         funcion    TYPE p1001-objid,
         mensaje TYPE string,
       END OF gty_archivo.


data: gt_archivo  TYPE TABLE OF gty_archivo,
      gt_datatab TYPE TABLE OF gty_archivo,
c_gt_1001 TYPE TABLE Of p1001,
gt_raw TYPE truxs_t_text_data,
gs_archivo like LINE OF gt_datatab.
parameter p_file TYPE rlgrap-filename.

at SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  CALL FUNCTION 'F4_FILENAME'
   EXPORTING
     FIELD_NAME          = 'P_FILE'
   IMPORTING
     FILE_NAME           = p_file
            .


START-OF-SELECTION.
perform cargar_archivo .
IF gt_datatab IS NOT INITIAL.

    SORT gt_datatab BY objid.
    SORT c_gt_1001 BY objid.

    DELETE ADJACENT DUPLICATES FROM gt_datatab COMPARING objid.

    SELECT * FROM hrp1001 INTO CORRESPONDING FIELDS OF TABLE c_gt_1001
             FOR ALL ENTRIES IN gt_datatab WHERE objid = gt_datatab-objid
             AND  otype = 'S' AND rsign = 'B' AND relat = '007'.
  ENDIF.


LOOP AT gt_datatab INTO gs_archivo.
  SORT gt_datatab BY objid.
  SORT c_gt_1001 BY objid.

 READ TABLE c_gt_1001 ASSIGNING <gfs_hrp1001>  WITH KEY
            objid = gs_archivo-objid
            sobid = gs_archivo-funcion
            BINARY SEARCH.
endloop.
*ENDIF.
end-OF-SELECTION.
FORM cargar_archivo .
  CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
    EXPORTING
      i_line_header        = 'X'
      i_tab_raw_data       = gt_raw       " WORK TABLE
      i_filename           = p_file
    TABLES
      i_tab_converted_data = gt_datatab[]    "ACTUAL DATA
    EXCEPTIONS
      conversion_failed    = 1
      OTHERS               = 2.

  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  endif.
endform.

Donde esta la falla?

Solo con respecto a la sentencia «read table binary search» debes de tener en cuenta que tu tabla interna c_gt_1001 debe estar ordenado por los campos que se usaran como filtro. Es decir antes de iniciar la lectura a tu tabla interna debes aplicar la sentenciaSORT c_gt_1001 BY objid sobid. Añadelo antes de iniciar el LOOP. Seria asi:

SORT c_gt_1001 BY objid sobid. 
LOOP AT gt_datatab INTO gs_archivo.
READ TABLE c_gt_1001 ASSIGNING <gfs_hrp1001> WITH KEY
objid = gs_archivo-objid
sobid = gs_archivo-funcion
BINARY SEARCH.
endloop.

Saludos.

2 Me gusta

Yo he hecho y el resultado es el mismo

Una pregunta, los campos deben de ser claves para que eso funcione?

En la tabla del Infotipo 1001 el campo sobid no es un campo clave, pero yo debo leer como filtro ese campo. usando un LOOP anidado eso me funciona, como tambien me funciona sin el BINARY SEARCH.

Por favor me puedes aclarar si esto es asi?

Prueba a ordenar ambas tablas por los mismos campos

Este tema se cerró automáticamente 91 días después del último post. No se permiten nuevas respuestas.