Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Meses


Rodrigo Niedzeilski

Pergunta

Amigos,

Gostaria de uma ajuda... Eu tenho uma tabela que possui a data do pagamento...

O usuário digita um período de tempo e a consulta retorna os clientes que não pagaram neste período.

A minha dúvida é a seguinte... Gostaria de extrair todos os meses que o cliente não pagou...

Por exemplo: cliente 1 pagou os meses

04, 05, 07, 09 e 11

O sistema deverá informar os meses 06, 08 e 10.

Se existir uma possibilidade de resolver meu problema eu agradeço, pois já tentei diversas formas que corrigí-lo.

Agradecido,

Rodrigo

Link para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 0

Os meses que o cara pagou eu consigo..

O que eu quero saber são os meses que não foram pagos...

Estou no trabalho é não tenho a estrutura aqui.

Mais são duas tabelas uma de cliente (id, nome, datacadastro) que se relaciona ONE-TO-MANY com uma de pagamento (id, idcliente, valorpago, datapagamento)

É mais ou menos isso.

Link para o comentário
Compartilhar em outros sites

  • 0
Amigos,

Gostaria de uma ajuda... Eu tenho uma tabela que possui a data do pagamento...

O usuário digita um período de tempo e a consulta retorna os clientes que não pagaram neste período.

A minha dúvida é a seguinte... Gostaria de extrair todos os meses que o cliente não pagou...

Por exemplo: cliente 1 pagou os meses

04, 05, 07, 09 e 11

O sistema deverá informar os meses 06, 08 e 10.

Se existir uma possibilidade de resolver meu problema eu agradeço, pois já tentei diversas formas que corrigí-lo.

Agradecido,

Rodrigo

Para ajudá-lo na confecção de sua select necessito de mais informações (não precisam ser reais apenas um modelo do que você quer). Uma pequena estrutura com os campos mais importantes, tais como: data de pagamento (com informação de preenchimento obrigatório ou não), data de vencimento (com informação de preenchimento obrigatório ou não), etc.

Se constam no cadastro somente a data do pagamento

att

Denis Courcy

Editado por Denis Courcy
Link para o comentário
Compartilhar em outros sites

  • 0

Oi, Rodrigo!

Analisei seu problema e cheguei a uma solução que passa por alguns passos:

1 Criação de uma tabela temporária e carga dos dados nela (poderia ser uma storage procedure)

A tabela temporária deverá ter os campos idcliente e mes.

a carga consistem em 12 registro para cada cliente

o primary key ficará com os dois campos (idcliente, mes);

Create temporary table temp (
   idcliente int not null,
   mes int not null,
   primary (idcliente, mes)
);
2 A seleção que fornecerá sua resposta
Select t.idcliente, t.mes from temp t
left join pagamento p on t.clienteid = p.clienteid and t.mes = month(p.datapagamento)
where ISNULL(p.idcliente);
3 A exclusão da tabela temporária para liberação de memória
Drop temp;

Explicando o código:

Ao criar a tabela temporária com base na tabela de clientes estabelecemos um relacionamento válido para a tabela de pagamentos que responde a pergunta quem não pagou

No Select a cláusula Left Join retornará todas as linhas da tabela temp

independente ou não se há correspondente com pagamento.

Na cláusula where criamos o filtro para que seja retornado somente o que é desejado.

Inconvenientes:

A tabela temp tem que ser criada todas as vezes que necessitar rodar este tipo de consulta

A comparação t.mes = month(p.datapagamento) resultará em um table scan (ou seja, uma varredura completa em todas as 2 tabelas) porque a função precisa ser avaliada para cada registro da tabela pagamentos. Uma forma de melhorar esta performance seria criar um campo com mês de pagamento e este campo deveria ser indexado)

Analise e informe sucesso ou fracasso

att

Denis Courcy

Link para o comentário
Compartilhar em outros sites

  • 0

Denis,

Valeu mesmo.. Este sistema estou desenvolvendo em casa.... Por isso só mais tarde te dou um feedback da situação.

O grande problema disso foi que o meu cliente não usa ORDEM DE PAGAMENTO, através dela ficaria mais fácil gerar o relatório como ele solicitou.

Obrigado pela ajuda.

Rodrigo

Link para o comentário
Compartilhar em outros sites

  • 0

A solução que eu recomendaria é:

Implementar isso na linguagem de programação.

Fica bem simples.

Um array com os elementos {1,2,3,4,5,6,7,8,9,10,11,12}

E um array com o retorno da query que indica os meses que foi efetuado o pagamento.

Depois basta compara-los.

Valeu pela dica Denis.

;)

Link para o comentário
Compartilhar em outros sites

  • 0
Guest --rodrigoon --

Galera,

Desculpe a demora.. Conversei com o meu cliente, ele aceitou que fosse digitado a data do vencimento para o pagamento de seus clientes, com isso só tive que incluir mais um campo na tabela de pagamento.

E depois verificar pela data de pagamento quem pagou ou não, já que todos os clientes terão uma data de vencimento por mês.

Obrigado

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...