Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

deivis

SQL - Consulta demorada

Recommended Posts

Olá, estou construindo um módulo de contas a pagar, este conta com opções de forma de pagamento da conta, e a quem será pago a conta.

O problema está acontecendo na consulta deste, para mostrar o resultado da consulta é necessário relacionar 8 tabelas. A consulta conta com as seguintes tabelas:

1. Conta -> Informações sobre a conta

2. CondPagamentoCP -> Condições de pagamento de cada conta

3. Fornecedores -> a quem será pago a conta

4. Funcionarios -> a quem será pago a conta

5. Bancos -> a quem será pago a conta

6. Outros -> a quem será pago a conta

7. Entidades -> a quem será pago a conta

8. Transportadoras -> a quem será pago a conta

 

Então cada vez que vou cadastrar uma conta escolho a quem será pago a conta(itens 4 a 8), e gravo na tabela de Conta o código a quem foi pago e se é Fornecedores('FO'), Funcionários('FU'), Bancos('BA')...

Fiz a seguinte SQL:

SELECT CP.Codigo, CP.NumNf, CP.DataLancamento,  CP.Pagoa, CP.CodPagoa, CP.Conta,  CP.Valor, CP.ValorTotal, CP.ValorPago,  CondCP.Codigo as CodCondPagamento, CondCP.CodContaPgto,  CondCP.Condicao, CondCP.Valor as ValorCondicao, CondCP.DataVencimento,  CondCP.DataPagamento, CondCP.Situacao,  IF (CP.Pagoa='FO', Forn.RazaoSocial,	IF (CP.Pagoa = 'EN', Ent.RzSocial,	  IF(CP.Pagoa = 'FU', Fun.Nome,		IF(CP.Pagoa = 'BA', Ban.Nome,		  IF(CP.Pagoa = 'TR', Trans.RazaoSocial, NOut.Nome))))) as NomeRzSocialFROM ContasPagar CP, Fornecedores Forn,  Entidades Ent, Funcionarios Fun, Bancos Ban,  NomesOutros NOut, CondPagamentoCP CondCP, Transportadoras TransWHERE  (IF (CP.Pagoa = 'FO', Forn.Codigo = CP.CodPagoa,	IF (CP.Pagoa = 'EN', Ent.Codigo = CP.CodPagoa,	 IF (CP.Pagoa = 'FU', Fun.Codigo = CP.CodPagoa,	  IF (CP.Pagoa = 'BA', Ban.Codigo = CP.CodPagoa,	   IF (CP.Pagoa = 'TR', Trans.Codigo = CP.CodPagoa,		NOut.Codigo = CP.CodPagoa))))))  AND CondCP.CodContaPgto = CP.Codigo  AND CP.Codigo = :Codigo  GROUP BY CondCP.Codigo
A SQL acima faz o que eu quero, mas só que esta consulta fica muito demorada mesmo quando a tabela tem poucos registros.

Caso alguém tenha uma idéia de como melhorá-la ou outra solução me envie.

Estou usando o MySql e o componente Zeos para acessá-lo.

 

Atenciosamente, Deivis.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, tipo, explica melhor o seu objetivo com essa query....ai agente pode te ajudar melhor...flw aew!!!to no aguardo da resposta...

O objetivo, é montar uma lista com os dados da conta tipo vencimentos, valores, e a quem foi pago a conta, e é nessa parte que a consulta pesa, pois como foi isto acima a conta pode ser paga a Fornecedores, Funcionário, Bancos, Transportadoras, Outros, Entidades. Então uso o 'IF' para verificar qual é o tipo de credor, e de acordo com o tipo eu seleciono o nome deste na tabela correspondente onde o mesmo está cadastrado, e relaciono-os com o código que foi gravado na tabela de Contas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenta ver se muda algo na velocidade, fazendo algo do tipo:

 

/*FORNECEDORES*/SELECT CP.Codigo, CP.NumNf, CP.DataLancamento, CP.Pagoa, CP.CodPagoa, CP.Conta, CP.Valor, CP.ValorTotal, CP.ValorPago,CondCP.Codigo as CodCondPagamento, CondCP.CodContaPgto, CondCP.Condicao, CondCP.Valor as ValorCondicao, CondCP.DataVencimento,CondCP.DataPagamento, CondCP.Situacao, 'FO' as Tipo, Forn.RazaoSocial as NomeRzSocialFROM ContasPagar CP, Fornecedores Forn, CondPagamentoCP CondCPWHERE CP.Pagoa = 'FO'and Forn.Codigo = CP.CodPagoaand CondCP.CodContaPgto = CP.Codigoand CP.Codigo = :CodigoUNION/*FUNCIONARIOS*/SELECT CP.Codigo, CP.NumNf, CP.DataLancamento, CP.Pagoa, CP.CodPagoa, CP.Conta, CP.Valor, CP.ValorTotal, CP.ValorPago,CondCP.Codigo as CodCondPagamento, CondCP.CodContaPgto, CondCP.Condicao, CondCP.Valor as ValorCondicao, CondCP.DataVencimento,CondCP.DataPagamento, CondCP.Situacao, 'FU' as Tipo, Fun.Nome as NomeRzSocialFROM ContasPagar CP, Funcionarios Fun, CondPagamentoCP CondCPWHERE CP.Pagoa = 'FU'and Fun.Codigo = CP.CodPagoa,and CondCP.CodContaPgto = CP.Codigoand CP.Codigo = :CodigoUNION/*BANCOS*/SELECT CP.Codigo, CP.NumNf, CP.DataLancamento, CP.Pagoa, CP.CodPagoa, CP.Conta, CP.Valor, CP.ValorTotal, CP.ValorPago,CondCP.Codigo as CodCondPagamento, CondCP.CodContaPgto, CondCP.Condicao, CondCP.Valor as ValorCondicao, CondCP.DataVencimento,CondCP.DataPagamento, CondCP.Situacao, 'BA' as Tipo, Ban.Nome as NomeRzSocialFROM ContasPagar CP, Bancos Ban, CondPagamentoCP CondCPWHERE CP.Pagoa = 'BA'and Ban.Codigo = CP.CodPagoaAND CondCP.CodContaPgto = CP.CodigoAND CP.Codigo = :CodigoUNION/*OUTROS*/SELECT CP.Codigo, CP.NumNf, CP.DataLancamento, CP.Pagoa, CP.CodPagoa, CP.Conta, CP.Valor, CP.ValorTotal, CP.ValorPago,CondCP.Codigo as CodCondPagamento, CondCP.CodContaPgto, CondCP.Condicao, CondCP.Valor as ValorCondicao, CondCP.DataVencimento,CondCP.DataPagamento, CondCP.Situacao, 'NO' as Tipo, Trans.RazaoSocial as NomeRzSocialFROM ContasPagar CP, NomesOutros NOut, CondPagamentoCP CondCPWHERE CP.Pagoa = 'NO'and NOut.Codigo = CP.CodPagoaAND CondCP.CodContaPgto = CP.CodigoAND CP.Codigo = :CodigoUNION/*ENTIDADES*/SELECT CP.Codigo, CP.NumNf, CP.DataLancamento, CP.Pagoa, CP.CodPagoa, CP.Conta, CP.Valor, CP.ValorTotal, CP.ValorPago,CondCP.Codigo as CodCondPagamento, CondCP.CodContaPgto, CondCP.Condicao, CondCP.Valor as ValorCondicao, CondCP.DataVencimento,CondCP.DataPagamento, CondCP.Situacao, 'EN' as Tipo, Ent.RzSocial as NomeRzSocialFROM ContasPagar CP, Entidades Ent, CondPagamentoCP CondCPWHERE CP.Pagoa = 'EN'and Ent.Codigo = CP.CodPagoaand CondCP.CodContaPgto = CP.Codigoand CP.Codigo = :CodigoUNION/*TRANSPORTADORAS*/SELECT CP.Codigo, CP.NumNf, CP.DataLancamento, CP.Pagoa, CP.CodPagoa, CP.Conta, CP.Valor, CP.ValorTotal, CP.ValorPago,CondCP.Codigo as CodCondPagamento, CondCP.CodContaPgto, CondCP.Condicao, CondCP.Valor as ValorCondicao, CondCP.DataVencimento,CondCP.DataPagamento, CondCP.Situacao, 'TR' as Tipo, Trans.RazaoSocial as NomeRzSocialFROM ContasPagar CP, Transportadoras Trans, CondPagamentoCP CondCPWHERE CP.Pagoa = 'TR'and Trans.Codigo = CP.CodPagoaand NOut.Codigo = CP.CodPagoaAND CondCP.CodContaPgto = CP.CodigoAND CP.Codigo = :Codigo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Realmente, somente a partir da versão 4 existe o comando union, q pena...

Existe alguma outra solução? Algo que possa ser feito no Delphi, sem ser preciso manipular a SQL?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo delphi teria como você fazer, no caso poderia fazer um SQL simples, trazendo algo do tipo:

 

SELECT CP.Codigo, CP.NumNf, CP.DataLancamento, CP.Pagoa, CP.CodPagoa, CP.Conta,  CP.Valor, CP.ValorTotal, CP.ValorPago,  CondCP.Codigo as CodCondPagamento, CondCP.CodContaPgto,CondCP.Condicao, CondCP.Valor as ValorCondicao, CondCP.DataVencimento, CondCP.DataPagamento, CondCP.Situacao, CP.PagoaFROM ContasPagar CP, CondPagamentoCP CondCPWHERE CondCP.CodContaPgto = CP.CodigoAND CP.Codigo = :Codigo
E na sua qry que irá ter toda a instrução, você cria um campo do tipo Calculado, no Evento OnCalcFields da qry efetua a busca pelo nome de acordo com o tipo no campo Pagoa, algo do tipo:

 

if qryPagoa.AsString = 'FO' then	qryCAMPO_CALCULADO_NOME.Value:=Funcao_Busca_Nome_Fornecedor(qryCodPagoa.Value);if qryPagoa.AsString = 'FU' then	qryCAMPO_CALCULADO_NOME.Value:=...
Lhe garanto que vai ficar mais rápido do que o seu SQL que faz hoje...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo delphi teria como você fazer, no caso poderia fazer um SQL simples, trazendo algo do tipo:

 

SELECT CP.Codigo, CP.NumNf, CP.DataLancamento, CP.Pagoa, CP.CodPagoa, CP.Conta,  CP.Valor, CP.ValorTotal, CP.ValorPago,  CondCP.Codigo as CodCondPagamento, CondCP.CodContaPgto,CondCP.Condicao, CondCP.Valor as ValorCondicao, CondCP.DataVencimento, CondCP.DataPagamento, CondCP.Situacao, CP.PagoaFROM ContasPagar CP, CondPagamentoCP CondCPWHERE CondCP.CodContaPgto = CP.CodigoAND CP.Codigo = :Codigo
E na sua qry que irá ter toda a instrução, você cria um campo do tipo Calculado, no Evento OnCalcFields da qry efetua a busca pelo nome de acordo com o tipo no campo Pagoa, algo do tipo:

 

if qryPagoa.AsString = 'FO' then	qryCAMPO_CALCULADO_NOME.Value:=Funcao_Busca_Nome_Fornecedor(qryCodPagoa.Value);if qryPagoa.AsString = 'FU' then	qryCAMPO_CALCULADO_NOME.Value:=...
Lhe garanto que vai ficar mais rápido do que o seu SQL que faz hoje...
Obrigado, ficou bem mais rápido assim.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo delphi teria como você fazer, no caso poderia fazer um SQL simples, trazendo algo do tipo:

 

SELECT CP.Codigo, CP.NumNf, CP.DataLancamento, CP.Pagoa, CP.CodPagoa, CP.Conta,  CP.Valor, CP.ValorTotal, CP.ValorPago,  CondCP.Codigo as CodCondPagamento, CondCP.CodContaPgto,CondCP.Condicao, CondCP.Valor as ValorCondicao, CondCP.DataVencimento, CondCP.DataPagamento, CondCP.Situacao, CP.PagoaFROM ContasPagar CP, CondPagamentoCP CondCPWHERE CondCP.CodContaPgto = CP.CodigoAND CP.Codigo = :Codigo
E na sua qry que irá ter toda a instrução, você cria um campo do tipo Calculado, no Evento OnCalcFields da qry efetua a busca pelo nome de acordo com o tipo no campo Pagoa, algo do tipo:

 

if qryPagoa.AsString = 'FO' then	qryCAMPO_CALCULADO_NOME.Value:=Funcao_Busca_Nome_Fornecedor(qryCodPagoa.Value);if qryPagoa.AsString = 'FU' then	qryCAMPO_CALCULADO_NOME.Value:=...
Lhe garanto que vai ficar mais rápido do que o seu SQL que faz hoje...
Apesar de ter ficado rápido assim, ocorre o problema de que quando estou editando os registros, a cada vez que mudo de um registro para o outro é chamada esta função, sendo que já foi pesquisado o nome, teria algum outro evento onde seja efetuada a busca apenas uma vez?

Compartilhar este post


Link para o post
Compartilhar em outros sites

CRIA UMA VARIÁVEL DO TIPO BOOLEAN...

 

AI FAZ ASSIM:

 

 

IF NOT JAFOI THEN

BEGIN

if qryPagoa.AsString = 'FO' then

qryCAMPO_CALCULADO_NOME.Value:=Funcao_Busca_Nome_Fornecedor(qryCodPagoa.Value);

if qryPagoa.AsString = 'FU' then

qryCAMPO_CALCULADO_NOME.Value:=...

END;

 

AI QUANDO VOCÊ QUISER QUE ELE EXECUTE VOCÊ PASSA:

 

JAFOI := FALSE;

 

 

 

http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.