Eita Select ruim...de sair!!!!!!!!!!!!!!
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
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
Curtidas 0
Respostas
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.
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
09/10/2003
Entao Zanela é justamente isso...
o group by funciona sem o uso do SUM mas ai..ele nao soma as notas corretamentes
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
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
09/10/2003
Colega,
Eu me referia a necessidade de utilizar o group by + a função sum.
Eu me referia a necessidade de utilizar o group by + a função sum.
GOSTEI 0
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
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
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
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
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
09/10/2003
poderia ser assim
mas aparece type mistach expression?
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
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;
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
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;
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
09/10/2003
Params[4].Value := hoje;
Altere a Linha acima para
Params[4].Value := [b:42cc1e5891]DateToStr(hoje);[/b:42cc1e5891]
Altere a Linha acima para
Params[4].Value := [b:42cc1e5891]DateToStr(hoje);[/b:42cc1e5891]
GOSTEI 0
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é+
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
09/10/2003
nao funcionou....continua dando a mesma mensagem
GOSTEI 0
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