Jump to content
Fivewin Brasil

insert em massa mysql


Luiz Fernando

Recommended Posts

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

 

Link to comment
Share on other sites

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 

 

Link to comment
Share on other sites

  • 4 weeks later...
 

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

 

 

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...