Conteúdo

Deu TIMEOUT ou ALLOC MEMORY no seu SELECT? OPEN CURSOR pode ser a solução

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.