Duvida Quebrar consulta em aquivos de 100 em 100 registros

Discussão em 'Progress 4GL' iniciado por woliveira, Janeiro 17, 2014.

  1. woliveira

    woliveira Sem Pontuação

    Tenho um for each de uma tabela e gostaria de exportar isso em varios arquivos com 100 registros até chegar ao ultimo que pode ter x registros (menor ou igual a 100).
  2. Rogerio

    Rogerio Moderator Moderador Equipe de Suporte

    Não sei se existe uma forma melhor, mas assim funciona...

    DEF VAR i-cont AS INT INIT 0.
    DEF VAR i-cont-arq AS INT INIT 0.
    DEF VAR c-arquivo AS CHAR.

    FOR EACH ITEM:
    IF i-cont = 0 THEN
    DO:
    ASSIGN i-cont-arq = i-cont-arq + 1
    c-arquivo = SESSION:TEMP-DIR + 'arq' + STRING(i-cont-arq) + '.txt'.
    OUTPUT TO VALUE(c-arquivo).
    END.
    ASSIGN i-cont = i-cont + 1.
    PUT ITEM.it-codigo ' - ' ITEM.desc-item SKIP.
    IF i-cont = 1000 THEN
    DO:
    ASSIGN i-cont = 0.
    OUTPUT CLOSE.
    END.
    END.
  3. woliveira

    woliveira Sem Pontuação

    Muito Obrigado....Era isso mesmo que precisava.
  4. Agnaldo

    Agnaldo Membro Ativo

    Seria bom fazer um teste a mais, pois ele pode nao chegar a 1000 na última passada e, consequentemente, não faria o close do último arquivo.
    Poderia fazer um teste de LAST junto ao IF = 1000, mas para não precisar fazer um break by no for each, podes testar fora do laço.
    Abaixo um cópia do código do @carlos Rogério, com esse teste a mais.
    PHP:
    DEF VAR i-cont AS INT INIT 0.
    DEF 
    VAR i-cont-arq AS INT INIT 0.
    DEF 
    VAR c-arquivo AS CHAR.

    FOR 
    EACH ITEM:
        IF 
    i-cont = 0
           THEN
               
    DO:
                  
    ASSIGN i-cont-arq = i-cont-arq + 1
                  c
    -arquivo = SESSION:TEMP-DIR + 'arq' + STRING(i-cont-arq) + '.txt'.
                  
    OUTPUT TO VALUE(c-arquivo).
               
    END.
        
    ASSIGN i-cont = i-cont + 1.
        PUT ITEM
    .it-codigo ' - ' ITEM.desc-item SKIP.
        IF 
    i-cont = 1000
           THEN
               
    DO:
                  
    ASSIGN i-cont = 0.
                  OUTPUT CLOSE
    .
               
    END.
    END.
    /* 
    se i-cont-arq > 0 então ele havia passado por dentro do for each anterior 
    e se i-cont > 0 então ele não passou pela parte do close do arquivo, 
    uma vez que a ultima passada não chegou aos mil registros da quebra 
    */
    IF i-cont > 0 AND i-cont-arq > 0
       THEN
           OUTPUT CLOSE
    .
    Última edição: Janeiro 17, 2014
    unimedsjc curtiu isso.

Compartilhe esta Página