Editando um registro na stringgrid
olá pessoal,
bem estou aki precisando d uma grande ajuda de vcs. O problema é o seguinte: tenho um cadastro de fornecedores e eles estão sendo exibidos por uma stringgrid e ao tentar editar um registro desta string ele sempre retorna os dados do 1º registro da mesma, ou seja se eu selecionar o 5º registro e clicar no botão editar ele abre sempre o 1º registro mesmo sem estar selecionado. como faço p/ poder editar os registro dentro de uma stringgrid? aguardo respostas. obrigado
bem estou aki precisando d uma grande ajuda de vcs. O problema é o seguinte: tenho um cadastro de fornecedores e eles estão sendo exibidos por uma stringgrid e ao tentar editar um registro desta string ele sempre retorna os dados do 1º registro da mesma, ou seja se eu selecionar o 5º registro e clicar no botão editar ele abre sempre o 1º registro mesmo sem estar selecionado. como faço p/ poder editar os registro dentro de uma stringgrid? aguardo respostas. obrigado
Marquinhospe
Curtidas 0
Respostas
Cabelo
20/07/2006
Bom... um StringGrid, nada mais é que um array de string... portanto não tem ligação nenhuma com o BD... quando vc for editar... vc deve ponteirar seu dataset no registro que vc quer editar..
pode usar o método locate no dataset... antes de abrir o registro para edição...
pode usar o método locate no dataset... antes de abrir o registro para edição...
GOSTEI 0
Marquinhospe
20/07/2006
estou usanda a seguinte rotina e mesmo assim continua exibindo apenas o 1º usuário do stringgrid. e apresentando a seguinte mensagem de erro: DBText1: Field ´8´ not found
DtmIbjn.Dtbibjn.StartTransaction; //inicia transação de dados
DtmIbjn.Tblentradas.Edit; // põe tbl em modo de edição
Application.CreateForm(TFrmCadentradas,FrmCadentradas);//Cria FrmCadastro
FrmCadentradas.ShowModal;// exibe
FrmCadentradas.DBText1.DataField :=StringGrid1.Rows[StringGrid1.Row][0];
FrmCadentradas.DBEditdata.DataField :=StringGrid1.Rows[StringGrid1.Row][1];
FrmCadentradas.rdgtipoent.DataField :=StringGrid1.Rows[StringGrid1.Row][2];
FrmCadentradas.DBEdit2.DataField :=StringGrid1.Rows[StringGrid1.Row][3];
FrmCadentradas.DBEdit1.DataField :=StringGrid1.Rows[StringGrid1.Row][4];
FrmCadentradas.DBEditvalor.DataField :=StringGrid1.Rows[StringGrid1.Row][5];
FrmCadentradas.DBComboBox1.DataField :=StringGrid1.Rows[StringGrid1.Row][6];
FrmCadentradas.DBEditesp.DataField :=StringGrid1.Rows[StringGrid1.Row][7];
FrmCadentradas.Destroy;
DtmIbjn.Dtbibjn.StartTransaction; //inicia transação de dados
DtmIbjn.Tblentradas.Edit; // põe tbl em modo de edição
Application.CreateForm(TFrmCadentradas,FrmCadentradas);//Cria FrmCadastro
FrmCadentradas.ShowModal;// exibe
FrmCadentradas.DBText1.DataField :=StringGrid1.Rows[StringGrid1.Row][0];
FrmCadentradas.DBEditdata.DataField :=StringGrid1.Rows[StringGrid1.Row][1];
FrmCadentradas.rdgtipoent.DataField :=StringGrid1.Rows[StringGrid1.Row][2];
FrmCadentradas.DBEdit2.DataField :=StringGrid1.Rows[StringGrid1.Row][3];
FrmCadentradas.DBEdit1.DataField :=StringGrid1.Rows[StringGrid1.Row][4];
FrmCadentradas.DBEditvalor.DataField :=StringGrid1.Rows[StringGrid1.Row][5];
FrmCadentradas.DBComboBox1.DataField :=StringGrid1.Rows[StringGrid1.Row][6];
FrmCadentradas.DBEditesp.DataField :=StringGrid1.Rows[StringGrid1.Row][7];
FrmCadentradas.Destroy;
GOSTEI 0
Cabelo
20/07/2006
Bom... vamos lá....
Para executar a edição... vc pode utilizar direto no StringGrid, mas se prefere utilizar dos DBEdits vamos lá..
assim pode funcionar..
Deve funcionar assim... mas pq vc passa o DataField em RUN - Time... vc trabalha com diversas tabelas diferentes no mesmo StringGrid...
pois se vc quer o valor do Cells do StringGrid no DBText... vcv deve passar assim :
Espero uqe assim possa resolver seu problema...
Para executar a edição... vc pode utilizar direto no StringGrid, mas se prefere utilizar dos DBEdits vamos lá..
assim pode funcionar..
DtmIbjn.Dtbibjn.StartTransaction; //inicia transação de dados DtmIbjn.Tblentradas.Edit; // põe tbl em modo de edição Application.CreateForm(TFrmCadentradas,FrmCadentradas);//Cria FrmCadastro FrmCadentradas.ShowModal;// exibe FrmCadentradas.DBText1.DataField :=StringGrid1.Cells[StringGrid1.Row, 0]; FrmCadentradas.DBEditdata.DataField :=StringGrid1.Cells[StringGrid1.Row, 1]; FrmCadentradas.rdgtipoent.DataField :=StringGrid1.Cells[StringGrid1.Row, 2]; FrmCadentradas.DBEdit2.DataField :=StringGrid1.Cells[StringGrid1.Row, 3]; FrmCadentradas.DBEdit1.DataField :=StringGrid1.Cells[StringGrid1.Row, 4]; FrmCadentradas.DBEditvalor.DataField :=StringGrid1.Cells[StringGrid1.Row, 5]; FrmCadentradas.DBComboBox1.DataField :=StringGrid1.Cells[StringGrid1.Row, 6]; FrmCadentradas.DBEditesp.DataField :=StringGrid1.Cells[StringGrid1.Row, 7]; FrmCadentradas.Destroy;
Deve funcionar assim... mas pq vc passa o DataField em RUN - Time... vc trabalha com diversas tabelas diferentes no mesmo StringGrid...
pois se vc quer o valor do Cells do StringGrid no DBText... vcv deve passar assim :
. . . DtmIbjn.Tblentradas.Edit; Tblentradas.FieldByName(´Nome do campos na tabela´).AsString := StringGrid1.Cells[StringGrid1.Row, coluna do campo correspondente]; . . . . Tbllentradas.Post; Tblentradas.Refresh;
Espero uqe assim possa resolver seu problema...
GOSTEI 0
Marquinhospe
20/07/2006
Junior eu fiz da maneira q mandaste mas ele continua sempre exibindo o 1º registro da string. E quando eu altero uma informção ele exibe a seguinte mensagem de erro: Dbeditcodent: Field ´Nome´ not found., e altera a informção tipo valor. sinceramente eu ñ sei mas como fazer.
Estou trabalhando desta maneira pq é a q eu sei, se vc tem outra forma de editar mas facil agradeço.
Estou trabalhando desta maneira pq é a q eu sei, se vc tem outra forma de editar mas facil agradeço.
GOSTEI 0
Cabelo
20/07/2006
Estou um pouco confuso... vc está tentando fazer o q???
´Jogar´ os dados de um stringGrid nos edits para depois editá-los???
se for isso não há necessidade, vc pode utilizar a edição direto no stringgrid...
ou então está tenatndo editar um clientdataset ligado aos edits e depois jogá-los num string grid... se for isso vc deve sempre incrementar um contador que pode ser feito a partir de um for para o número da linha..
assim por exemplo :
Lembre-se que o clientdataset já deve estar aberto..
stringgrid.colcount := clientdataset.fieldcount - 1;
stringgrid.rowcount := clientdataset.recordcount - 1;
clientdataset.first;
for v_i := 0 to clientdataset.fieldcount - 1 do
begin
for v_j := 0 to clientadataset.recordcount - 1 do
begin
stringgrid.cells[v_j, v_i] := clientdataset.fieldbyname(clientdataset.fields[v_i].name).asstring;
clientdataset.next;
end;
end;
depois que vc editar eles diretamente no stringgrid, ao clicar no botão salvar, vc dá o mesmo for mas muda os dados pro client.
clientdataset.first;
for v_i := 0 to stringgrid.colcount - 1 do
begin
for v_j := 0 to stringgrid.rowcount - 1 do
begin
clientdataset.edit;
clientdataset.fieldbyname(clientdataset.fields[v_i].name).asstring :=
stringgrid.cells[v_j, v_i];
clientdataset.post;
clientdataset.next;
end;
end;
clientdataset.applayupdates;
espero ter ajudado..
´Jogar´ os dados de um stringGrid nos edits para depois editá-los???
se for isso não há necessidade, vc pode utilizar a edição direto no stringgrid...
ou então está tenatndo editar um clientdataset ligado aos edits e depois jogá-los num string grid... se for isso vc deve sempre incrementar um contador que pode ser feito a partir de um for para o número da linha..
assim por exemplo :
Lembre-se que o clientdataset já deve estar aberto..
stringgrid.colcount := clientdataset.fieldcount - 1;
stringgrid.rowcount := clientdataset.recordcount - 1;
clientdataset.first;
for v_i := 0 to clientdataset.fieldcount - 1 do
begin
for v_j := 0 to clientadataset.recordcount - 1 do
begin
stringgrid.cells[v_j, v_i] := clientdataset.fieldbyname(clientdataset.fields[v_i].name).asstring;
clientdataset.next;
end;
end;
depois que vc editar eles diretamente no stringgrid, ao clicar no botão salvar, vc dá o mesmo for mas muda os dados pro client.
clientdataset.first;
for v_i := 0 to stringgrid.colcount - 1 do
begin
for v_j := 0 to stringgrid.rowcount - 1 do
begin
clientdataset.edit;
clientdataset.fieldbyname(clientdataset.fields[v_i].name).asstring :=
stringgrid.cells[v_j, v_i];
clientdataset.post;
clientdataset.next;
end;
end;
clientdataset.applayupdates;
espero ter ajudado..
GOSTEI 0
Marquinhospe
20/07/2006
ao tentar editar um registro no string ele da a seguinte mensagem:
dbeditcodent: Field ´3´ not found. como solucionar este erros
dbeditcodent: Field ´3´ not found. como solucionar este erros
GOSTEI 0
Carcleo
20/07/2006
Eu tenho o FormCotacoes(Pedidos).
Nele pus 2 componentes ZTables: ZTablesClientes e ZTablesCotacoes.
Puxei pro form os campos do ZTablesCotacoes.
O Primeiro campo do ZTablesCotacoes é ID (ID de cada pedido)
O Segundo campo do ZTablesCotacoes é NomeCli(Nome do Cli a ser pesquizado na tabela Clientes)
O Primeiro campo do ZTablesCotacoes é CPF(CPF do Cli a ser pesquizado na tabela Clientes)
...
Para o campo NomeCli do ZTablesCotacoes eu tirei o DBEditCli e puz uma comboboxCli no lugar.
Eu quero que ao começar a digitar um nome de cliente, seja feita uma pesquiza e que o nome do cliente seja autocompletado como por exemplo, digita Carl e autocompleta Carlos Rocha.
Daí, pus um componente ZQuery com name de ZqryClientes com SQL=´Select * from clientes order by Nome´ e um Parameter ´Nome´ e entrei o evento OnChange da ComboboxCli e pus o codigo abaixo;
Daí ta autocompletando ok.
Quando eu abro a combobox, la estao os omes dos clientes.
Agora eu quero fazer o seguinte:
Ao trocar o nome do cliente na combobox, o DBEditCPF troque tb do CPF do 1º para o CPF do 2° escolhido. É isso que quero.
Nele pus 2 componentes ZTables: ZTablesClientes e ZTablesCotacoes.
Puxei pro form os campos do ZTablesCotacoes.
O Primeiro campo do ZTablesCotacoes é ID (ID de cada pedido)
O Segundo campo do ZTablesCotacoes é NomeCli(Nome do Cli a ser pesquizado na tabela Clientes)
O Primeiro campo do ZTablesCotacoes é CPF(CPF do Cli a ser pesquizado na tabela Clientes)
...
Para o campo NomeCli do ZTablesCotacoes eu tirei o DBEditCli e puz uma comboboxCli no lugar.
Eu quero que ao começar a digitar um nome de cliente, seja feita uma pesquiza e que o nome do cliente seja autocompletado como por exemplo, digita Carl e autocompleta Carlos Rocha.
Daí, pus um componente ZQuery com name de ZqryClientes com SQL=´Select * from clientes order by Nome´ e um Parameter ´Nome´ e entrei o evento OnChange da ComboboxCli e pus o codigo abaixo;
procedure TFormCotacoes.ComboBoxCliChange(Sender: TObject); begin if (ZTableCotacoes.State in [dsInsert,dsEdit]) then //Verifica se a tabela esta em estado de edição ou inserção begin ZqryClientes.Close; ZqryClientes.ParamByName(´Nome´).Value:=ZTableCotacoesNomeCli.Value; ZqryClientes.Open; ZqryClientes.First; //Verifica se encontrou while not ZqryClientes.EOF do begin ComboBoxCli.Items.Add(VarToStr(ZqryClientesNome.Value)); ZqryClientes.Next; end; end;
Daí ta autocompletando ok.
Quando eu abro a combobox, la estao os omes dos clientes.
Agora eu quero fazer o seguinte:
Ao trocar o nome do cliente na combobox, o DBEditCPF troque tb do CPF do 1º para o CPF do 2° escolhido. É isso que quero.
GOSTEI 0