Luiz Fernando Posted March 12, 2018 Report Share Posted March 12, 2018 Pessoal alguém aqui gera arquivo remessa com muitos registro , neste exato momento faz uma hora(AINDA NÃO TERMINOU) que estou esperando para gerar uma remessa de 3700 boletos, apenas gravar o arquivo txt sem envolvimento com tabelas vejam o codigo oFile1 = TTxtFile():New( cPath1+"BOLETO\REMESSA\"+marqui ) wlin='0' // 001 a 001 wlin+='1' // 002 a 002 wlin+='REMESSA' // 003 a 009 wlin+='01' // 010 a 011 wlin+='COBRANÇA'+space(7) // 012 a 026 wlin+='00330221756203300152' // 027 a 046 wlin+='EMPRESA TESTE TESTE TESTE TEST' // 047 a 076 wlin+='033' // 077 a 079 wlin+='SANTANDER'+space(6) // 080 a 094 wlin+=strzero(day(date()),2)+strzero(month(date()),2)+RIGHT(STR(YEAR(date()),4),2) // 095 a 100 wlin+=repl('0',16) // 101 a 116 wlin+=space(47) // 117 a 163 wlin+=space(47) // 164 a 210 wlin+=space(47) // 211 a 257 wlin+=space(47) // 258 a 304 wlin+=space(47) // 305 a 351 wlin+=space(34) // 352 a 385 wlin+=space(6) // 386 a 391 wlin+='044' // 392 a 394 wlin+=strzero(nRegistro,6)+chr(13)+chr(10) // 395 a 400 oFile1:PutStr( wlin ) for i=1 to len(aBoleto) nVMulta:=0 nVMulta:=round((aBoleto[i,5]*aCarteira[11])/100,2) oBoleto := oCBX:DocumentosCobranca:Add() oBoleto:NossoNumero := aBoleto[i,2] oCBX:calcularDadosBoletos() oCBX:GravaArquivoRemessa() nNosso:=substr(oBoleto:NossoNumero,6,8) wlin='1' // 001 a 001 wlin+='02' // 002 a 003 wlin+=R_CnpjLienar(aCarteira[20]) // 004 a 017 tratar wlin+='0036' // 018 a 021 tratar wlin+='02237522' // 022 a 029 tratar wlin+='02300372' // 030 a 037 tratar wlin+=aBoleto[i,4]+space(15) // 038 a 062 wlin+=nNosso // 063 a 070 wlin+='000000' // 071 a 076 wlin+=space(1) // 077 a 077 wlin+='0' // 078 a 078 wlin+='0000' // 079 a 082 wlin+='00' // 083 a 084 wlin+=repl('0',13) // 085 a 097 wlin+=space(4) // 098 a 101 wlin+='000000' // 102 a 107 wlin+='5' // 108 a 108 wlin+='01' // 109 a 110 wlin+=aBoleto[i,4] // 111 a 120 wlin+=strzero(day(aBoleto[i,10]),2)+strzero(month(aBoleto[i,10]),2)+RIGHT(STR(YEAR(aBoleto[i,10]),4),2) // 121 a 126 wlin+=strzero(aBoleto[i,5]*100,13) // 127 a 139 wlin+='033' // 140 a 142 wlin+='00000' // 143 a 147 wlin+='05' // 148 a 149 wlin+='N' // 150 a 150 wlin+=strzero(day(aBoleto[i,9]),2)+strzero(month(aBoleto[i,9]),2)+RIGHT(STR(YEAR(aBoleto[i,9]),4),2) // 151 a 156 wlin+='00' // 157 a 158 wlin+='00' // 159 a 160 wlin+=strzero(nVMulta*100,13) // 161 a 173 wlin+='000000' // 174 a 179 wlin+=repl('0',13) // 180 a 192 wlin+=repl('0',13) // 193 a 205 wlin+=repl('0',13) // 206 a 218 if len(alltrim(aBoleto[i,20])) <= 14 // 219 a 220 wlin+='01' else wlin+='02' endif wlin+=R_CnpjLienar(aBoleto[i,20]) // 221 a 234 wlin+=aBoleto[i,8] // 235 a 274 wlin+=aBoleto[i,12] // 275 a 314 wlin+=padr(aBoleto[i,15],12) // 315 a 326 wlin+=substr(aBoleto[i,18],1,5) // 327 a 331 wlin+=substr(aBoleto[i,18],7,3) // 332 a 334 wlin+=substr(aBoleto[i,16],1,15) // 335 a 349 wlin+=aBoleto[i,17] // 350 a 351 wlin+=space(30) // 352 a 381 wlin+=space(1) // 382 a 382 wlin+='I' // 383 a 383 wlin+='90' // 384 a 385 tratar wlin+=space(6) // 386 a 391 wlin+='00' // 392 a 393 wlin+=space(1) // 394 a 394 nRegistro++ wlin+=strzero(nRegistro,6)+chr(13)+chr(10) // 395 a 400 oFile1:PutStr( wlin ) nTotal+=aBoleto[i,5] next nRegistro++ wlin='9' wlin+=strzero(nRegistro,6) wlin+=strzero(nTotal*100,13) wlin+=repl('0',374) wlin+=strzero(nRegistro,6)+chr(13)+chr(10) oFile1:PutStr( wlin ) oFile1:End() Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted March 12, 2018 Author Report Share Posted March 12, 2018 Atualizando a informação levou 2 horas e 30 minutos para gerar o arquivo acima, agora preciso gerar outro lote com 18mil, se algum colega tiver alguma dica. Obrigdo Quote Link to comment Share on other sites More sharing options...
miragerr Posted March 12, 2018 Report Share Posted March 12, 2018 Ola, Bom dia Como o arquivo envolvido vai ficando muito grade, por que voce não gera esse arquivo por registros, exemplo, a cada 500 boletos, voce regra um arquivo de remessa, creio que ficaria muito mais rápido, ou voce pode usar o proprio Mysql pra isso, digo isso pois quando EU gerava o arquivo de SPED CONTRIBUIÇÃO consolidado e são 22 filiais e arquivo ficava monstruoso o numero de linhas, ai resolvi fazer o proprio Mysql gerar o TXT, ai ficou só o peido... rápidão... é assim que faço em Mysql: Select dados_1 FROM tempo2 ORDER BY sequencia, sr_recno into outfile '"+Alltrim(oSystema:Caminho_Sped_Fiscal)+"/"+cNomeDestino+"' LINES TERMINATED BY '\r\n'; Espero ter ajudado. Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted March 12, 2018 Author Report Share Posted March 12, 2018 Ola, Bom dia Como o arquivo envolvido vai ficando muito grade, por que voce não gera esse arquivo por registros, exemplo, a cada 500 boletos, voce regra um arquivo de remessa, creio que ficaria muito mais rápido, ou voce pode usar o proprio Mysql pra isso, digo isso pois quando EU gerava o arquivo de SPED CONTRIBUIÇÃO consolidado e são 22 filiais e arquivo ficava monstruoso o numero de linhas, ai resolvi fazer o proprio Mysql gerar o TXT, ai ficou só o peido... rápidão... é assim que faço em Mysql: Select dados_1 FROM tempo2 ORDER BY sequencia, sr_recno into outfile '"+Alltrim(oSystema:Caminho_Sped_Fiscal)+"/"+cNomeDestino+"' LINES TERMINATED BY '\r\n'; Espero ter ajudado. Jackson obrigado pelo retorno, na verdade estes boleto são gerados de uma unica vez e precisa estar no mesmo arquivo remessa, pois ele tem uma sequencia obrigadoria, e o mesmo vai para grafica do banco para eles fazer a impressão por la, tipo agora tenho um lote aqui de 19.962 boletos, se eu gerar o arquivo remessa da forma convencional que costumo geral, vai levar 20 horas, preciso achar um macete. obg Luiz Fernando Quote Link to comment Share on other sites More sharing options...
fladimir Posted March 13, 2018 Report Share Posted March 13, 2018 Usa MultiThread, tipo pegando a ideia do colega miragerr de gerar por partes, faz isso mas pro mesmo arquivo via Thread, ai vc usa mais processadores pra mesma tarefa... Kkkk isso é uma ideia nem sei se tem como fazer, talvez tenha, pq MultiTrhead é um conceito q existe no Harbour, e jogar pro mesmo arquivo como percebi vc joga pro objeto então se passar esse objeto como parâmetro/referencia vai carregando ele.. será q não dá certo? Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted March 13, 2018 Author Report Share Posted March 13, 2018 Usa MultiThread, tipo pegando a ideia do colega miragerr de gerar por partes, faz isso mas pro mesmo arquivo via Thread, ai vc usa mais processadores pra mesma tarefa... Kkkk isso é uma ideia nem sei se tem como fazer, talvez tenha, pq MultiTrhead é um conceito q existe no Harbour, e jogar pro mesmo arquivo como percebi vc joga pro objeto então se passar esse objeto como parâmetro/referencia vai carregando ele.. será q não dá certo? Colega falei com Jackson em off, não tenho como extrair todos dados dentro de um SELECT preciso percorrer mesmo por uma array e montar o arquivo, o lance de quebrar não adianta muito, pois tentei com 1mil e demora proporcional a mesma coisa. Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted March 13, 2018 Author Report Share Posted March 13, 2018 Pessoal meu problema estava aqui oBoleto := oCBX:DocumentosCobranca:Add() oBoleto:NossoNumero := aBoleto[i,2] oCBX:calcularDadosBoletos() oCBX:GravaArquivoRemessa() nNosso:=substr(oBoleto:NossoNumero,6,8) a cada boleto eu estava usando o recurso da cobrebem para gerar o digito do nosso numero fiz o calculo direto no select cSql:=" SELECT boleto,CASE(11-" cSql+=" MOD(((SUBSTRING(boleto,1,1)*7)+(SUBSTRING(boleto,2,1)*6)+(SUBSTRING(boleto,3,1)*5)+(SUBSTRING(boleto,4,1)*4)+(SUBSTRING(boleto,5,1)*3)+(SUBSTRING(boleto,6,1)*2)),11))" cSql+=" WHEN 0 THEN '0' WHEN 1 THEN '1' WHEN 2 THEN '2' WHEN 3 THEN '3' WHEN 4 THEN '4' WHEN 5 THEN '5' WHEN 6 THEN '6' WHEN 7 THEN '7' WHEN 8 THEN '8' WHEN 9 THEN '9' WHEN 10 THEN '0' WHEN 11 THEN '0' END AS 'mod/11'" cSql+=" FROM boleto" agora gera o arquivo em 40 segundos Obigrado a todos Luiz Fernando aferra 1 Quote Link to comment Share on other sites More sharing options...
fladimir Posted March 13, 2018 Report Share Posted March 13, 2018 Legal... parabéns... Quote Link to comment Share on other sites More sharing options...
miragerr Posted March 14, 2018 Report Share Posted March 14, 2018 Ola...Boa noite Voce gerou o arquivo pelo MYSQL ? Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted March 15, 2018 Author Report Share Posted March 15, 2018 Ola...Boa noite Voce gerou o arquivo pelo MYSQL ? Sim Jackson, na hora que gero boleto eu não gravo o digito do nosso numero, dai na hora de gerar o arquivo remessa uso a função da cobrebem, pelo manual do banco vi que o calculo era simples, dai gerei um select que me traz o numero do boleto e já faz o calculo do digito do nosso numero no proprio select conforme o código acima. Abs Luiz Fernando Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.