GARANTIR DESCONTO

Fórum Select de morrer!!!!!!! #187519

09/10/2003

0

Ola colegas...

este mesmo select ja postei varias vezes e ainda nao consegui uma solução...

estou criando um relatorio de clientes inativos no qual tem que obedecer os seguintes parametros

Ex:

Cliente Inicial : 00001 Cliente Final: 00100 Representante Inicial : 00001 Representante Final: 00800 Numero de dias inativo maior que : 10 Maior numero de dias em atrso : 45 Data Base : 01.08.2003



os resultados são os campos

codigo do cliente [color=green:9b8ded1475]Nome do cliente Codigo do representante Nome do representante municipio UF contato fone[/color:9b8ded1475] [color=red:9b8ded1475][b:9b8ded1475]dias inativos[/b:9b8ded1475][/color:9b8ded1475]nº da nota [b:9b8ded1475]dias em atraso[/b:9b8ded1475] [color=green:9b8ded1475]valor da nota data da nota[/color:9b8ded1475]


o que estou tendo problemas ha dias e nao consigo resolver é como chegar ao calculo de dias inativos e dias em atraso.

uma pq o padra das datas esta assim [b:9b8ded1475]01.01.2003[/b:9b8ded1475], usando ponto al invez de barra

esse select ja me retorna os campos acima marcados em verde

sera que alguem pode me ajudar

um abraço a todos

[i:9b8ded1475]Título editado. Leia as [url=http://delphiforum.icft.com.br/forum/viewtopic.php?t=6689&sid=add834b4ed94967502cf2381c38e751a][u:9b8ded1475]Regras de Conduta[/u:9b8ded1475][/url]. (marcelo.c – Moderador)[/i:9b8ded1475]


Macario

Macario

Responder

Posts

09/10/2003

Macario

oops esqueci de postar o select


with QryTemp do begin Close; DatabaseName := DM.TArqEmpr.DatabaseName; SQL.Clear; SQL.Add(´select C.v1 as Cod,´); SQL.Add(´ C.v2 as Cliente,´); SQL.Add(´ C.v4 as Municipio,´); SQL.Add(´ C.v5 as UF,´); SQL.Add(´ C.v12 as Contato,´); SQL.Add(´ C.v13 as Telefone,´); SQL.Add(´ R.v1 as codrep,´); SQL.Add(´ R.v2 as Representante,´); SQL.Add(´ C.Datacad,´); SQL.Add(´ N.Dnf as Data,´); SQL.Add(´ N.nnf as Nota,´); SQL.Add(´ Sum(N.vlr * N.qte + n.ipi+n.encpro+n.encipi) as Valor´); // SQL.Add(´ cast ((substring (n.dnf from 1 for 2))+´´/´´+´); // SQL.Add(´ (substring (n.dnf from 3 for 2))+´´/´´+´); // SQL.Add(´ (substring (n.dnf from 5 for 4))as date)´); SQL.Add(´from arqclie C,´); SQL.Add(´ arqprnf N,´); SQL.Add(´ arqrepr R´); SQL.Add(´where (C.v1 = N.ncl)´); SQL.Add(´ and (R.v1 = N.nre)´); SQL.Add(´ and (N.nnf = (select max(NF.nnf)´); SQL.Add(´ from arqprnf NF´); SQL.Add(´ where NF.ncl = C.v1 and nf.nre = r.v1))´); SQL.Add(´ and (C.v1 between :cli1 and :cli2)´); SQL.Add(´ and (N.nre between :rep1 and :rep2)´); SQL.Add(´Group by C.v1, C.v2, C.v4, C.v5, C.v12, C.v13,R.v1, R.v2, C.datacad, n.dnf, n.nnf ´); SQL.Add(´order by R.v1,´); SQL.Add(´ C.v1´); Params[0].Value := mdtCliIni.Text; Params[1].Value := mdtCliFim.Text; Params[2].Value := mdtRepIni.Text; Params[3].Value := mdtRepFim.Text; Open; end;



Responder

Gostei + 0

09/10/2003

Marcelo.c

Está meio confuso, qual a sua dúvida:

a. Alterar o formato da Data ?
b. Efetuar cálculos sobre datas ?
c. Exibir os campos na consulta ?
d. Todas as Alternativas Acima ?
e. Outra não listada ?


Responder

Gostei + 0

09/10/2003

Fava

Com SQL você pode fazer muita coisa, inclusive acho que uma UDF pode resolver este problema para você, no entanto SQL não é tudo, experimente um pouco de programação para resolver este tido de problema.

Crie campos calculados em seu TQuery e no evento oncalcfields faça a conversão dos campos para data e faça os calculos que tiver que fazer.


Responder

Gostei + 0

09/10/2003

Macario

Está meio confuso, qual a sua dúvida: a. Alterar o formato da Data ? b. Efetuar cálculos sobre datas ? c. Exibir os campos na consulta ? d. Todas as Alternativas Acima ? e. Outra não listada ?



bom no caso são quase todas

veja primeiro eu tenho que converter a data pq se nao eu acho que nao

conseguirei fazer os calculos, lembrando que o padrão das datas é

01.01.2003 usando ´.´ (ponto ao invez de ´/´

ai eu tenho que verificar a partir de quantos dias inativos eu devo listar,

[b:6bd88a61f9]Ex: se o cliente tiver comprado pela ultima vez há 09/09/2003 e o parametro dias inativos for apenas 10 esse cliente nao deve ser listado[/b:6bd88a61f9]

eu ate tava tentando usar Cast mas nao consegui pq ele aponta um erro no group by

outra coisa seria mostrar so os clientes com o maior numero em atrso segundo o parametro tambem...


nao sei se isso tem que ser feito com if ou outra instrução...


eu ja to pirando....até pra tentar explicar melhor..rs..rs..rs


grato pela atenção


Responder

Gostei + 0

09/10/2003

Macario

Crie campos calculados em seu TQuery e no evento oncalcfields faça a conversão dos campos para data e faça os calculos que tiver que fazer.



vc pode me daru um exemplo..outra coisa...nem queira saber qual é o banco..rs..rs..rs...usado


Responder

Gostei + 0

09/10/2003

Marcelo.c

Se você não pode alterar a Data do sistema, pode fazer com que o Delphi utilize um formato independente.

No início da sua aplicação utilize:

ShortDateFormat=´dd/mm/yy´;

Este seria o primeiro passo.

Daqui a pouco eu volto e complemento. (Vou ter que sair)


Responder

Gostei + 0

09/10/2003

Macario

colegas é exatamente o contrario

quando a aplicação é iniciada é passado DateSeparator := ´.´;

e isso eu nao posso tirar


Responder

Gostei + 0

09/10/2003

Marcelo.c

Para calcular as datas, tente assim:

var 
  d, u, a: TdateTime;
  dinat, datraso: extended;
begin
  d:=Date();
  r:=TabelaDataUltimacompra.Value;
  a:=TabelaDataVence.Value;
  dinat:=d-r;
  datraso:=d-a;
  Showmessage(´O pagamento do Cliente está ´+currtoStr(datraso)+ ´ dias atrasado´);
  Showmessage(´O Cliente está inativo a ´+currtoStr(dinat)+´ dias´);
end;



Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar