Código em um DBGrid?

Delphi

05/09/2005

Olá pessal, alguém poderia me dar uma dica de como pegar um valor em uma linha de um DBGrid?


Joule

Joule

Curtidas 0

Respostas

Steve_narancic

Steve_narancic

05/09/2005

Pegar o valor da linha selecionada de da primeira coluna, basta alterar de zero para outro numero para pegar o valor de outra coluna:

 edit1.text := dbgDados.Fields[0].Value;



GOSTEI 0
Steve_narancic

Steve_narancic

05/09/2005

dbgDados = Dbgrid;[/code]



GOSTEI 0
Massuda

Massuda

05/09/2005

...como pegar um valor em uma linha de um DBGrid?
Para pegar um valor em uma coluna do DBGrid para a linha atual, faça...
var
  S: string;
...
  // se souber a posição da coluna no grid
  S := DBGrid1.Columns[NumeroDaColuna].Field.AsString;

  // se souber a posição do campo na tabela
  S := DBGrid1.Fields[NumeroDoCampo].AsString;

  // do campo/coluna selecionado no grid
  S := DBGrid1.SelectedField.AsString;
...

Para escolher uma determinada linha do grid, você pode dar um Locate no DataSet ligado ao DataSource do DBGrid.

A linha atual do DBGrid é sempre o registro atual do DataSet ligado ao DataSource do DBGrid.


GOSTEI 0
Martins

Martins

05/09/2005

Não sei se é o q vc precisa, mas eu fiz assim:
// Se vc clicar na celula desejada ele transfere o conteúdo do campo
// nome para o Edit
procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
  Edit1.Text  :=  Md.cdsContas.FieldbyName(´Nome´).AsString;
end;

// Aqui ele transfere o conteúdo do campo nome para o Edit quando
// vc utiliza as teclas de navegação
procedure TForm1.DBGrid1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  Edit1.Text  := Md.cdsContas.FieldbyName(´Nome´).AsString;
end;

// Ao entrar no grid ele já transfere o valor do campo nome atual para 
// o Edit.
procedure TForm1.DBGrid1Enter(Sender: TObject);
begin
  Edit1.Text := Md.cdsContas.FieldbyName(´Nome´).AsString;
end;


Como disse logo acima não sei se é o q vc precisa, mas tem as dicas do restante do pessoal aqui que manja pra carambas, vale conferir.

Um forte abraço!!!

Boa Sorte!!!

Retorna para dizer qual foi a solução, preciso adicionar novas dicas em meus doc.


GOSTEI 0
Joule

Joule

05/09/2005

Obrigado pessoal resolveu o meu problema... mais apareceu outro, estou tentando alterar um valor mais agora apareceu esse erro: ´Unable to find record. No key specified´

a rotina é essa que estou usando:
var
Valor_DBGrid : Integer;
begin
Valor_DBGrid := DBGrid1.SelectedField.AsInteger;
frmDM.cdsMov.Close;
frmDM.cdsMov.Params.ParamByName(´CodMov´).AsInteger:= Valor_DBGrid;
frmDM.cdsMov.Open;
if not (frmDM.cdsMov.IsEmpty) then
begin
frmDM.cdsMov.Edit;
frmDM.cdsMovTEMPO_TOTAL.AsDateTime :=
frmDM.cdsMovHORAINICIO.AsDateTime-frmDM.cdsMovHORAFINAL.AsDateTime;
frmDM.cdsMov.Post;
try
frmDM.cdsMov.ApplyUpdates(0);
ShowMessage( ´Os dados foram gravados no Banco de Dados.´ );
except
ShowMessage( ´Erro ao tentar salvar informações no Banco de Dados.´ );
end;

frmDM.cdsVerMov.Close;
frmDM.cdsVerMov.Open;
end;


GOSTEI 0
Massuda

Massuda

05/09/2005

Eu não entendo muito de BD, não entendi seu código...
Valor_DBGrid := DBGrid1.SelectedField.AsInteger;
A propriedade TDBGrid.SelectedField vai retornar o campo selecionado pelo usuário; a não ser que você tenha apenas uma coluna/campo no DBGrid, essa coluna/campo pode ser qualquer uma das exibidas no DBGrid, não necessariamente um valor compatível com o CodMov da outra tabela.


GOSTEI 0
Joule

Joule

05/09/2005

eu troquei por esse ´Valor_DBGrid := DBGrid1.Fields[0].AsInteger;´
mais ainda tá apareceu esse erro: ´Unable to find record. No key specified´


GOSTEI 0
Martins

Martins

05/09/2005

Obrigado pessoal resolveu o meu problema... mais apareceu outro, estou tentando alterar um valor mais agora apareceu esse erro: ´Unable to find record. No key specified´ a rotina é essa que estou usando: var Valor_DBGrid : Integer; begin Valor_DBGrid := DBGrid1.SelectedField.AsInteger; frmDM.cdsMov.Close; frmDM.cdsMov.Params.ParamByName(´CodMov´).AsInteger:= Valor_DBGrid; frmDM.cdsMov.Open; if not (frmDM.cdsMov.IsEmpty) then begin frmDM.cdsMov.Edit; frmDM.cdsMovTEMPO_TOTAL.AsDateTime := frmDM.cdsMovHORAINICIO.AsDateTime-frmDM.cdsMovHORAFINAL.AsDateTime; frmDM.cdsMov.Post; try frmDM.cdsMov.ApplyUpdates(0); ShowMessage( ´Os dados foram gravados no Banco de Dados.´ ); except ShowMessage( ´Erro ao tentar salvar informações no Banco de Dados.´ ); end; frmDM.cdsVerMov.Close; frmDM.cdsVerMov.Open; end;


Os dados em seu DbGrid são de outro CDS certo?
vc está selecionando o registro no DbGrid e depois retornando para outra tela, ou é tudo em uma tela só?

Post um comentário sobre seu objetivo com esse código.


GOSTEI 0
Joule

Joule

05/09/2005

Os dados do meu DBGrid são do mesmo CDS e estou usando somente uma tela


GOSTEI 0
Martins

Martins

05/09/2005

Tenta implementar essa linha em teu código e depois retorna para falar se funcionou OK!

 Edit2.Text := DbGrid1.SelectedField.DataSet.FieldByName(´Nome´).AsString;


Espero q possa lhe ajudar!!!


Boa sorte!!!


Martins


GOSTEI 0
Joule

Joule

05/09/2005

tô usando somente um cds em uma mesma tela
fiz assim:

frmDM.cdsMov.Close;
frmDM.cdsMov.Params.ParamByName(´CodMov´).AsInteger:= DbGrid1.SelectedField.DataSet.FieldByName(´CodMov´).AsInteger;
frmDM.cdsMov.Open;
if not (frmDM.cdsMov.IsEmpty) then
begin
frmDM.cdsMov.Edit;
frmDM.cdsMovTEMPO_TOTAL.AsDateTime :=
frmDM.cdsMovHORAINICIO.AsDateTime-frmDM.cdsMovHORAFINAL.AsDateTime;
frmDM.cdsMov.Post;
try
frmDM.cdsMov.ApplyUpdates(0);
ShowMessage( ´Os dados foram gravados no Banco de Dados.´ );
except
ShowMessage( ´Erro ao tentar salvar informações no Banco de Dados.´ );
end;

frmDM.cdsVerMov.Close;
frmDM.cdsVerMov.Open;
end;


mais ainda tá apareceu esse erro: ´Unable to find record. No key specified´


GOSTEI 0
Martins

Martins

05/09/2005

vc tem algum campo chave primária, ou tem algum campo q não está sendo chamado aí em seu procedimento, pq ele não está encontranto o registro, verifique sua tabela e os parametros de sua CDS.


GOSTEI 0
Joule

Joule

05/09/2005

Pessoal desculpe minha falta de atenção o nosso colega Martins falou sobre o uso do CDS e eu me toquei que para esse tipo de operação teria que usar 2 CDS... e deu certo... muito obrigado pela atenção de todos.


GOSTEI 0
Martins

Martins

05/09/2005

Pessoal desculpe minha falta de atenção o nosso colega Martins falou sobre o uso do CDS e eu me toquei que para esse tipo de operação teria que usar 2 CDS... e deu certo... muito obrigado pela atenção de todos.


Estamos aqui para ajudar, por isso sempre q precisar, é só postar.


Boa sorte!!!


Martins


GOSTEI 0
POSTAR