Luiz Fernando Posted February 12, 2018 Report Share Posted February 12, 2018 Bom dia, colegas num cliente vou ter que gerar coisa de 12000 insert de uma unica vez, são 3 tabelas, então seria 36000, como terei que fazer isto uma vez por mês, queria otimizar a rotina da melhor forma possivel, veja abaixo como fiz, caso alguém tiver uma sugestão de melhorar este processo. 1) primeiro passo crio um array com todos os registro que deverão ser inserido na tabela for i=1 to len(aSql) for j=1 to 12 if !empty(cData[j]) pegar_numero_pedido(@cPedido) // inserir venda na array aadd(aVendas, { space(9),ctod(""),space(6),0,0,0,0,space(2),space(1),space(3),space(2),0,space(2)} ) a1++ aVendas[a1,1]:=cPedido // 01 pedido aVendas[a1,2]:=cEmissao[j] // 02 emissao aVendas[a1,3]:=aSql[i,1] // 03 cliente aVendas[a1,4]:=val(aSql[i,3]) // 04 subtotal aVendas[a1,5]:=0 // 05 descoonto aVendas[a1,6]:=val(aSql[i,3]) // 06 total aVendas[a1,7]:=0 // 07 encargo aVendas[a1,8]:=cTerminal // 08 terminal aVendas[a1,9]:='2' // 09 condicao aVendas[a1,10]:=aSql[i,7] // 10 vendedor aVendas[a1,11]:=cUsuario // 11 usuario if aSql[i,9]='0' aVendas[a1,12]:=1 // 12 operacao else aVendas[a1,12]:=3 // 12 operacao endif aVendas[a1,13]:=space(2) // 13 empresa // inseir parcela aadd(aParcela,space(9),space(4),space(11),ctod(""),0,space(6),ctod(""),space(1),space(2),space(2),0,space(2),space(2),space(3),space(2) ,space(6),,"","","","","","","","",space(40) } ) a2++ aParcela[a2,1]:=cPedido // 01 pedido aParcela[a2,2]:="0101" // 02 fatura aParcela[a2,3]:=cPedido+"A" // 03 duplicata aParcela[a2,4]:=cData[j] // 04 vencto aParcela[a2,5]:=val(aSql[i,3]) // 05 valor da parcela aParcela[a2,6]:=aSql[i,1] // 06 cliente aParcela[a2,7]:=cEmissao[j] // 07 data da emissão aParcela[a2,8]:='2' // 08 condicao aParcela[a2,9]:=aSql[i,5] // 09 forma de pagto aParcela[a2,10]:=aSql[i,6] // 10 tipo de documento if aSql[i,9]='0' aParcela[a2,11]:=1 // 11 operacao else aParcela[a2,11]:=3 // 11 operacao endif aParcela[a2,12]:=cTerminal // 12 terminal aParcela[a2,13]:=cUsuario // 13 usuario aParcela[a2,14]:=aSql[i,7] // 14 vendedor aParcela[a2,15]:=aSql[i,8] // 15 carteira aParcela[a2,16]:=space(6) // 16 numero do boleto aParcela[a1,17]:=aSql[i,11] // 17 endereco aParcela[a1,18]:=aSql[i,12] // 18 numero aParcela[a1,19]:=aSql[i,13] // 19 complemento aParcela[a1,20]:=aSql[i,14] // 20 bairro aParcela[a1,21]:=aSql[i,15] // 21 municipio aParcela[a1,22]:=aSql[i,16] // 22 estado aParcela[a1,23]:=aSql[i,17] // 23 cep aParcela[a1,24]:=aSql[i,18] // 24 cnpj_cnpf aParcela[a1,25]:=aSql[i,2] // 25 razao social // insetir pedido aadd(aPedido, { space(9),space(1),space(6),0,0,0,ctod(""),space(6),0,0 } ) a3++ aPedido[a3,1]:=cPedido // 01 numero do pedido aPedido[a3,2]:='1' // 02 tipo '1' venda aPedido[a3,3]:=aSql[i,10] // 03 codigo do produto aPedido[a3,4]:=1.00 // 04 qtde aPedido[a3,5]:=val(aSql[i,3]) // 05 valor da parcela aPedido[a3,6]:=0 // 06 desconto aPedido[a3,7]:=cEmissao[j] // 07 data da emissao aPedido[a3,8]:=aSql[i,1] // 08 cliente aPedido[a3,9]:=0.00 // 09 custo if aSql[i,9]='0' aPedido[a3,10]:=1 // 10 operacao else aPedido[a3,10]:=3 // 10 operacao endif endif next next 2) depois faço o INSERT em cada tabela, da forma abaixo // Gravar Vendas SQLBeginTrans() for i=1 to len(aVendas) * 1 2 3 4 5 6 7 8 9 cSql:="INSERT INTO vendas(pedido,data,cliente,subtotal,desconto,total,encargo,terminal,condicao" * 10 11 12 13 14 15 cSql+=",vendedor,usuario,data1,hora1,operacao,empresa"+")" cSql+="VALUES( "+any2sql(aVendas[i,1])+" ," // 01 cSql+=" "+any2sql(aVendas[i,2])+" ," // 02 cSql+=" "+any2sql(aVendas[i,3])+" ," // 03 cSql+=" "+any2sql(aVendas[i,4])+" ," // 04 cSql+=" "+any2sql(aVendas[i,5])+" ," // 05 cSql+=" "+any2sql(aVendas[i,6])+" ," // 06 cSql+=" "+any2sql(aVendas[i,7])+" ," // 07 cSql+=" "+any2sql(aVendas[i,8])+" ," // 08 cSql+=" "+any2sql(aVendas[i,9])+" ," // 09 cSql+=" "+any2sql(aVendas[i,10])+" ," // 10 cSql+=" "+any2sql(aVendas[i,11])+" ," // 11 cSql+=" SUBSTRING(now(),1,10) ," // 12 cSql+=" SUBSTRING(now(),12,5) ," // 13 cSql+=" "+any2sql(aVendas[i,12])+" ," // 14 cSql+=" "+any2sql(aVendas[i,13])+")" // 15 SqlExecute(cSql) if SQLErrorNO() > 0 fMensagem() return(.f.) endif next SqlExecute("commit") SQLRollBack() SQLEndTrans() SQLRefresh() Quote Link to comment Share on other sites More sharing options...
evandro Posted February 12, 2018 Report Share Posted February 12, 2018 Olá, Gere apenas uma linha com os inserts. Pode ser que tenha de dividir em uns 3 ou 4. * 1 2 3 4 5 6 7 8 9 cSql:="INSERT INTO vendas(pedido,data,cliente,subtotal,desconto,total,encargo,terminal,condicao" * 10 11 12 13 14 15 cSql+=",vendedor,usuario,data1,hora1,operacao,empresa"+")" cSql+="VALUES " for i=1 to len(aVendas) cSql+="( "+any2sql(aVendas[i,1])+" ," // 01 cSql+=" "+any2sql(aVendas[i,2])+" ," // 02 cSql+=" "+any2sql(aVendas[i,3])+" ," // 03 cSql+=" "+any2sql(aVendas[i,4])+" ," // 04 cSql+=" "+any2sql(aVendas[i,5])+" ," // 05 cSql+=" "+any2sql(aVendas[i,6])+" ," // 06 cSql+=" "+any2sql(aVendas[i,7])+" ," // 07 cSql+=" "+any2sql(aVendas[i,8])+" ," // 08 cSql+=" "+any2sql(aVendas[i,9])+" ," // 09 cSql+=" "+any2sql(aVendas[i,10])+" ," // 10 cSql+=" "+any2sql(aVendas[i,11])+" ," // 11 cSql+=" SUBSTRING(now(),1,10) ," // 12 cSql+=" SUBSTRING(now(),12,5) ," // 13 cSql+=" "+any2sql(aVendas[i,12])+" ," // 14 cSql+=" "+any2sql(aVendas[i,13])+") " // 15 cSql+=iif( i=len( aVendas), "", "," ) next SqlExecute(cSql) if SQLErrorNO() > 0 fMensagem() return(.f.) endif Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted February 12, 2018 Author Report Share Posted February 12, 2018 Opa legal Evandro não sabia disto, o codigo fica mais limpo, sera que ganha tb em desempenho. Obrigado Quote Link to comment Share on other sites More sharing options...
evandro Posted February 12, 2018 Report Share Posted February 12, 2018 Olá, Ganha muuuuuuuuuuuuito. Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted February 13, 2018 Author Report Share Posted February 13, 2018 Evandro fiz os teste aqui com 100 insert e realmente ficou bem mais rápido, muito obrigado pela dica. Pode ser que tenha de dividir em uns 3 ou 4. só não entendi isto, pq terei que dividir em 3 ou 4 Obrigado Luiz Fernando Quote Link to comment Share on other sites More sharing options...
evandro Posted February 13, 2018 Report Share Posted February 13, 2018 Olá, É que se a string com a query ficar muito grande dá problema. Para evitar eu sempre limito a 5.000 registros. Mas teve uma tabela com muitos campos que tive de reduzir. Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted February 13, 2018 Author Report Share Posted February 13, 2018 Olá, É que se a string com a query ficar muito grande dá problema. Para evitar eu sempre limito a 5.000 registros. Mas teve uma tabela com muitos campos que tive de reduzir. Entendi, vou quebrar aqui em cada 3mil então, para não ter problemas, Evandro valeu pelas dicas. Abs Luiz Fernando Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted March 8, 2018 Author Report Share Posted March 8, 2018 Olá, Ganha muuuuuuuuuuuuito. somente uma conclusão final 1) antes de mudar para forma que o Evandro passou geração de mil boletos 4 tabelas envolvida na operação, duração 47 minutos 2) mudando toda logica para utilizar da forma passado pelo Evandro geração de mil boletos 4 tabelas envolvida na operação, duração 2 minutos obs: agora pronto para gerar 42 mil boletos de uma unica vez, muita gente diz que passou pro mysql e ficou lento, pode ter certeza que é query indevida. Evandro mais uma vez obrigado pela ajuda. agora no update sera que não tem como fazer algo igual, tentei assim no codigo abaixo mais da erro SQLBeginTrans() cSql:="UPDATE parcela SET" for i=1 to len(aParcela) cSql+=" boleto ="+any2sql(aParcela[i,16])+" " cSql+=" WHERE duplicat ='"+aParcela[i,3]+"'" cSql+=iif( i=len( aParcela), "", "'" ) next sqlexecute(cSql) if SQLErrorNO() > 0 fMensagem() endif SqlExecute("commit") SQLRollBack() SQLEndTrans() SQLRefresh() 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.