Ajuda com dbGrid ou algo parecido
Boa noite, galera, estou enroscado numa coisinha hà dias.
Gostaria de fazer um grid assim:
Ano Firma1 Firma2 Firma3
2008 1500,00 2000,00 3200,00
2009 1300,00 1500,00 4000,00 em assim por diante.
2010
Na verdade gostaria de fazer em tempo de execução.
Tenho uma tabela históricos_recebimento onde tenho os campos Cod_Firma, Firma, Data_Recebimento.
Na verdade gostaria de agrupar por anos e empresas a soma de tudo vendido anualmente.
Acho que deveria usar um select distinct
Alguém poderia me ajudar????
Obrigado
Eduardo
Curtidas 0
Respostas
Marcio Santos
20/05/2010
Já pensou em utilizar StringGrid? No teu caso acredito que seja o que melhor se aplique.
1 - Obter a lista de Firmas que aparecem na tabela Historicos_Recebimento:
Select Distinct
Cod_Firma,
Firma
From
Historicos_Recebimento
Order By
Cod_Firma
Utilize a propriedade RecordCount da Query ( TADOQuery, TQuery, Etc... ) para obter o número de colunas que o stringgrid possuirá ( RecordCount + 1 ). Ex.: ( Firma1, Firma2, Firma3, Firma4 ) = 5. O número de linhas no StringGrid será o número de anos no intervalo + 1. Ex.: ( 2010, 2009, 2008 ) = 4. Isto configura uma matriz 5x4 ou um StringGrid com 5 colunas e 4 linhas. 2 - Defina as propriedades ColCount e RowCount com, respectivamente, número de colunas e número de linhas: meuStringGrid.ColCount := 5 meuStringGrid.RowCount := 4; obs.: A propriedade ColWidths define a largura de cada coluna. Ex.: ColWidths[ 0 ] := 80; ColWidths[ 1 ] := 420. 3 - Preencha o cabeçalho: With minhaQuery Do Begin First; While Not Eof Do Begin meuStringGrid.Cells[ RecordNo, 0 ] := Fields[ 1 ].AsString; Next; End; End; 4 - Crie uma função para obter o total recebido por firma e ano: Function TotalDaFirma( Cod_Firma, Ano : Integer ) : String; Var qryLocal : TADOQuery; Begin Result := '0,00'; Try qryLocal := TADOQuery.Create( Nil ); With qryLocal Do Begin ConnectionString := 'sua string de conexão'; Sql.Add( 'Select ' );
Sql.Add( ' Sum( Valor_Recebido ) ' );
Sql.Add( 'From ' );
Sql.Add( ' Historicos_Recebimento ' );
Sql.Add( 'Where ' );
Sql.Add( ' Cod_Firma = ' + IntToStr( Cod_Firma ) );
Sql.Add( ' And Year( Data_Recebimento ) = ' + IntToStr( Ano ) ); Open; If Not IsEmpty Then Result := FormatFloat( '########0.00', Fields[ 0 ].AsFloat );
End; Finally FreeAndNil( qryLocal ); End; End; 5 - Preencha as linhas: j := 1; For i := 2010 DownTo 2008 Do Begin Cells[ 0, j ] := IntToStr( i ); With minhaQuery Do Begin First; While Not Eof Do Begin meuStringGrid.Cells[ RecordNo, j ] := TotalDaFirma( Fields[ 0 ].AsInteger, i ); Next; End; End; Inc( j ); End; 6 - Saia para o abraço ( rssss ). Naturalmente você poderá ainda "brincar com o seu stringgrid" trabalhando suas propriedades ( readonly por exemplo ) ou seus eventos ( OnClick por exemplo ) e etc... etc... etc... Espero que tenha ajudado, Abraços.
Cod_Firma,
Firma
From
Historicos_Recebimento
Order By
Cod_Firma
Utilize a propriedade RecordCount da Query ( TADOQuery, TQuery, Etc... ) para obter o número de colunas que o stringgrid possuirá ( RecordCount + 1 ). Ex.: ( Firma1, Firma2, Firma3, Firma4 ) = 5. O número de linhas no StringGrid será o número de anos no intervalo + 1. Ex.: ( 2010, 2009, 2008 ) = 4. Isto configura uma matriz 5x4 ou um StringGrid com 5 colunas e 4 linhas. 2 - Defina as propriedades ColCount e RowCount com, respectivamente, número de colunas e número de linhas: meuStringGrid.ColCount := 5 meuStringGrid.RowCount := 4; obs.: A propriedade ColWidths define a largura de cada coluna. Ex.: ColWidths[ 0 ] := 80; ColWidths[ 1 ] := 420. 3 - Preencha o cabeçalho: With minhaQuery Do Begin First; While Not Eof Do Begin meuStringGrid.Cells[ RecordNo, 0 ] := Fields[ 1 ].AsString; Next; End; End; 4 - Crie uma função para obter o total recebido por firma e ano: Function TotalDaFirma( Cod_Firma, Ano : Integer ) : String; Var qryLocal : TADOQuery; Begin Result := '0,00'; Try qryLocal := TADOQuery.Create( Nil ); With qryLocal Do Begin ConnectionString := 'sua string de conexão'; Sql.Add( 'Select ' );
Sql.Add( ' Sum( Valor_Recebido ) ' );
Sql.Add( 'From ' );
Sql.Add( ' Historicos_Recebimento ' );
Sql.Add( 'Where ' );
Sql.Add( ' Cod_Firma = ' + IntToStr( Cod_Firma ) );
Sql.Add( ' And Year( Data_Recebimento ) = ' + IntToStr( Ano ) ); Open; If Not IsEmpty Then Result := FormatFloat( '########0.00', Fields[ 0 ].AsFloat );
End; Finally FreeAndNil( qryLocal ); End; End; 5 - Preencha as linhas: j := 1; For i := 2010 DownTo 2008 Do Begin Cells[ 0, j ] := IntToStr( i ); With minhaQuery Do Begin First; While Not Eof Do Begin meuStringGrid.Cells[ RecordNo, j ] := TotalDaFirma( Fields[ 0 ].AsInteger, i ); Next; End; End; Inc( j ); End; 6 - Saia para o abraço ( rssss ). Naturalmente você poderá ainda "brincar com o seu stringgrid" trabalhando suas propriedades ( readonly por exemplo ) ou seus eventos ( OnClick por exemplo ) e etc... etc... etc... Espero que tenha ajudado, Abraços.
GOSTEI 0
Eduardo
20/05/2010
Opa, até que em fim acho que vou resolver minha questão com quem realmente sabe.
De início já comecei a gostar desta aula, mas ainda preciso aprender muito.
Tomei umas brejas agora à tarde, rsrs.. mas acho que vai funcionar.
Vamos lá:
Aqui não sei como fazer:
Utilize a propriedade RecordCount da Query ( TADOQuery, TQuery, Etc... ) para obter o número de colunas que o stringgrid possuirá ( RecordCount + 1 ). Ex.: ( Firma1, Firma2, Firma3, Firma4 ) = 5.
O número de linhas no StringGrid será o número de anos no intervalo + 1. Ex.: ( 2010, 2009, 2008 ) = 4.
obs.: A propriedade ColWidths define a largura de cada coluna. Ex.: ColWidths[ 0 ] := 80; ColWidths[ 1 ] := 420,
onde acho isto, não achei, seria no botão para executar???
GOSTEI 0
Eduardo
20/05/2010
Desculpa apertei o enter aqui.
Aqui não sei como fazer:
Utilize a propriedade RecordCount da Query ( TADOQuery, TQuery, Etc... ) para obter o número de colunas que o stringgrid possuirá ( RecordCount + 1 ). Ex.: ( Firma1, Firma2, Firma3, Firma4 ) = 5.
O número de linhas no StringGrid será o número de anos no intervalo + 1. Ex.: ( 2010, 2009, 2008 ) = 4.
GOSTEI 0
Eduardo
20/05/2010
Só lembrando que uso simpledataset e data source com um banco Firebird, talvez tenha que usar o comando " data.commandText.
será que manja nisto??
Obrigado
GOSTEI 0
Marcio Santos
20/05/2010
Uma vez que o componente esteja aberto ( simpleDataSet ) utilize seu método RecordCount para descobrir a quantidade de registros que vieram no open.
Ex.: X := SimpleDataSet1.RecordCount;
Pronto.
Abraços,
GOSTEI 0
Eduardo
20/05/2010
Amigo, continuo perdidinho....
Dá pra simplicar com outros exemplos, não sei quase nada sobre recordcount.
Obrigado.
GOSTEI 0
Eduardo
20/05/2010
Consegui fazer uma parte assim:
procedure TformPeriodo.BitBtn1Click(Sender: TObject);
var
i, j :integer;
begin
j:=1;
for I := 2003 to 2013 do
begin
strGrdTeste.Cells[0,j]:=intToStr(i);
Inc(j);
strGrdTeste.ColCount:=5;
strGrdTeste.RowCount:=13;
strGrdTeste.ColWidths[0]:=60;
strGrdTeste.ColWidths[1]:=80;
strGrdTeste.ColWidths[2]:=80;
strGrdTeste.ColWidths[3]:=80;
strGrdTeste.ColWidths[4]:=80;
strGrdTeste.Cells[0,0]:='Ano';
strGrdTeste.Cells[1,0]:='Firma1';
strGrdTeste.Cells[2,0]:='Firma2';
strGrdTeste.Cells[3,0]:='Firma3'; Até aí tudo bem clico no botão e exibe os anos na 1º coluna. Mas e agora preciso informar os valores vendidos anuais em colunas com suas respectivas firmas. Meu simpledataset está assim: Select Distinct (Cod_Firma), Extract (Year From Data_Recebimento) as Ano,
coalesce(sum(valor_Recebido),0) as Total
from Historicos_Recebimento
Group By 1,2
Order by 1,2 Será que dá certo usar assim, como calculo os valores agora??? Obrigado.
var
i, j :integer;
begin
j:=1;
for I := 2003 to 2013 do
begin
strGrdTeste.Cells[0,j]:=intToStr(i);
Inc(j);
strGrdTeste.ColCount:=5;
strGrdTeste.RowCount:=13;
strGrdTeste.ColWidths[0]:=60;
strGrdTeste.ColWidths[1]:=80;
strGrdTeste.ColWidths[2]:=80;
strGrdTeste.ColWidths[3]:=80;
strGrdTeste.ColWidths[4]:=80;
strGrdTeste.Cells[0,0]:='Ano';
strGrdTeste.Cells[1,0]:='Firma1';
strGrdTeste.Cells[2,0]:='Firma2';
strGrdTeste.Cells[3,0]:='Firma3'; Até aí tudo bem clico no botão e exibe os anos na 1º coluna. Mas e agora preciso informar os valores vendidos anuais em colunas com suas respectivas firmas. Meu simpledataset está assim: Select Distinct (Cod_Firma), Extract (Year From Data_Recebimento) as Ano,
coalesce(sum(valor_Recebido),0) as Total
from Historicos_Recebimento
Group By 1,2
Order by 1,2 Será que dá certo usar assim, como calculo os valores agora??? Obrigado.
GOSTEI 0
Eduardo
20/05/2010
poderia dar mais ajuda, especificar um pouco melhor, é a primeira vez que estou tentando fazer isto, e estou apanhando mais que égua de charreteiro.
Obrigado
GOSTEI 0
Marcio Santos
20/05/2010
Olá, Eduardo. Tenho andado muito atarefado e por esta razão não havia visto teus novos posts.
Bem, é o seguinte: O código que você postou fica armazenado em um componente simpledataset, em sua propriedade DataSet.CommandText, certo?
Pois então, em algum momento você faz um Open neste componente, certo?
Então, digamos:
SimpleDataSet1.DataSet.Open; //Este é o comando para executar a sua consulta.
Para saber a quantidade de registros retornados por esta consulta, você utiliza:
SimpleDataSet1.DataSet.RecordCount.
Pronto. Só isso.
Em nosso caso, você irá armazenar o valor retornado em uma variável ( por exemplo iQtdRegistros ):
iQtdRegistros := SimpleDataSet1.DataSet.RecordCount;
Prontinho.
Espero ter ajudado,
Abraços.
GOSTEI 0