GARANTIR DESCONTO

Fórum Eita Select ruim...de sair!!!!!!!!!!!!!! #187604

09/10/2003

0

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

Responder

Posts

09/10/2003

Aroldo Zanela

Colega,

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


Responder

Gostei + 0

10/10/2003

Macario

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


Responder

Gostei + 0

10/10/2003

Aroldo Zanela

Colega,

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


Responder

Gostei + 0

10/10/2003

Macario

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


Responder

Gostei + 0

10/10/2003

Adilsond

  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;



Responder

Gostei + 0

10/10/2003

Macario

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


Responder

Gostei + 0

10/10/2003

Macario

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?


Responder

Gostei + 0

10/10/2003

Joilson_gouveia

[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;


Responder

Gostei + 0

10/10/2003

Macario

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;


Responder

Gostei + 0

10/10/2003

Joilson_gouveia

Params[4].Value := hoje;

Altere a Linha acima para

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


Responder

Gostei + 0

10/10/2003

Adilsond

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é+


Responder

Gostei + 0

10/10/2003

Macario

nao funcionou....continua dando a mesma mensagem


Responder

Gostei + 0

10/10/2003

Adilsond

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.


Responder

Gostei + 0

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

Aceitar