Eita Select ruim...de sair!!!!!!!!!!!!!!

Delphi

09/10/2003

quem pode me dizer pq esse select nao aceita se eu colocar um SUM

na linha em destaque

eu preciso do SUM para agrupar todas os intens da nota

se eu adicionar o SUM ele nao aceita eu acho que seja por causa da linha com substring




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.nnf as Nota,´); [color=blue:f293635113][b:f293635113] SQL.Add(´ (N.vlr * N.qte + n.ipi+n.encpro+n.encipi) as Valor,´);[/b:f293635113][/color:f293635113] SQL.Add(´ ((substring (n.dnf from 1 for 2))+´´/´´+´); SQL.Add(´ (substring (n.dnf from 4 for 2))+´´/´´+´); SQL.Add(´ (substring (n.dnf from 7 for 4)))as data´); 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(´ and (:dia - n.data > :dia)´); // 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; // Params[4].Value := Copy(mdtDataB.Text,1,2)+´/´+Copy(mdtDataB.Text,4,2)+´/´+Copy(mdtDataB.Text,7,2); Open;



Macario

Macario

Curtidas 0

Respostas

Aroldo Zanela

Aroldo Zanela

09/10/2003

Colega,

Neste caso, é necessário utilizar o group by para utilizar sum. A propósito, cuidado com a precendência dos operadores aritiméticos.


GOSTEI 0
Macario

Macario

09/10/2003

Entao Zanela é justamente isso...

o group by funciona sem o uso do SUM mas ai..ele nao soma as notas corretamentes

EX. NF Produto Valor QTD Total 1 001001 10 2 20 1 001105 10 2 20 1 022200 20 1 20






E teria que ser dessa forma

NF Total
1 60
2 125



SQL.Add(´ sum (N.vlr * N.qte + n.ipi+n.encpro+n.encipi) as Valor´);

alguma solução


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

09/10/2003

Colega,

Eu me referia a necessidade de utilizar o group by + a função sum.


GOSTEI 0
Macario

Macario

09/10/2003

Putz viajei...olha só o problema é na conversao da data

usando substring ai o group by nao funciona pq nao tenho um nome de campo valido, pois ele nao aceita data como nome de campo


GOSTEI 0
Adilsond

Adilsond

09/10/2003

  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.nnf as Nota,´);
      SQL.Add(´       sum(N.vlr * N.qte + n.ipi + n.encpro + n.encipi) as Valor,´);
      SQL.Add(´       max(cast(substring(n.dnf from 1 for 2) || ´ + QuotedStr(´/´) +
        ´|| substring(n.dnf from 4 for 2) || ´ + QuotedStr(´/´) +
        ´|| substring(n.dnf from 7 for 4) as data)) as Data´);
      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(´  and (cast(substring(n.dnf from 1 for 2) || ´ + QuotedStr(´/´) +
        ´|| substring(n.dnf from 4 for 2) || ´ + QuotedStr(´/´) +
        ´|| substring(n.dnf from 7 for 4) as data) >= :data)´);
      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, C.v1´);
      Params[0].Value := mdtCliIni.Text;
      Params[1].Value := mdtCliFim.Text;
      Params[2].Value := mdtRepIni.Text;
      Params[3].Value := mdtRepFim.Text;
      Params[4].Value := StrToDate(Copy(mdtDataB.Text,1,2) + ´/´ +
                                   Copy(mdtDataB.Text,4,2) + ´/´ +
                                   Copy(mdtDataB.Text,7,2));
      Open;
    end;



GOSTEI 0
Macario

Macario

09/10/2003

Colegas com a ajuda de vcs falta pouco...

agora é o seguinte preciso obter o total de dias entra a ultima nota de cada cliente e o dia base passado como parametro


GOSTEI 0
Macario

Macario

09/10/2003

poderia ser assim


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(´ and (( (substring (n.dnf from 1 for 2)) +´´/´´+´); SQL.Add(´ (substring (n.dnf from 4 for 2)) +´´/´´+´); SQL.Add(´ (substring (n.dnf from 7 for 4)) )- :dia >= :inativo)´); SQL.Add(´Group by C.v1, C.v2, C.v4, C.v5, C.v12, C.v13,R.v1, R.v2, C.datacad, n.nnf , n.dnf´); 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; Params[4].Value := Copy(mdtDataB.Text,1,2)+´/´+Copy(mdtDataB.Text,4,2)+´/´+Copy(mdtDataB.Text,7,4); Params[5].Value := StrToInt(mdtInativo.Text); Open;



mas aparece type mistach expression?


GOSTEI 0
Joilson_gouveia

Joilson_gouveia

09/10/2003

[b:16995bf71a]Acho que o erro está no parâmetro em vermelho...[/b:16995bf71a]
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(´ and (( (substring (n.dnf from 1 for 2)) +´´/´´+´);
SQL.Add(´ (substring (n.dnf from 4 for 2)) +´´/´´+´);
SQL.Add(´ (substring (n.dnf from 7 for 4)) )- [color=red:16995bf71a]:dia [/color:16995bf71a]>= :inativo)´);
SQL.Add(´Group by C.v1, C.v2, C.v4, C.v5, C.v12, C.v13,R.v1, R.v2, C.datacad, n.nnf , n.dnf´);
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;
[color=red:16995bf71a]Params[4].Value := Copy(mdtDataB.Text,1,2)+´/´+Copy(mdtDataB.Text,4,2)+´/´+Copy(mdtDataB.Text,7,4); [/color:16995bf71a]Params[5].Value := StrToInt(mdtInativo.Text);
Open;


GOSTEI 0
Macario

Macario

09/10/2003

olhem so como esta esse selct

agora eu preciso obter o numero de dias

entra a data atual e a data da nota fiscal


ele esta dando a mensagem

type mismatch in expression


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.nnf as Nota,´);
SQL.Add(´ N.dnf as data,´);
SQL.Add(´ sum (N.vlr * N.qte + n.ipi+n.encpro+n.encipi) as Valor,´);
SQL.Add(´ max( (substring (n.dnf from 1 for 2)) +´´/´´+´);
SQL.Add(´ (substring (n.dnf from 4 for 2)) +´´/´´+´);
SQL.Add(´ (substring (n.dnf from 7 for 4)) ) as data´);
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(´ and (:dia - (cast( (substring (n.dnf from 1 for 2)) +´´/´´+´);
SQL.Add(´ (substring (n.dnf from 4 for 2)) +´´/´´+´);
SQL.Add(´ (substring (n.dnf from 7 for 4)) as date))) >= :inativo´);
SQL.Add(´Group by C.v1, C.v2, C.v4, C.v5, C.v12, C.v13,R.v1, R.v2, C.datacad, n.nnf , n.dnf´);
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;
Params[4].Value := hoje;
Params[5].Value := StrToInt(mdtInativo.Text);
Open;
end;


GOSTEI 0
Joilson_gouveia

Joilson_gouveia

09/10/2003

Params[4].Value := hoje;

Altere a Linha acima para

Params[4].Value := [b:42cc1e5891]DateToStr(hoje);[/b:42cc1e5891]


GOSTEI 0
Adilsond

Adilsond

09/10/2003

Duas coisas:

1 - Altere SQL.Add(´ (substring (n.dnf from 7 for 4)) as date))) >= :inativo´); para
SQL.Add(´ (substring (n.dnf from 7 for 4)) as date)) >= :inativo)´);

2 - Coloque o seguinte comando:

Params[5].Value := StrToInt(mdtInativo.Text);
SQL.SaveToFile(´C:\MinhaQuery.txt´);
Open;

Depois abra o arquivo gerado e verifique como ficou sua query, inclusive voce pode executa-la no DBExplorer para verificar possíveis erros.


Té+


GOSTEI 0
Macario

Macario

09/10/2003

nao funcionou....continua dando a mesma mensagem


GOSTEI 0
Adilsond

Adilsond

09/10/2003

Beleza. Então coloca aqui o código gerado para a sua consulta(aquele gerado no comando SQL.SaveToFile(´C:\MinhaQuery.txt´);). Assim é mais fácil analisar.


GOSTEI 0
POSTAR