Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Seleção Dbgrid


Guest Antonio Jose

Pergunta

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.

Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 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

Link para o comentário
Compartilhar em outros 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.

Link para o comentário
Compartilhar em outros 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

Link para o comentário
Compartilhar em outros 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

Editado por arce
Link para o comentário
Compartilhar em outros 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

Link para o comentário
Compartilhar em outros 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.

Editado por arce
Link para o comentário
Compartilhar em outros 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ê.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...