Consulta Anual
Galera :D , Tenho uma base de dados no SQL Server, ´TB VENDAS´ eu estou precisando criar uma consulta para que eu possa gera um grafico que me forneça total de Vendas por Mes de Jan a Dez onde eu quero informar apenas o ano. estou utilizando Delphi 7 com SQL Server 7
1º Exemplo: Ano 2003
Teria como resultado
Jan Fev Mar Abril ..... Nov Dez
12,32 250,21 120,01 0,01 1,01 52,01
2º Exemplo Ano 2004
Teria como resultado
Jan Fev Mar Abril ..... Nov Dez
2,30 50,20 120,01 0,01 0,00 0,00
Desde já agradeço :wink:
1º Exemplo: Ano 2003
Teria como resultado
Jan Fev Mar Abril ..... Nov Dez
12,32 250,21 120,01 0,01 1,01 52,01
2º Exemplo Ano 2004
Teria como resultado
Jan Fev Mar Abril ..... Nov Dez
2,30 50,20 120,01 0,01 0,00 0,00
Desde já agradeço :wink:
Silvio
Curtidas 0
Respostas
Marco Salles
01/04/2004
Dentre Várias Formas Voce Pode Tentar:
[b:691f158cbe]Obs: E Necessário Ter Um Campo Data Na Sua Tabela[/b:691f158cbe]
procedure PesquisarSomentePeloAno(Ano:Word); var DataInicial:TDate; DataFinal:TDate; begin DataInicial:=EncodeDate(Ano,01,01); DataFinal:=EncodeDate(Ano,12,31); Form1.Query1.close; Form1.Query1.sql.Clear; Form1.Query1.sql.Add(´Select *From "TB VENDAS´); Form1.Query1.sql.Add(´Where Data>=:DataMovInicial´); Form1.Query1.ParamByName(´DataMovInicial´).AsDateTime:=DataInicial; Form1.Query1.sql.Add(´and Data<=:DataMovFinal´); Form1.Query1.ParamByName(´DataMovFinal´).AsDateTime:=DataFinal; Form1.Query1.Prepare; Form1.Query1.Open; end;
[b:691f158cbe]Obs: E Necessário Ter Um Campo Data Na Sua Tabela[/b:691f158cbe]
GOSTEI 0
Silvio
01/04/2004
Amigo Marco Salles
Eu fiz como vc me passou:
procedure TFrmGrfVendasAnual.ConsultaAno(ano: Word);
var
DataInicial : TDate;
DataFinal : TDate;
begin
DataInicial := EncodeDate(Ano, 01,01);
DataFinal := EncodeDate(Ano, 12,31);
QryVendasAnual.Close;
QryVendasAnual.Sql.Clear;
QryVendasAnual.SQl.Add(´Select Pedidos.DataPed, Sum((Itens.Quantidade * Itens.Preco) - Pedidos.Desconto) as Total from Pedidos, Itens´);
QryVendasAnual.Sql.Add(´Where (DataPed >= :DataMovinicial) and (Pedidos.Numero = Itens.NroPed)´);
QryVendasAnual.ParamByName(´DataMovInicial´).asdateTime := DataInicial;
QryVendasAnual.Sql.add(´and dataPed <= :DataMovFinal´);
QryVendasAnual.ParamByName(´DataMovFinal´).asDateTime := DataFinal;
QryVendasAnual.SQL.Add(´Group by Pedidos.DataPed´);
QryVendasAnual.Prepare;
QryVendasAnual.Open;
end;
Mas desta forma ele me mostra soma por dia do mes como faço para que me mostre a soma por mês sei que esta quase lá, só mais este empurrãozinho :lol:
Eu fiz como vc me passou:
procedure TFrmGrfVendasAnual.ConsultaAno(ano: Word);
var
DataInicial : TDate;
DataFinal : TDate;
begin
DataInicial := EncodeDate(Ano, 01,01);
DataFinal := EncodeDate(Ano, 12,31);
QryVendasAnual.Close;
QryVendasAnual.Sql.Clear;
QryVendasAnual.SQl.Add(´Select Pedidos.DataPed, Sum((Itens.Quantidade * Itens.Preco) - Pedidos.Desconto) as Total from Pedidos, Itens´);
QryVendasAnual.Sql.Add(´Where (DataPed >= :DataMovinicial) and (Pedidos.Numero = Itens.NroPed)´);
QryVendasAnual.ParamByName(´DataMovInicial´).asdateTime := DataInicial;
QryVendasAnual.Sql.add(´and dataPed <= :DataMovFinal´);
QryVendasAnual.ParamByName(´DataMovFinal´).asDateTime := DataFinal;
QryVendasAnual.SQL.Add(´Group by Pedidos.DataPed´);
QryVendasAnual.Prepare;
QryVendasAnual.Open;
end;
Mas desta forma ele me mostra soma por dia do mes como faço para que me mostre a soma por mês sei que esta quase lá, só mais este empurrãozinho :lol:
GOSTEI 0
Silvio
01/04/2004
Falta tão pouco para concluir esta consulta...
GOSTEI 0
Silvio
01/04/2004
No VB sei que possui a função Month(data) ela extrai somente o mes da data e se funcionace no Delphi eu poderia Colocar ´Select month(DataPed), sum(....... que então daria certo, mas no Delphi eu não me lembro se existe uma função parecida que posso utilizar neste caso
se alguem souber por favor me passe
Valeu a todos
se alguem souber por favor me passe
Valeu a todos
GOSTEI 0
Silvio
01/04/2004
Sobe
GOSTEI 0
Silvio
01/04/2004
Topo
GOSTEI 0
Aroldo Zanela
01/04/2004
No VB sei que possui a função Month(data) ela extrai somente o mes da data e se funcionace no Delphi eu poderia Colocar ´Select month(DataPed), sum(....... que então daria certo, mas no Delphi eu não me lembro se existe uma função parecida que posso utilizar neste caso
se alguem souber por favor me passe
Valeu a todos
Colega,
O que você passa no select independe da linguagem do front-end e sim do back-end (no seu caso o SQL Server). No caso de extrair o mês no Delphi seria MonthOf( <Data> ). Incluir DateUtils na lista de uses.
GOSTEI 0
Marco Salles
01/04/2004
Eu Ficaria Muito Feliz e Surpreso (Porém Não Dúvido De Nada No Que Se Refere a Programação(Ate Mesmo De Um ´Cachorro Virar Gato´:O Aroldo Zanela Sabe Disso :P )), Mas Acho Que Seu Caso é Delicado...Voce Tem Uma Base De Dados Baseado Num Campo Data...E Esta Base De Dados Pelo Que Tudo Indica é Diária e Não Mensal...Mesmo Fazendo a Soma Durante Um Ano a Query Anterior Retorna Um Unico Valor..Se Voce Associar a Query Em Um DataSource e Linka-lo a Um DbGrid, Voce ´Perde´ o Valor Do Campo Total...Porque o Total é Um Unico Resultado e Não Vários Registros Com o é Mostrado Na Grid...A Saida No Meu Entender Não Será Unica e Exclusivamente Uma Consulta Usando Sql, Porque Voce Não Pode alterar a Sua Base De Dados....Eu, Se Voce, Criaria Uma Outra Tabela So Com Os Campos Que interessa. Esta Tabela Teria Seus Dados Vinculados Com Tabela Principal... Extrair Os Dados Da Tabela Principal, Para Esta Tabela Secundária Seria o Seu Próximo Objetivo.... A Consulta Então Passaria a Ser Nesta ´Nova´ Tabela Que Teria Sua Base De Dados Um Campo Mensal....Mas Se Voce Conseguir De Outra Forma Passe a Solução Para Nós, Porque Poderemos Ajudar Outras Pessoas. E Se Voce Não Conseguir e Quiser Aprofundar Nesta Idéia, Ou Uma Outra Qualquer, Poste Para Nós...
GOSTEI 0
Aroldo Zanela
01/04/2004
Colega,
Neste caso ele realmente pode utilizar a técnica de agrupamento por mês (Month) com base num campo data, bem como, utilizando um servidor de banco de dados como o SQL Server, também poderia utilizar o recurso de View e fazer a consulta sobre a mesma, aumentando assim, significativamente a performance da recuperação das informações.
Colega, coloque a DDL da tabela (estrutura) para que possamos analisar a forma mais otimizada.
Neste caso ele realmente pode utilizar a técnica de agrupamento por mês (Month) com base num campo data, bem como, utilizando um servidor de banco de dados como o SQL Server, também poderia utilizar o recurso de View e fazer a consulta sobre a mesma, aumentando assim, significativamente a performance da recuperação das informações.
Colega, coloque a DDL da tabela (estrutura) para que possamos analisar a forma mais otimizada.
GOSTEI 0
Silvio
01/04/2004
Caros amigos a minha tabela de VENDAS e a seguinte:
Codigo : Tipo Inteiro
NF : Inteiro
Cliente : Inteiro
Vendedor : Inteiro
Data : Tipo Date
Desconto : Tipo Float
e como todos sabem uma tabela vendas possui itens e a minha de ItensVenda possui:
CodigoVenda : Tipo Intiero
CodProduto : Inteiro
Quantidade : Inteiro
Preco : Tipo Float
Desde já agradeço pela força
Codigo : Tipo Inteiro
NF : Inteiro
Cliente : Inteiro
Vendedor : Inteiro
Data : Tipo Date
Desconto : Tipo Float
e como todos sabem uma tabela vendas possui itens e a minha de ItensVenda possui:
CodigoVenda : Tipo Intiero
CodProduto : Inteiro
Quantidade : Inteiro
Preco : Tipo Float
Desde já agradeço pela força
GOSTEI 0
Aroldo Zanela
01/04/2004
Colega,
Tenta este código aqui:
Se não funcionar desta forma, é só criar uma View fazendo select e converter a data para mes e escrever um novo select sobre a mesma que vai funcionar corretamente.
Tenta este código aqui:
procedure TFrmGrfVendasAnual.ConsultaAno(Ano: Word); var DataInicial: TDate; DataFinal: TDate; begin DataInicial := EncodeDate(Ano, 01,01); DataFinal := EncodeDate(Ano, 12,31); With QryVendasAnual do begin Close; Clear; SQl.Add(´Select MONTH(Pedidos.DataPed) as Mes, Sum((Itens.Quantidade * Itens.Preco) - Pedidos.Desconto) as Total´); SQL.Add(´from Pedidos INNER JOIN Itens´); SQL.Add(´ON pedidos.numero = Itens.NroPed´); SQL.Add(´Where (DataPed BETWEEN :DataMovinicial and :DataMovFinal´); SQL.Add(´Group by MONTH(Pedidos.DataPed)´); ParamByName(´DataMovFinal´).AsDate := DataFinal; ParamByName(´DataMovInicial´).AsDate := DataInicial; Prepare; Open; end; end;
Se não funcionar desta forma, é só criar uma View fazendo select e converter a data para mes e escrever um novo select sobre a mesma que vai funcionar corretamente.
GOSTEI 0
Silvio
01/04/2004
Realmente Aroldo, está dando erro.
...Valeu Aroldo pela força, já estou pesquisando na Internet alguns tutoriais sobre View, para fazer a implementação no codigo é q não me recordo como fazer. :cry:
Valeu :cry:
...Valeu Aroldo pela força, já estou pesquisando na Internet alguns tutoriais sobre View, para fazer a implementação no codigo é q não me recordo como fazer. :cry:
Valeu :cry:
GOSTEI 0
Vanius
01/04/2004
SELECT Str(MONTH(DataVenda), 2)+´/´+Str(YEAR(DataVenda), 4) AS MesAno,
Sum(ValorVenda)
FROM Vendas
WHERE DataVenda BETWEEN :DataInicial AND :DataFinal
GROUP BY Str(MONTH(DataVenda), 2)+´/´+Str(YEAR(DataVenda), 4)
Sum(ValorVenda)
FROM Vendas
WHERE DataVenda BETWEEN :DataInicial AND :DataFinal
GROUP BY Str(MONTH(DataVenda), 2)+´/´+Str(YEAR(DataVenda), 4)
GOSTEI 0
Aroldo Zanela
01/04/2004
Colega,
Vai no Enterprise Manager na seção de Views do banco, botão direito, Create View (Salve como nome: VendaMensal):
No Delphi, mude o seguinte:
Vai no Enterprise Manager na seção de Views do banco, botão direito, Create View (Salve como nome: VendaMensal):
Select Year(Pedidos.DataPed) As Ano, Month(Pedidos.DataPed) As Mes, Sum((Itens.Quantidade * Itens.Preco) - Pedidos.Desconto) as Total from Pedidos INNER JOIN Itens ON pedidos.numero = Itens.NroPed Group by Year(Pedidos.DataPed), Month(Pedidos.DataPed)
No Delphi, mude o seguinte:
procedure TFrmGrfVendasAnual.ConsultaAno(Ano: Word); begin With QryVendasAnual do begin Close; Clear; SQl.Add(´Select Ano, Mes, Total´); SQL.Add(´from VendaMensal´); SQL.Add(´Where (Ano = :Ano) and´); SQL.Add(´(Mes >= 1 and Mes <= 12)´); ParamByName(´Ano´).AsInteger := Ano; Prepare; Open; end; end;
GOSTEI 0