• 0
Sign in to follow this  
Guest Antonio Jose

(Resolvido) Seleção Dbgrid

Question

Guest Antonio Jose

Pessoal é o seguinte: eu faço as pequisas usando componente Table e as vezes o Query. O resultado da pesquisa eu mostro em um DBGrid. O que eu queria, era ter uma opção de selecionar

todos os itens que estão no DBGrid (resultado da pesquisa) e colocar no excel. Já vi isso em um programa e achei legal transportar os dados apenas copiando e colando.

Share this post


Link to post
Share on other sites

8 answers to this question

Recommended Posts

  • 0
Pessoal é o seguinte: eu faço as pequisas usando componente Table e as vezes o Query. O resultado da pesquisa eu mostro em um DBGrid. O que eu queria, era ter uma opção de selecionar

todos os itens que estão no DBGrid (resultado da pesquisa) e colocar no excel. Já vi isso em um programa e achei legal transportar os dados apenas copiando e colando.

Antonio Jose, sobre colar no Excel talvez você possa utilizar este tópico em Tutoriais & Dicas (ali em cima na página).

Mas, se antes de exportar, você quiser mostrar todas as linhas selecionadas você deverá marcar as mesmas utilizando a propriedade SelectedRows (do tipo TBookmarkList, dê uma olhada no help). Também será necessário habilitar na propriedade Options do DBGrid a opção dgMultiSelect, dgAlwaysShowSelection. O fato de habilitar estas propriedades, já propiciará o usuário fazer uma seleção, linha a linha, bastando para isso que o usuário segure a tecla CTRL+<click do mouse> (experimente).

Para a leitura das informações das linhas selecionadas, você faz algo similar a isto:

// utilizar desta forma (DBGrid1.DataSource), deixa você livre para ligar um TTable ou TQuery ao DBGrid
  with DBGrid1.DataSource do
    if DBGrid1.SelectedRows.Count > 0 then
      for Idx :=0 to DBGrid1.SelectedRows.Count-1 do
      begin
        DataSet.GotoBookmark(pointer(DBGrid1.SelectedRows.Items[Idx]));
       // move os dados da consulta (dataset do dbgrid) aqui
        variavel := DataSet.FieldByName('nome_campo').Value;
        ...
      end;

Veja se você consegue avançar

Abraços

Share this post


Link to post
Share on other sites
  • 0
Guest Antonio Jose
Pessoal é o seguinte: eu faço as pequisas usando componente Table e as vezes o Query. O resultado da pesquisa eu mostro em um DBGrid. O que eu queria, era ter uma opção de selecionar

todos os itens que estão no DBGrid (resultado da pesquisa) e colocar no excel. Já vi isso em um programa e achei legal transportar os dados apenas copiando e colando.

Antonio Jose, sobre colar no Excel talvez você possa utilizar este tópico em Tutoriais & Dicas (ali em cima na página).

Mas, se antes de exportar, você quiser mostrar todas as linhas selecionadas você deverá marcar as mesmas utilizando a propriedade SelectedRows (do tipo TBookmarkList, dê uma olhada no help). Também será necessário habilitar na propriedade Options do DBGrid a opção dgMultiSelect, dgAlwaysShowSelection. O fato de habilitar estas propriedades, já propiciará o usuário fazer uma seleção, linha a linha, bastando para isso que o usuário segure a tecla CTRL+<click do mouse> (experimente).

Para a leitura das informações das linhas selecionadas, você faz algo similar a isto:

// utilizar desta forma (DBGrid1.DataSource), deixa você livre para ligar um TTable ou TQuery ao DBGrid
  with DBGrid1.DataSource do
    if DBGrid1.SelectedRows.Count > 0 then
      for Idx :=0 to DBGrid1.SelectedRows.Count-1 do
      begin
        DataSet.GotoBookmark(pointer(DBGrid1.SelectedRows.Items[Idx]));
       // move os dados da consulta (dataset do dbgrid) aqui
        variavel := DataSet.FieldByName('nome_campo').Value;
        ...
      end;

Veja se você consegue avançar

Abraços

Amigo, eu já transporto todos os relatórios para o Excel, o que eu queria mesmo é selecionar no grid copiar e colar no excel.

Grande

Abraço.

Share this post


Link to post
Share on other sites
  • 0
Amigo, eu já transporto todos os relatórios para o Excel, o que eu queria mesmo é selecionar no grid copiar e colar no excel.
Antonio Jose, no que diz respeito a trabalhar itens marcado num DBGrid, tudo o que eu comentei é válido - você terá que trabalhar com SelectedRows e BookMarks.

Vou colocar aqui apenas a função para copiar os itens já selecionados para a área de transferência, viabilizando que sejam colados no Excel ou mesmo para o Word, onde selecionando o texto colado, bastará utilizar a opção Tabelas->Converter->Texto para Tabela para ter novamente os dados no formato de grid.

É uma função independente de Form, logo pode ser colocada em unit de utilidades. Lembrar que deve ser incluída a unit ClipBrd, bem como DBGrids (se necessário) na cláusula uses da mesma.

procedure DBGridToClipBoard(DBGrid :TDBGrid; PastHeader :Boolean);
var
  StrToCopy :string;
  Idx,
  IdxCol :Integer;
  BookMark,
  SavedBookMark :TBookMark;
begin
  if DBGrid.SelectedRows.Count = 0 then
    Exit;
  StrToCopy := '';
  if PastHeader then
  begin
    StrToCopy := DBGrid.Columns[0].Title.Caption;
    for IdxCol := 1 to DBGrid.Columns.Count -1 do
      StrToCopy := format('%s'#9'%s', [StrToCopy, DBGrid.Columns[IdxCol].Title.Caption]);
    StrToCopy := StrToCopy +#13#10;
  end;
  with DBGrid.DataSource.DataSet do
  begin
    SavedBookMark := GetBookmark;
    DisableControls;
    for Idx := 0 to DBGrid.SelectedRows.Count -1 do
    begin
      GotoBookMark(Pointer(DBGrid.SelectedRows[Idx]));
      StrToCopy := StrToCopy +DBGrid.Columns[0].Field.AsString;
      for IdxCol := 1 to DBGrid.Columns.Count -1 do
        StrToCopy := Format('%s'#9'%s', [StrToCopy, DBGrid.Columns[IdxCol].Field.AsString]);
      StrToCopy := StrToCopy +#13#10;
    end;
    ClipBoard.Clear;
    ClipBoard.SetTextBuf(PAnsiChar(StrToCopy));
    GotoBookMark(SavedBookMark);
    FreeBookMark(SavedBookMark);
    EnableControls;
  end;
end;
Para usar:
begin
  ...
  DBGridToClipBoard(DBGrid1, True);  // True - copia o nome das colunas; False - não copia
  ...
end;

Abraços

Share this post


Link to post
Share on other sites
  • 0

Micheus,

Estou com um problema semelhante, tenho um dbgrid e quero selecionar algumas linhas e por meio de um botão carregar apenas as selecionadas em outro dbgrid.

Como poderia resolver essa questão?

abraço

Edited by arce

Share this post


Link to post
Share on other sites
  • 0
... tenho um dbgrid e quero selecionar algumas linhas e por meio de um botão carregar apenas as selecionadas em outro dbgrid.

arce, seguindo o que coloquei no post#2 voce já tem condição de, quando clicar no tal botão, "navegar" pelos registros selecionados no primeiro DBGrid.

A questão de carregar apenas eles no segundo DBGrid (imagino que com mais informações do que você já tem no primeiro), dependendo de qual a finalidade. você poderia usar:

- uma tabela temporária;

- uma consulta onde você monte a cláusula where com vários OR dos campos chaves obtidos na primeira consulta;

- uma tabela virtual (em memória), utilizando algum componente como os Memory Table da biblioteca RXLib, na qual você insere os dados para cada linha desejada.

Abraços

Share this post


Link to post
Share on other sites
  • 0

arce, seguindo o que coloquei no post#2 voce já tem condição de, quando clicar no tal botão, "navegar" pelos registros selecionados no primeiro DBGrid.

A questão de carregar apenas eles no segundo DBGrid (imagino que com mais informações do que você já tem no primeiro), dependendo de qual a finalidade. você poderia usar:

- uma tabela temporária;

- uma consulta onde você monte a cláusula where com vários OR dos campos chaves obtidos na primeira consulta;

- uma tabela virtual (em memória), utilizando algum componente como os Memory Table da biblioteca RXLib, na qual você insere os dados para cada linha desejada.

Abraços

Micheus... selecionar eu consigo, o problema é quando vou carregar os dados em outra grid; porque a outra também é para consulta. Seria entaum o segundo caso q você mencionou "- uma consulta onde você monte a cláusula where com vários OR dos campos chaves obtidos na primeira consulta".

Estou usando clientDataSet, e IBQuery.. e para selecionar os itens da grid utilizo checkBox na Grid em um coluna, esta grava temporariamente T para True e F false, mas não é feito o Update na tabela, por isso não é possivel usar um SELECT para buscar apenas os selecionados.

abraços.

Edited by arce

Share this post


Link to post
Share on other sites
  • 0
Estou usando clientDataSet, e IBQuery.. e para selecionar os itens da grid utilizo checkBox na Grid em um coluna, esta grava temporariamente T para True e F false, mas não é feito o Update na tabela, por isso não é possivel usar um SELECT para buscar apenas os selecionados.
Se você observar melhor o post#2 que havia citado, você observaria que não está sendo buscada NA tabela, nenhuma informação sobre a seleção realizada no grid - esta informação vem da propriedade SelectedRows. Como usar isto trambém está explicado lá.

Mesmo sua abordagem sendo o uso de uma coluna temporária, o processo para obtenção das informações do primeiro grid para montar a consulta para o segundo, é exatamente a mesma: lá eu percorria todos os itens selecionados, no seu caso você trerá que percorrer todas as linhas do DBGrid para ler a tal coluna e então obter os dados da linha selecionada.

Algo que há muito tempo já repeti por aqui: Quando você fala de linhas no DBGrid, está falando das linhas do dataset. Assim, se você quiser ler os valores mostrados na atual linha com foco em um DBGrid, basta ler os campos do dataset a ele ligado - será a linha correntemente selecionada. De forma similar, se você manipular o dataset, movendo o registro corrente, observará esta movimentação no DBGrid.

Então, se esta sua coluna temporária é fruto de um campo calculado, percorrendo a dataset você poderá obter seu valor e usar os campos do dataset conforme o caso (T ou F). Já se esta coluna é fruto de algum "hackeamento" do DBGrid, percorrer o dataset, fará com que a linha selecionada no DBGrid seja movida e por consequencia você poerá obter o valor da tal coluna para aquele registro.

É com você.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this