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

(Resolvido) Selecionar linha do DBGrid


nsouza

Pergunta

Senhores,

eu estou criando um form para importar os dados para uma tabela.

para isso exibi os dados em um DBGrid onde o usuario irá selecionar e ao

clicar no botão confirmar os dados serão inseridos na tabela.

Gostaria de usar o DbGrid como se usa no excel. Ao clicar na linha ele seleciona

a linha toda mas com a opção de se o usuário quiser selecionar varios registros

ele pressiona a tecla shift e vai marcando qtos registros quiser e depois é so clicar no

botão confirmar e os dados serão importado.

Tem jeito? Obrigado!

Link para o comentário
Compartilhar em outros sites

16 respostass a esta questão

Posts Recomendados

  • 0
Obrigado!

você conhece algum procedimento para importar os dados do DBGrid apos seleciona-los?

não entendi bem a pergunta, mas seria você conseguir ler os dados selecionados ??? se for isso, você utiliza os dados selecionados

na tabela que está linkada com o DbGrid ... tipo: Tabela1.FieldByName('CAMPO').AsString, assim, você acessa o campo CAMPO

selecionado na DBGrid ...

se não for bem isso, post aki especificando melhor a dúvida ...

abraços !!!

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Daniel,

Tenho uma dúvida parecida. Vou tentar explicar de maneira clara: Eu faço uma pesquisa e os resultados são exibidos no DBGrid. Já alterei todas as propriedades do DBGrid, por exemplo: "rowSelect := True", "editing := false", "readonly := true".

Agora, gostaria que, quando o usuário selecionasse uma linha e clicasse em um botão, ocorresse uma alteração naquele registro. Exemplo:

DBGrid exibindo o resultado da Consulta:

| Codigo | Nome | Idade | Selecionado |

| 1 | Du |21 | False |

| 2 | Kadu |22 | False |

| 3 | Rafa |20 | False |

Eu seleciono a Linha 3:

| 3 | Rafa |20 | False |

E clico no botão em meu form que fará uma ação, por exemplo mudar o valor do campo "Selecionado" para True. E o resultado seria:

| 3 | Rafa |20 | True |

A minha dúvida é: como fazer pra indicar a linha selecionada? Ou melhor, qual seria o comando SQL para o meu componente TDataSet fazer a alteração apenas na linha que o usuário selecionar?

Link para o comentário
Compartilhar em outros sites

  • 0
Olá Daniel,

Tenho uma dúvida parecida. Vou tentar explicar de maneira clara: Eu faço uma pesquisa e os resultados são exibidos no DBGrid. Já alterei todas as propriedades do DBGrid, por exemplo: "rowSelect := True", "editing := false", "readonly := true".

Agora, gostaria que, quando o usuário selecionasse uma linha e clicasse em um botão, ocorresse uma alteração naquele registro. Exemplo:

DBGrid exibindo o resultado da Consulta:

| Codigo | Nome | Idade | Selecionado |

| 1 | Du |21 | False |

| 2 | Kadu |22 | False |

| 3 | Rafa |20 | False |

Eu seleciono a Linha 3:

| 3 | Rafa |20 | False |

E clico no botão em meu form que fará uma ação, por exemplo mudar o valor do campo "Selecionado" para True. E o resultado seria:

| 3 | Rafa |20 | True |

A minha dúvida é: como fazer pra indicar a linha selecionada? Ou melhor, qual seria o comando SQL para o meu componente TDataSet fazer a alteração apenas na linha que o usuário selecionar?

É por ai mesmo no meu caso seria:

Nome | prifissão | salario

Carlos | Pedreiro | 600,00

Jose | pintor | 500,00

Maria | faxineira | 450,00

Suponho que no dbgrid eu seleciono as linhas Jose e maria, depois eu clico no botão confirmar no formulário

e ele exporta os dados para uma tabela qualquer.

Ou seja, no preciso saber o código de botão confirmar para realizar esta atividade uma vez que o dbgrid terá duas ou mais linha, tantas qtas forem necessario selecionar.

Link para o comentário
Compartilhar em outros sites

  • 0
É por ai mesmo no meu caso seria:

Nome | prifissão | salario

Carlos | Pedreiro | 600,00

Jose | pintor | 500,00

Maria | faxineira | 450,00

Suponho que no dbgrid eu seleciono as linhas Jose e maria, depois eu clico no botão confirmar no formulário

e ele exporta os dados para uma tabela qualquer.

Ou seja, no preciso saber o código de botão confirmar para realizar esta atividade uma vez que o dbgrid terá duas ou mais linha, tantas qtas forem necessario selecionar.

bom.. eu fiz algo dessse tipo aqui

esses dias

procedure TForm.SpeedButton1Click(Sender: TObject);
var idx :integer
begin

fdados.tabelareceptora.append;

with DBGrid1.DataSource do
    if DBGrid1.SelectedRows.Count > 0 then

      for Idx :=0 to DBGrid1.SelectedRows.Count-1 do
      begin

        fdados.tabelaexportadora.GotoBookmark(pointer(DBGrid1.SelectedRows.Items[Idx]));

        fdados.tabelareceptora.FieldByName('NOME').Value := fdados.tabelaexportadora.FieldByName('NOME').Value;
        fdados.tabelareceptora.FieldByName('PROFISSAO').Value := fdados.tabelaexportadora.FieldByName('PROFISSAO').Value;
        fdados.tabelareceptora.FieldByName('SALARIO').Value := fdados.tabelaexportadora.FieldByName('SALARIO').Value;

        Fdados.tabelareceptora.Append;

      end;

Fdados.tabelareceptora.ApplyUpdates(0);
end;

não esqueça que a tabela que receberá os dados deve conter campos com a mesma estrutura da que esta enviando os dados

e não esqueça de habilitar as opçoes no dgbrid : dgMultiSelect, dgRowSelect

não pude testar se esta funcionando

mas o meu aqui trabalha de forma semelhante e funciona

Editado por Thalles63
Link para o comentário
Compartilhar em outros sites

  • 0
É por ai mesmo no meu caso seria:

Nome | prifissão | salario

Carlos | Pedreiro | 600,00

Jose | pintor | 500,00

Maria | faxineira | 450,00

Suponho que no dbgrid eu seleciono as linhas Jose e maria, depois eu clico no botão confirmar no formulário

e ele exporta os dados para uma tabela qualquer.

Ou seja, no preciso saber o código de botão confirmar para realizar esta atividade uma vez que o dbgrid terá duas ou mais linha, tantas qtas forem necessario selecionar.

bom.. eu fiz algo dessse tipo aqui

esses dias

procedure TForm.SpeedButton1Click(Sender: TObject);
var idx :integer
begin

fdados.tabelareceptora.append;

with DBGrid1.DataSource do
    if DBGrid1.SelectedRows.Count > 0 then

      for Idx :=0 to DBGrid1.SelectedRows.Count-1 do
      begin

        fdados.tabelaexportadora.GotoBookmark(pointer(DBGrid1.SelectedRows.Items[Idx]));

        fdados.tabelareceptora.FieldByName('NOME').Value := fdados.tabelaexportadora.FieldByName('NOME').Value;
        fdados.tabelareceptora.FieldByName('PROFISSAO').Value := fdados.tabelaexportadora.FieldByName('PROFISSAO').Value;
        fdados.tabelareceptora.FieldByName('SALARIO').Value := fdados.tabelaexportadora.FieldByName('SALARIO').Value;

        Fdados.tabelareceptora.Append;

      end;

Fdados.tabelareceptora.ApplyUpdates(0);
end;

não esqueça que a tabela que receberá os dados deve conter campos com a mesma estrutura da que esta enviando os dados

e não esqueça de habilitar as opçoes no dgbrid : dgMultiSelect, dgRowSelect

não pude testar se esta funcionando

mas o meu aqui trabalha de forma semelhante e funciona

Muito obrigado, era exatamente o que eu queria!

Gostaria de saber se é possivel apos salvar os dados na tabela exibir uma mensagem de qtos

registros foram arquivados ex.:

showmassage: 'Foram arquivados (5) registros'.

Editado por nsouza
Link para o comentário
Compartilhar em outros sites

  • 0
Muito obrigado, era exatamente o que eu queria!

Gostaria de saber se é possivel apos salvar os dados na tabela exibir uma mensagem de qtos

registros foram arquivados ex.:

showmassage: 'Foram arquivados (5) registros'.

Acho que nisso eu posso ajudar. Que tal você colocar uma variável do tipo inteiro dentro da estrutura de loop, iniciando ela com 0 e incrementando +1 a cada loop. Depois, no showmessa você concatena a string da mensagem com o o número contido na variável. Nisso, você estará exibindo o número de registros transferidos.

Testa aí e depois nos fale =]

abraços

Link para o comentário
Compartilhar em outros sites

  • 0
Muito obrigado, era exatamente o que eu queria!

Gostaria de saber se é possivel apos salvar os dados na tabela exibir uma mensagem de qtos

registros foram arquivados ex.:

showmassage: 'Foram arquivados (5) registros'.

Acho que nisso eu posso ajudar. Que tal você colocar uma variável do tipo inteiro dentro da estrutura de loop, iniciando ela com 0 e incrementando +1 a cada loop. Depois, no showmessa você concatena a string da mensagem com o o número contido na variável. Nisso, você estará exibindo o número de registros transferidos.

Testa aí e depois nos fale =]

abraços

você poderia dar um exemplo de como fazer esse loop, sou iniciante no delphi.

Link para o comentário
Compartilhar em outros sites

  • 0
você poderia dar um exemplo de como fazer esse loop, sou iniciante no delphi.

procedure TForm.SpeedButton1Click(Sender: TObject);
var idx, //contador :integer
begin

fdados.tabelareceptora.append;
//contador := 0;

with DBGrid1.DataSource do
    if DBGrid1.SelectedRows.Count > 0 then

      for Idx :=0 to DBGrid1.SelectedRows.Count-1 do
      begin

        fdados.tabelaexportadora.GotoBookmark(pointer(DBGrid1.SelectedRows.Items[Idx]));

        fdados.tabelareceptora.FieldByName('NOME').Value := fdados.tabelaexportadora.FieldByName('NOME').Value;
        fdados.tabelareceptora.FieldByName('PROFISSAO').Value := fdados.tabelaexportadora.FieldByName('PROFISSAO').Value;
        fdados.tabelareceptora.FieldByName('SALARIO').Value := fdados.tabelaexportadora.FieldByName('SALARIO').Value;

        //contador := contador+1;

        Fdados.tabelareceptora.Append;

      end;

//onde_quer_o_texto.text := 'Foram arquivados ' + contador + ' registros.';
Fdados.tabelareceptora.ApplyUpdates(0);
end;
só adicionar as linhas que eu coloquei // na frente obviamente retirando as barras ou simplesmente
fdados.tabelareceptora.first;

while not fdados.tabelareceptora.eof do begin
contador := contador +1;
fdados.tabelareceptora.next;
end;
onde_quer_o_texto.text := 'Foram arquivados ' + contador + ' registros.';

Editado por Thalles63
Link para o comentário
Compartilhar em outros sites

  • 0
você poderia dar um exemplo de como fazer esse loop, sou iniciante no delphi.

procedure TForm.SpeedButton1Click(Sender: TObject);
var idx, //contador :integer
begin

fdados.tabelareceptora.append;
//contador := 0;

with DBGrid1.DataSource do
    if DBGrid1.SelectedRows.Count > 0 then

      for Idx :=0 to DBGrid1.SelectedRows.Count-1 do
      begin

        fdados.tabelaexportadora.GotoBookmark(pointer(DBGrid1.SelectedRows.Items[Idx]));

        fdados.tabelareceptora.FieldByName('NOME').Value := fdados.tabelaexportadora.FieldByName('NOME').Value;
        fdados.tabelareceptora.FieldByName('PROFISSAO').Value := fdados.tabelaexportadora.FieldByName('PROFISSAO').Value;
        fdados.tabelareceptora.FieldByName('SALARIO').Value := fdados.tabelaexportadora.FieldByName('SALARIO').Value;

        //contador := contador+1;

        Fdados.tabelareceptora.Append;

      end;

//onde_quer_o_texto.text := 'Foram arquivados ' + contador + ' registros.';
Fdados.tabelareceptora.ApplyUpdates(0);
end;
só adicionar as linhas que eu coloquei // na frente obviamente retirando as barras ou simplesmente
fdados.tabelareceptora.first;

while not fdados.tabelareceptora.eof do begin
contador := contador +1;
fdados.tabelareceptora.next;
end;
onde_quer_o_texto.text := 'Foram arquivados ' + contador + ' registros.';

Muito obrigado, ficou muito bom!

O problema é que quando tenho somente um registro na Grid, ele mostra a mensagem 0 morador foi arquivado, deveria mostrar 1 morador foi arquivado. O que houve?

Editado por nsouza
Link para o comentário
Compartilhar em outros sites

  • 0
Muito obrigado, ficou muito bom!

O problema é que quando tenho somente um registro na Grid, ele mostra a mensagem 0 morador foi arquivado, deveria mostrar 1 morador foi arquivado. O que houve?

Primeiramente, quando existe mais de 1 registro ele dá certo? Ou ele sempre vai mostrar com um resultado a menos?

Lembre-se que a mensagem " X moradores foram arquivados com sucesso" deve estar logo após o término do LOOP

Link para o comentário
Compartilhar em outros sites

  • 0
Muito obrigado, ficou muito bom!

O problema é que quando tenho somente um registro na Grid, ele mostra a mensagem 0 morador foi arquivado, deveria mostrar 1 morador foi arquivado. O que houve?

Primeiramente, quando existe mais de 1 registro ele dá certo? Ou ele sempre vai mostrar com um resultado a menos?

Lembre-se que a mensagem " X moradores foram arquivados com sucesso" deve estar logo após o término do LOOP

Obrigado, ficou perfeito!

(Resolvido) Selecionar linha do DBGrid;

Link para o comentário
Compartilhar em outros sites

  • 0
Muito obrigado, ficou muito bom!

O problema é que quando tenho somente um registro na Grid, ele mostra a mensagem 0 morador foi arquivado, deveria mostrar 1 morador foi arquivado. O que houve?

Primeiramente, quando existe mais de 1 registro ele dá certo? Ou ele sempre vai mostrar com um resultado a menos?

Lembre-se que a mensagem " X moradores foram arquivados com sucesso" deve estar logo após o término do LOOP

Obrigado, ficou perfeito!

(Resolvido) Selecionar linha do DBGrid;

Colegas,

desculpe por reativar este post.

O fato é o seguinte.

Tudo explicado ate agora funcionou, eu seleciono várias linha do DBGrid e ele adiciona na tabela,

Mas gostaria que as linhas que não fossem selecionadas tb fossem inseridas em uma tabela Ex.:

Linhas selecionadas -> A clicar no botão confirmar fossem para Tabela "A"

Linhas não seleciondas -> Ao mesmo tempo que o botão Confirmar fosse clicado essas dados tb seriam exportado porém para a tabela "B"

Obrigado!

Link para o comentário
Compartilhar em outros sites

  • 0

Muito bem. Vou tentar explicar um parte da lógica pra ver se ajuda.

O código:

for Idx :=0 to DBGrid1.SelectedRows.Count-1 do
Faz percorrer todas as linhas selecionadas do DBGrid. O código:
fdados.tabelaexportadora.GotoBookmark(pointer(DBGrid1.SelectedRows.Items[Idx]));
Coloca um ponteiro para mostrar que a LINHA selecionada será utilizada (no momento do loop) Portanto, você poderia tentar algo do tipo: Faça um condicional. Se a linha "NÃO FOR SELECIONADA", então jogue os dados para tabela B. Caso contrário, jogue para a tabela A. Eu não testei, mas acredito que seja algo do tipo:
procedure TForm.SpeedButton1Click(Sender: TObject);
var idx, //contador :integer
begin

fdados.tabelareceptora.append;
//contador := 0;

with DBGrid1.DataSource do
    if DBGrid1.SelectedRows.Count > 0 then

      for Idx :=0 to DBGrid1.SelectedRows.Count-1 do
      begin

        if not (fdados.tabelaexportadora.GotoBookmark(pointer(DBGrid1.SelectedRows.Items[Idx]))) then begin 

        fdados.tabelareceptoraB.FieldByName('NOME').Value := fdados.tabelaexportadora.FieldByName('NOME').Value;
        fdados.tabelareceptoraB.FieldByName('PROFISSAO').Value := fdados.tabelaexportadora.FieldByName('PROFISSAO').Value;
        fdados.tabelareceptoraB.FieldByName('SALARIO').Value := fdados.tabelaexportadora.FieldByName('SALARIO').Value;

        else 

        fdados.tabelareceptoraA.FieldByName('NOME').Value := fdados.tabelaexportadora.FieldByName('NOME').Value;
        fdados.tabelareceptoraA.FieldByName('PROFISSAO').Value := fdados.tabelaexportadora.FieldByName('PROFISSAO').Value;
        fdados.tabelareceptoraA.FieldByName('SALARIO').Value := fdados.tabelaexportadora.FieldByName('SALARIO').Value;


        //contador := contador+1;

        Fdados.tabelareceptora.Append;
        end;

      end;

//onde_quer_o_texto.text := 'Foram arquivados ' + contador + ' registros.';
Fdados.tabelareceptora.ApplyUpdates(0);
end;

Percebe o que eu tentei te explicar? Verifique com o condicional. Caso esteja selecionado, envia para a tabelareceptoraA. Senão, envie para a tabelareceptoraB.

Espero ter ajudado.

Abraços

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,3k
    • Posts
      652,4k
×
×
  • Criar Novo...