Ir para conteúdo

POWERED BY:

Arquivado

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

InterPlanet

[Resolvido] Como limitar o retorno desta SQL?

Recommended Posts

Boa noite!

 

A situação:

 

Tenho uma tabela que armazena os registros de cobranças de todas as vendas do sistema. Resumindo, ao cadastrar a venda X, posso definir o pagamento parcelado em 20x, por exemplo, dai o sistema gera 20 cobranças com seus respectivos vencimentos.

 

Este mesmo sistema, tem um módulo de envio das cobranças por email, via cron, assim, ao rodar o cron, preciso verificar todas as cobranças que devem ser enviadas, daí:

 

Tenho a seguinte SQL:

<?php

$SQL = 'SELECT Codigo, Venda, Venda_Referencia, Parcela, Valor, DATE_FORMAT(Vencimento, "%d/%m/%Y") AS Vencimento, IF (Email_Data = NULL, "", DATE_FORMAT(Email_Data, "%d/%m/%Y")) AS Envio, Status
         FROM '.TAB_Cobrancas.'
        WHERE (Status = "Cobrança" OR Status = "Atrasada")';
?>

 

Até ai, perfeito, contudo, no caso das 20 cobranças da venda X, e no caso de 50 vendas com 24 cobrançaas cada... Ja dá pra sacar o problema ne?

 

O Problema:

 

Preciso limitar esta SQL para me retornar somente a cobrança em aberto com vencimento mais proximo ou a última vencida de cada venda, assim, economizando recursos e agilizando o processamento do script!

 

Imaginei GROUP BY, HAVING (este em especial nao sei usar bem)...

 

Alguma luz?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpe-me Fernando, é capaz que não tenha entendido direito, porém, no intuito de ajudar vou lançar...

Se estiver muito fora do que você pensou, grita.

 

Se você mandar um dump pequeno aqui posso testar e ficar "bão" pra você.

 

seria algo como

 

Select *(aqui você dá uma adaptada), min(Vencimento)

Group by Venda having Status = 'Atrasada'

 

para a última vencida de cada venda é assim

 

Select *(aqui você dá uma adaptada), min(Vencimento) (sendo essa a mais antiga), max(Vencimento) (a vencida a menos tempo)

Group by Venda having Status = 'Atrasada' and Vencimento < cur_date()

 

Assim ele vai te dar a 'Atrasada' com o vencimento menor, ou seja, mais próximo. Se você quiser mexer com a data mais próxima de agora, melhor mexer com um curdate()...

 

Se estiver muito fora, explique melhor, mande um recordset que vejo melhor! ;)

 

 

Considerei aqui que "atrasada" significa "não pago"...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Considerei aqui que "atrasada" significa "não pago"...

 

Isto mesmo!

 

Dei uma testada no seu exemplo com group by e ordenando pelo vencimento! FUNFOU! :D

Vlw!

 

O resultado:

 

<?php

$SQL = 'SELECT Codigo, Venda, Venda_Referencia, Parcela, FORMAT(Valor, 2) AS Valor, DATE_FORMAT(Vencimento, "%d/%m/%Y") AS Vencimento, IF (Email_Data = NULL, "", DATE_FORMAT(Email_Data, "%d/%m/%Y")) AS Envio, Status
         FROM '.TAB_Cobrancas.'
        WHERE (Status = "Cobrança" OR Status = "Atrasada") GROUP BY Venda ORDER BY Vencimento ASC';
?>

 

Apesar de nao ter entendido 100% a logica, imagino que o "GROUP BY Venda" esta limitando a coleta de apenas um registro por venda, no caso, por conta do "ORDER BY Vencimento", retornando apenas ultimo vencimento "WHERE Status = "Cobrança" OR Status = "Atrasada".

 

Muito obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites
Preciso limitar esta SQL para me retornar somente a cobrança em aberto com vencimento mais proximo ou a última vencida de cada venda, assim, economizando recursos e agilizando o processamento do script!

 

 

algo como

 

where ...
and (data_vencimento >= "data corrente" or data_pagamento is null)
...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa @Motta,

 

Na verdade eu nao preciso comparar o vencimento com a data corrente (isto e feito noutra parte do script), somente coletar a parcela mais antiga em aberto ou atrasada, eliminando o retorno das demais e economizando tempo e recursos. Contudo, grato pela ajuda.

 

A SQL do meu post anterior, com as dicas do @Yuri, funfou, retorna somente "a ultima vencida ou a proxima a vencer", vale lembrar que ha outro cron que diariamente atualiza os status para "Cobrança" (em aberto) e "Atrasada" (vencida). Alguma sugestao de melhoria ou correção na SQL atual?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa @Motta,

 

Na verdade eu nao preciso comparar o vencimento com a data corrente (isto e feito noutra parte do script), somente coletar a parcela mais antiga em aberto ou atrasada, eliminando o retorno das demais e economizando tempo e recursos. Contudo, grato pela ajuda.

 

A SQL do meu post anterior, com as dicas do @Yuri, funfou, retorna somente "a ultima vencida ou a proxima a vencer", vale lembrar que ha outro cron que diariamente atualiza os status para "Cobrança" (em aberto) e "Atrasada" (vencida). Alguma sugestao de melhoria ou correção na SQL atual?

 

Eu deixaria assim, principalmente pq você segmenta tudo no código, como você disse..soh pode controlar melhor...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se o dado não será exibido não vejo motivo para o SQL o trazer, menos dados trafegando.

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.