Giovani, primeiramente desculpe se te ofendi dizendo para não fazerem aquilo. Agora sobre a degradação de performance... Executando do modo que vc havia dito, o servidor faria um full table scan, encaminhando todo o resultado pela rede. Até aqui vc degradaria o tráfego da rede. Imagine o seguinte cenário: conectado por Dial-up em um servidor remoto, por linha discada a 56Kbps. Seu link estaria completamente comprometido, isso sem contar que você pode ter milhões de registros transitando nesse link. Sobre o loop... princípios de best pratices. Todo loop degrada a performance de qualquer aplicação, portanto use com moderação. Eu executei um loop básico que segue abaixo
For Contador:= 1 to 300000 do Essa simples instrução no meu servidor durou apenas 5 segundos. E olha que 300000 registros retornados é facilmente obtido por uma query simples. A mesma instrução variando de 1 a 1000000 durou 13 segundos. Esse mesmo loop foi executado em máquinas clientes e duraram 15% a mais. Outro motivo. Utilize sempre a arquitetura cliente-servidor. Como o servidor é uma máquina com maior capacidade de processamento, porque trazer o trabalho para uma máquina de menor capacidade? Mesmo que essa rotina seja executada uma vez por mês, não existe o porquê trazer o processamento para uma máquina de menor capacidade. Outro fator para melhorar a performance, é fazer essa rotina como Stored Procedure. Já aconteceu de rotinas que haviam sido implementadas no cliente que foram transformadas em Stored Procedures que melhoraram o tempo de resposta em 35%. Bem, agora sobre fevereiro... Realmente do modo que coloquei no meu exemplo não prevê os 28 ou 29 dias de fevereiro. É um caminho das pedras, e não a solução pronta. O que deve ser feito é tratar sempre pelo mês, ou seja, criar uma rotina para tirar três meses e retornar a data base. Quanto aos diferentes dias de vencimento, como foi dito no e-mail, só serve o exemplo que passei se a rotina for para 90 dias CORRIDOS a partir do vencimento. Caso a rotina seja por dias acumulados, deve-se fazer com um loop. Nesse caso recomendo implementar em uma Stored Procedure e retorar apenas os usuários que estão em atraso a 90 dias ACUMULADOS. E os que foram pagos mesmo fora do vencimento, não estão atrasados, pois já foram pagos. Sem mais. -----Mensagem original----- De: Giovani - Terra [mailto:[EMAIL PROTECTED] Enviada em: terça-feira, 15 de fevereiro de 2005 18:41 Para: delphi-br@yahoogrupos.com.br Assunto: Re: [delphi-br] Re: Mensalidades... Sr. Rodrigo... E em fevereiro? E quando o pagamento for feito em dias diferenciados? Nunca fale NÃO FAÇA ISSO para alguém que está tentando ajudar, ok? O negócio é o seguinte... Quando alguém pede uma ajuda, está tentando solucionar um problema. O fato é que existem n maneiras para solucionar o mesmo problema. Se você pensa diferente do que eu penso, ótimo, pois isso é baseado no fator humano. Outra coisa... Porque sacrificar a performance dentro de um loop? Isso vai ser feito para um UNICO CLIENTE, e somente em 3 meses... Não entendi aí o fator performance. Gostaria que fosse explanado. ----- Original Message ----- From: Rodrigo Villaverde To: delphi-br@yahoogrupos.com.br Sent: Tuesday, February 15, 2005 3:02 PM Subject: RES: [delphi-br] Re: Mensalidades... Não faça isso! Não sacrifique a performance do seu aplicativo! Resolva isso com uma instrução SQL Const DiasAtrazados= 90; Var DataLimite: TDateTime; DataLimite:= Now - DiasAtrazados; ... Dentro da sua cláusula where coloque a seguinte condição DataVencimento < DataLimite Se a pesquisa retornar vazia, é sinal que não existem mensalidades com mais de 3 meses de atraso. Mas isso só vai funcionar se o período que quer medir é dias corridos à partir do vencimento. Se for por dias acumulados de todos os atrasos, a cláusula where acima não irá funcionar. ---------- No virus found in this outgoing message. Checked by AVG Anti-Virus. Version: 7.0.300 / Virus Database: 265.8.8 - Release Date: 14/2/2005 [As partes desta mensagem que não continham texto foram removidas] -- <<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>> Para ver as mensagens antigas, acesse: http://br.groups.yahoo.com/group/delphi-br/messages Para falar com o moderador, envie um e-mail para: [EMAIL PROTECTED] ou [EMAIL PROTECTED] Links do Yahoo! Grupos -- <<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>> Para ver as mensagens antigas, acesse: http://br.groups.yahoo.com/group/delphi-br/messages Para falar com o moderador, envie um e-mail para: [EMAIL PROTECTED] ou [EMAIL PROTECTED] Links do Yahoo! Grupos <*> Para visitar o site do seu grupo na web, acesse: http://br.groups.yahoo.com/group/delphi-br/ <*> Para sair deste grupo, envie um e-mail para: [EMAIL PROTECTED] <*> O uso que você faz do Yahoo! Grupos está sujeito aos: http://br.yahoo.com/info/utos.html