Fórum Ajuda com dbGrid ou algo parecido #378007

20/05/2010

0

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

Eduardo

Responder

Posts

21/05/2010

Marcio Santos

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

Gostei + 0

21/05/2010

Eduardo

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???          
Responder

Gostei + 0

21/05/2010

Eduardo

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

Gostei + 0

21/05/2010

Eduardo

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
Responder

Gostei + 0

22/05/2010

Marcio Santos

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,  
Responder

Gostei + 0

23/05/2010

Eduardo

Amigo, continuo perdidinho.... Dá pra simplicar com outros exemplos, não sei quase nada sobre recordcount. Obrigado.
Responder

Gostei + 0

23/05/2010

Eduardo

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

Gostei + 0

25/05/2010

Eduardo

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 
Responder

Gostei + 0

27/05/2010

Marcio Santos

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

Gostei + 0

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

Aceitar