O que acha de ir trabalhando um grupo de dados antes mesmo de finalizar a seleção de todos os dados?
Basicamente é isto que o comando OPEN CURSOR faz.
_Ah, mas o SELECT ... END SELECT faz isso.
Se você realmente chegou a pensar nisso, na boa, nem tente entender o código abaixo, recomendo estudar um pouco sobre PERFORMANCE e BEST PRATICES.
Eis um código para estudar e aplicar para sua solução.
REPORT ZSAPeiros.
DATA:
lv_cursor TYPE cursor,
lt_j_1bnfdoc TYPE TABLE OF j_1bnfdoc,
ls_j_1bnfdoc TYPE j_1bnfdoc.
GET TIME STAMP FIELD DATA(lv_ini).
WRITE:/ lv_ini.
OPEN CURSOR lv_cursor
FOR SELECT *
FROM j_1bnfdoc
WHERE docdat LE sy-datum.
IF sy-subrc IS NOT INITIAL.
WRITE:/ 'Erro ao abrir o cursor'.
REJECT.
ENDIF.
DO.
FETCH NEXT CURSOR lv_cursor
INTO TABLE lt_j_1bnfdoc
PACKAGE SIZE 100. "Quantidade de registros por bloco
IF sy-subrc IS NOT INITIAL.
WRITE / '----- FIM DO BLOCO -----'.
EXIT.
ENDIF.
WRITE / '----- INÍCIO DO BLOCO -----'.
LOOP AT lt_j_1bnfdoc INTO ls_j_1bnfdoc.
WRITE:/ ls_j_1bnfdoc-docnum.
ENDLOOP.
WRITE / '----- FIM DO BLOCO -----'.
ENDDO.
GET TIME STAMP FIELD DATA(lv_fim).
WRITE:/ lv_fim.