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).
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.
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.