Luiz Fernando Posted March 16, 2018 Report Share Posted March 16, 2018 Pessoal com a ajuda de alguns colega aqui consegui resolver problema de lentidão no mysql com SELECT e, INSERT , mais com UPDATE sera que tem algum macete. SELECT, no exemplo abaixo busco vários registros de uma unica vez cPedidos := "" for i=1 to len(aBaixas) cPedidos += ANY2SQL( aBaixas[i,1] ) + "," next cPedidos := Left(cPedidos,Len(cPedidos)-1) cSql="SELECT p.duplicat,date_format(p.vencto,'%d/%m/%y'),p.boleto,p.valor,p.cliente,c.razao" cSql+=",p.pago,date_format(p.pagto,'%d/%m/%y')" cSql+=" FROM parcela as p" cSql+=" LEFT JOIN cliente as c on p.cliente = c.cod_client" cSql+=" WHERE p.duplicat IN ("+ cPedidos + ") " INSERT, no exemplo abaixo consigo dar o insert em vários registro indo no banco de dados uma unica vez SQLBeginTrans() * 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 SqlExecute("commit") SQLRollBack() SQLEndTrans() SQLRefresh() UPDATE, agora aqui como fazer algo para ir no banco uma unica vez ???? SQLBeginTrans() for i=1 to len(aBaixas) cSql:="UPDATE parcela SET" cSql+=" encargo="+any2sql(aBaixas[i,9])+" ," cSql+=" desconto="+any2sql(0)+" ," cSql+=" pagto="+any2sql(aBaixas[i,7])+" ," cSql+=" pago="+any2sql(aBaixas[i,8])+" ," cSql+=" usu_b="+any2sql(cUsuario)+" ," cSql+=" data_b= SUBSTRING(now(),1,10) ," cSql+=" hora_b= SUBSTRING(now(),12,5) ," cSql+=" maq_b="+any2sql(cTerminal)+" ," cSql+=" lotepago="+any2sql(cLote)+" " cSql+=" WHERE duplicat ='"+ALLTRIM(aBaixas[i,1])+"'" sqlexecute(cSql) if SQLErrorNO() > 0 fMensagem() return(.f.) endif next SQLExecute("commit") SQLRollBack() SQLEndTrans() SQLRefresh() Obg Luiz Fernando Quote Link to comment Share on other sites More sharing options...
jfaguiar Posted March 16, 2018 Report Share Posted March 16, 2018 Olá boa noite. Você está utilizando sqlrdd ou FW puro? Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted March 16, 2018 Author Report Share Posted March 16, 2018 Olá boa noite. Você está utilizando sqlrdd ou FW puro? Bom dia, colega uso a sqllib, mais se vc tiver algum script para esta finalidade, ira dar certo, pois instrução sql é uma coisa só. Obg Luiz Fernando Quote Link to comment Share on other sites More sharing options...
kleyber Posted March 17, 2018 Report Share Posted March 17, 2018 Luiz Fernando, Infelizmente no caso do UPDATE não tem como. Tens que fazer como estás fazendo, ou seja, executando todos os UPDATEs que são necessários. Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted March 17, 2018 Author Report Share Posted March 17, 2018 Luiz Fernando, Infelizmente no caso do UPDATE não tem como. Tens que fazer como estás fazendo, ou seja, executando todos os UPDATEs que são necessários. Perfeito Kleyber, era só para saber mesmo, em caso de update em massa o importante que o campo que estiver no WHERE seja um indexador, dai podemos fazer update de 2mil 5mil registro que não demora nada. Obg 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.