Fórum SELECT SUM #57392

06/12/2006

0

Bom galera, sou participante viciado em foruns e resolvi entrar nesse tb, espero poder ajudar no que souber.
para iniciar, tenhu uma dúvida sobre o SUM com o C++ Builder 6...

AnsiString DE = MaskEdit1->Text;
AnsiString ATE = MaskEdit2->Text;

if(RBTODAS->Checked == true){


      DataModule1->IBQueryLocaliza5952->Close();
      DataModule1->IBQueryLocaliza5952->SQL->Clear();
      DataModule1->IBQueryLocaliza5952->SQL->Text = "SELECT * FROM DARF5952 WHERE DATA >= :DE AND DATA <= :ATE";
      DataModule1->IBQueryLocaliza5952->ParamByName("DE")->AsDateTime =(MaskEdit1->Text);
      DataModule1->IBQueryLocaliza5952->ParamByName("ATE")->AsDateTime = (MaskEdit2->Text);
      DataModule1->IBQueryLocaliza5952->Active = true;
      DataModule1->IBQueryLocaliza5952->Open();

}
if(RBSOMA->Checked == true){


      DataModule1->IBQueryPrinc5952->Close();
      DataModule1->IBQueryPrinc5952->SQL->Clear();
      DataModule1->IBQueryPrinc5952->SQL->Text = "SELECT //NOMETELEFONE, SUM(VALORPRINCIPAL)FROM DARF5952 WHERE DATA >= :DE AND DATA <= :ATE GROUP BY NOMETELEFONE";
DataModule1->IBQueryLocaliza5952->SQL->Text = "SELECT NOMETELEFONE, REF, PERIODOAP, NUMEROCGC, CODRECEITA, NUMEROREF, DATAVENC, VENCIMENTO, PRINCIPAL, VALORPRINCIPAL, VALORMULTA, VALORJUROS, VALORTOTAL, DARF5952VALOR, DATA, SUM(VALORPRINCIPAL)FROM DARF5952 WHERE DATA >= :DE AND DATA <= :ATE GROUP BY NOMETELEFONE";
      DataModule1->IBQueryPrinc5952->ParamByName("DE")->AsDateTime =(MaskEdit1->Text);
      DataModule1->IBQueryPrinc5952->ParamByName("ATE")->AsDateTime = (MaskEdit2->Text);
      DataModule1->IBQueryPrinc5952->Active = true;
      DataModule1->IBQueryPrinc5952->Open();

      }
}


Bom, na linha comentada o código funciona, pois seleciona apenas o NOMETELEFONE e mostra a soma, mas como ficaria para mostrar todos os campos?? coloquei separando por virgula só que não deu...

(qlq código eim delphi será bem aceito...)
obrigado..[b:4ca0700dcb][]´s[/b:4ca0700dcb]


Rostery

Rostery

Responder

Posts

06/12/2006

Emerson Nascimento

não sei se entendi direito, mas - no seu caso - para ter mais campos na instrução select você deverá colocá-los na cláusula [i:5adadf5525]group by[/i:5adadf5525], a menos que você use campos agregados com funções.


Responder

Gostei + 0

06/12/2006

Rostery

opa...se eu colocar após o Group by, acontece que ela mostra todos os
campos, mas não calcula, mostra todos como se eu estivesse fazendo
um select sem o sum do group by....
=(


Responder

Gostei + 0

06/12/2006

Emerson Nascimento

essa é uma característica de 100¬ dos bancos de dados.
para solucionar isso, use campos agregados.


Responder

Gostei + 0

06/12/2006

Rostery

um exemplo??
como assim??


Responder

Gostei + 0

06/12/2006

Emerson Nascimento

SELECT NOMETELEFONE, NUMEROCGC, SUM(VALORPRINCIPAL) VALORPRINCIPALTOTAL,
AVG(VALORMULTA) MEDIAMULTA, AVG(VALORJUROS) MEDIAJUROS, SUM(VALORTOTAL) VALORTOTAL,
SUM(DARF5952VALOR) DARF5952VALOR
FROM DARF5952
WHERE DATA >= :DE AND DATA <= :ATE
GROUP BY NOMETELEFONE, NUMEROCGC


Responder

Gostei + 0

07/12/2006

Rostery

[i:4c2df68892]Ele ta calculando errado mas mostrou os campos...eu tava tentando entender esse avg ae...
li no google q é uma média...é isso msm??
queria saber, qual a parte desse código que vc me passou que adiciona o resto dos campos...[/i:4c2df68892]

[i:4c2df68892]Falow cara...brigadão msm..[/i:4c2df68892]


Responder

Gostei + 0

11/12/2006

Rostery

[i:b4d9ae01da]Bom, consigui aki, ta faltando uma coisa q ta mais dificil e não consigui ainda...[/i:b4d9ae01da]

[b:b4d9ae01da]SELECT:[/b:b4d9ae01da]

´
SELECT NOMETELEFONE, SUM(VALORPRINCIPAL) VALORPRINCIPALTOTAL, AVG(VALORMULTA) VALORMULTA, AVG(VALORJUROS) VALORJUROS, SUM(VALORTOTAL) VALORTOTAL, SUM(DARF5952VALOR) DARF5952VALOR FROM DARF5952 WHERE DATA >= :DE AND DATA <= :ATE GROUP BY NOMETELEFONE";


[i:b4d9ae01da]ele pega os de msm nome e agrupa..
porém, esses de msm nome, são notas, cada uma com seu numero, depois que eu agrupar as de msm nome, como faço para inserir em um campo, o numero das notas..[/i:b4d9ae01da]

[b:b4d9ae01da]Ex.:[/b:b4d9ae01da]

[i:b4d9ae01da]Se agrupasse 4 notas de msm nome, tenho q mostrar o numero de cada uma que foi agrupada..

|Campo Notas|
001, 002, 007, 010[/i:b4d9ae01da]


Responder

Gostei + 0

11/12/2006

Emerson Nascimento

talvez a melhor forma de fazer isso seja com stored procedures...


Responder

Gostei + 0

11/12/2006

Rostery

Nossa cara, vou procurar no google...
mas eu num sei o que e isso q vc falou...
:(
se puder me dar um exemplo..
ou uma dica..
obrigado..


Responder

Gostei + 0

12/12/2006

Emerson Nascimento

eis um exemplo:
CREATE PROCEDURE DARF5952_CLI (
    de date,
    ate date)
returns (
    nometelefone varchar(50),
    valorprincipal float,
    mediamulta float,
    mediajuros float,
    valortotal float,
    darf5952valor float,
    notasfiscais varchar(150))
as
declare variable data date;
declare variable numeroref varchar(10);
begin
  for select
        NOMETELEFONE, sum(VALORPRINCIPAL) VALORPRINCIPAL,
        avg(VALORMULTA) MEDIAMULTA, avg(VALORJUROS) MEDIAJUROS,
        sum(VALORTOTAL) VALORTOTAL, sum(DARF5952VALOR) DARF5952VALOR
      from
        DARF5952
      where
        DATA between :DE and :ATE
      group by
        NOMETELEFONE
  into 
    :NOMETELEFONE, :VALORPRINCIPAL,
    :MEDIAMULTA, :MEDIAJUROS,
    :VALORTOTAL, :DARF5952VALOR do
  begin
    NOTASFISCAIS = ´´;

    for select
          NUMEROREF
        from
          DARF5952
        where
          DATA between :DE and :ATE
          and NOMETELEFONE = :NOMETELEFONE
    into
       :NUMEROREF do
    begin
      if (:NOTASFISCAIS <> ´´) then
        NOTASFISCAIS = NOTASFISCAIS || ´, ´;

      NOTASFISCAIS = NOTASFISCAIS || :NUMEROREF;
    end
  
    suspend;
  end
end

para executar use:
[b:5c5d3e2b2a]EXECUTE PROCEDURE DARF5952_CLI(´01.01.2006´, ´31.12.2006´)[/b:5c5d3e2b2a]
ou
[b:5c5d3e2b2a]SELECT * FROM DARF5952_CLI(´01.01.2006´, ´31.12.2006´)[/b:5c5d3e2b2a]


Responder

Gostei + 0

12/12/2006

Rostery

[i:65de5b4fff]brigado emerson, agora vou estudar isso ae, passar pro builder, só mais uma coisa, onde no meu programa coloco esse código??

flw..brigado msm..[/i:65de5b4fff][b:65de5b4fff][]´s[/b:65de5b4fff]


Responder

Gostei + 0

12/12/2006

Emerson Nascimento

o código deve ser colocado no interbase/firebird. isso é uma script para criar uma stored procedure. no ibexpert deve-se abrir o executor de scripts, colar o código e rodar. a sp deverá ser criada.

para executar:
if(RBSOMA->Checked){
      DataModule1->IBQueryPrinc5952->Close();
      DataModule1->IBQueryPrinc5952->SQL->Text = "SELECT * FROM DARF5952_CLI( :DE, :ATE )";
      DataModule1->IBQueryPrinc5952->ParamByName("DE")->AsDateTime =(MaskEdit1->Text);
      DataModule1->IBQueryPrinc5952->ParamByName("ATE")->AsDateTime = (MaskEdit2->Text);
      DataModule1->IBQueryPrinc5952->Open();
}



Responder

Gostei + 0

13/12/2006

Rostery

[i:d06b71255b]Cara, esse exemplo que vc me deu faz o que eu preciso neh??
putz....vou estudar isso, agora sei que é só criar ele no IBCONSOLE neh, e chamar no meu prog...nossa...valew...eu nunca usei esse stored..vou procurar aki blz??
obrigado pela ajuda..espero que de certo... =)
flw..[/i:d06b71255b][b:d06b71255b][]´s[/b:d06b71255b]


Responder

Gostei + 0

13/12/2006

Rostery

[i:02fc0e988f]eu fiz algumas alterações, mas ta dando erro agora... ta assim:(não mudo nd quase...)[/i:02fc0e988f]

CREATE PROCEDURE DARF5952 
( 
DE date, 
ATE date 
) 
returns( 
NOMETELEFONE varchar(50), 
VALORPRINCIPAL float, 
MEDIAMULTA float, 
MEDIAJUROS float, 
VALORTOTAL float, 
DARF5952VALOR float, 
NOTASFISCAIS varchar(150)) 
as 
declare variable DATA date; 
declare variable NUMEROREF varchar(10); 
begin 
for select 
NOMETELEFONE, sum(VALORPRINCIPAL) VALORPRINCIPAL, 
avg(VALORMULTA) MEDIAMULTA, avg(VALORJUROS) MEDIAJUROS, 
sum(VALORTOTAL) VALORTOTAL, sum(DARF5952VALOR) DARF5952VALOR 
from 
DARF5952 
where 
DATA between :DE and :ATE 
group by 
NOMETELEFONE 
into 
:NOMETELEFONE, :VALORPRINCIPAL, 
:MEDIAMULTA, :MEDIAJUROS, 
:VALORTOTAL, :DARF5952VALOR do 
begin 
NOTASFISCAIS = ´´; 

for select 
REF 
from 
DARF5952 
where 
DATA between :DE and :ATE 
and NOMETELEFONE = :NOMETELEFONE 
into 
:NUMEROREF do 
begin 
if (:NOTASFISCAIS <> ´´) then 
NOTASFISCAIS = NOTASFISCAIS || ´, ´; 

NOTASFISCAIS = NOTASFISCAIS || :NUMEROREF; 
end 

suspend; 
end 
end


[b:02fc0e988f]o ERRO:[/b:02fc0e988f]
Dynamic SQL Error SQL error code = -104 Unexpected end of command


[i:02fc0e988f]tentei mudar esses end´s de lugar, e comparei com um exemplo da internet, mas não consigui arrumar naum...
:(

q q é??[/i:02fc0e988f]


Responder

Gostei + 0

13/12/2006

Emerson Nascimento

primeira coisa: [b:137642f9f7]a stored procedure não poderá ter o mesmo nome da tabela[/b:137642f9f7].
DARF5952 já é o nome da tabela. não pode ser o nome da stored procedure!
SET TERM ^ ;

CREATE PROCEDURE SP_DARF5952 (
    de date,
    ate date)
returns (
    nometelefone varchar(50),
    valorprincipal float,
    mediamulta float,
    mediajuros float,
    valortotal float,
    darf5952valor float,
    notasfiscais varchar(150))
as
declare variable data date;
declare variable numeroref varchar(10);
begin
  for select
        NOMETELEFONE, sum(VALORPRINCIPAL) VALORPRINCIPAL,
        avg(VALORMULTA) MEDIAMULTA, avg(VALORJUROS) MEDIAJUROS,
        sum(VALORTOTAL) VALORTOTAL, sum(DARF5952VALOR) DARF5952VALOR
      from
        DARF5952
      where
        DATA between :DE and :ATE
      group by
        NOMETELEFONE
  into
    :NOMETELEFONE, :VALORPRINCIPAL,
    :MEDIAMULTA, :MEDIAJUROS,
    :VALORTOTAL, :DARF5952VALOR do
  begin
    NOTASFISCAIS = ´´;

    for select
          REF
        from
          DARF5952
        where
          DATA between :DE and :ATE
          and NOMETELEFONE = :NOMETELEFONE
    into
      :NUMEROREF do
    begin
      if (:NOTASFISCAIS <> ´´) then
        NOTASFISCAIS = NOTASFISCAIS || ´, ´;
      NOTASFISCAIS = NOTASFISCAIS || :NUMEROREF;
    end

    suspend;
  end
end^

SET TERM ; ^



Responder

Gostei + 0

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

Aceitar