Fórum Consulta Anual #223905

01/04/2004

0

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:


Silvio

Silvio

Responder

Posts

01/04/2004

Marco Salles

Dentre Várias Formas Voce Pode Tentar:
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]


Responder

Gostei + 0

02/04/2004

Silvio

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:


Responder

Gostei + 0

02/04/2004

Silvio

Falta tão pouco para concluir esta consulta...


Responder

Gostei + 0

02/04/2004

Silvio

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


Responder

Gostei + 0

02/04/2004

Silvio

Sobe


Responder

Gostei + 0

02/04/2004

Silvio

Topo


Responder

Gostei + 0

02/04/2004

Aroldo Zanela

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.


Responder

Gostei + 0

02/04/2004

Marco Salles

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...


Responder

Gostei + 0

02/04/2004

Aroldo Zanela

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.


Responder

Gostei + 0

03/04/2004

Silvio

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


Responder

Gostei + 0

03/04/2004

Aroldo Zanela

Colega,

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.


Responder

Gostei + 0

03/04/2004

Silvio

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:


Responder

Gostei + 0

03/04/2004

Vanius

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)


Responder

Gostei + 0

03/04/2004

Aroldo Zanela

Colega,

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;



Responder

Gostei + 0

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

Aceitar