Nâo atualiza dbgrid no momento em que salvo
Olá amigos, depois de muitos anos programando em clipper, tenho que migrar meus sistemas para delphi e claro tenho muitas, gostaria de partilhar com vocês e se possível obter respostas para a seguinte:
Nunca usei o formato inserir/alterar/excluir em meus sistemas, e vejo que em delphi, a maioria usa essa filosofia. Criei uma tabela bairros em um banco firebird e inseri os componentes para acesso: SQLCONNECTION -> SQLDATASET -> DATASETPROVIDER -> CLIENTDATASET -> DATASOURCE.
Fiz os relacionamentos, inseri dois maskedit para representar o código e o nome do bairro e um botao salvar.
Como SetFocus inicial coloquei o codigo do bairro, e assim que clicar em salvar, criar via sql o registro no db com base no conteudo dos maskedit´s, como segue:
/**************************************************/
procedure TCadBai.BtnSalvarBairrosClick(Sender: TObject);
var
vvcodbai: integer;
trs: Ttransactiondesc;
begin
trs.TransactionID := 1;
trs.IsolationLevel := xilReadCommitted;
dm.Conexao.StartTransaction(trs);
try
dm.SQL_Bairros.Close ;
dm.SQL_Bairros.CommandText := ´INSERT INTO bairros (codbai,nombai) values (:vcodbai,:vnombai)´;
vvcodbai := strtoint(maskedit1.Text);
dm.SQL_Bairros.ParamByName(´vcodbai´).AsInteger := vvcodbai;
dm.sql_bairros.ParamByName(´vnombai´).AsString := maskedit2.Text ;
dm.sql_bairros.ExecSQL;
dm.conexao.commit(trs);
except
dm.conexao.rollback(trs);
end;
maskedit1.Text := ´0´ ;
maskedit2.text := ´ ´ ;
dbgrid1.Refresh ;
maskedit1.SetFocus ;
end;
/*******************************************************/
O que acontece:
- Nâo atualiza dbgrid no momento em que salvo, mas caso eu feche o sistema e entre novamente os dados estão lá.
- Se eu fechar a tela de cadastro do bairro (não saio do sistema) e entro
novamente dá um erro de chave primária.
Agradeço a ajuda.
Um abraço
Mario
[b:a9192da078][color=red:a9192da078]Título editado pelo Modeador (AZ) - Removido: ´Iniciando...´[/color:a9192da078][/b:a9192da078]
Nunca usei o formato inserir/alterar/excluir em meus sistemas, e vejo que em delphi, a maioria usa essa filosofia. Criei uma tabela bairros em um banco firebird e inseri os componentes para acesso: SQLCONNECTION -> SQLDATASET -> DATASETPROVIDER -> CLIENTDATASET -> DATASOURCE.
Fiz os relacionamentos, inseri dois maskedit para representar o código e o nome do bairro e um botao salvar.
Como SetFocus inicial coloquei o codigo do bairro, e assim que clicar em salvar, criar via sql o registro no db com base no conteudo dos maskedit´s, como segue:
/**************************************************/
procedure TCadBai.BtnSalvarBairrosClick(Sender: TObject);
var
vvcodbai: integer;
trs: Ttransactiondesc;
begin
trs.TransactionID := 1;
trs.IsolationLevel := xilReadCommitted;
dm.Conexao.StartTransaction(trs);
try
dm.SQL_Bairros.Close ;
dm.SQL_Bairros.CommandText := ´INSERT INTO bairros (codbai,nombai) values (:vcodbai,:vnombai)´;
vvcodbai := strtoint(maskedit1.Text);
dm.SQL_Bairros.ParamByName(´vcodbai´).AsInteger := vvcodbai;
dm.sql_bairros.ParamByName(´vnombai´).AsString := maskedit2.Text ;
dm.sql_bairros.ExecSQL;
dm.conexao.commit(trs);
except
dm.conexao.rollback(trs);
end;
maskedit1.Text := ´0´ ;
maskedit2.text := ´ ´ ;
dbgrid1.Refresh ;
maskedit1.SetFocus ;
end;
/*******************************************************/
O que acontece:
- Nâo atualiza dbgrid no momento em que salvo, mas caso eu feche o sistema e entre novamente os dados estão lá.
- Se eu fechar a tela de cadastro do bairro (não saio do sistema) e entro
novamente dá um erro de chave primária.
Agradeço a ajuda.
Um abraço
Mario
[b:a9192da078][color=red:a9192da078]Título editado pelo Modeador (AZ) - Removido: ´Iniciando...´[/color:a9192da078][/b:a9192da078]
Aldus
Curtidas 0
Respostas
Thematrix:reloaded
04/06/2004
Da forma com vc está fazendo, para atualizar o DBGrid, vc vai ter que fechar a tabela e reabri-la,
se vc está usando D6 ou D7, dê uma pesquisada em sites como o Clube Delphi, livros e revistas sobre o DBExpress, o tempo gasto vai valer a pena, porque vc pode trabalhar direto com os componentes Data Controls e, por exemplo dar um Commit Retaining na tabela, isso atualizaria sua visão (DBGrid) na hora....
Mas caso vc precise manter a forma de programação atual, é só dizer pra ver como a gente pode lhe ajudar, valeu?
se vc está usando D6 ou D7, dê uma pesquisada em sites como o Clube Delphi, livros e revistas sobre o DBExpress, o tempo gasto vai valer a pena, porque vc pode trabalhar direto com os componentes Data Controls e, por exemplo dar um Commit Retaining na tabela, isso atualizaria sua visão (DBGrid) na hora....
Mas caso vc precise manter a forma de programação atual, é só dizer pra ver como a gente pode lhe ajudar, valeu?
GOSTEI 0
Thoor Cobain
04/06/2004
Tente assim:
dm.SQL_Bairros.Close ;
dm.SQL_Bairros.CommandText := ´INSERT INTO bairros (codbai,nombai) values (:vcodbai,:vnombai)´;
vvcodbai := strtoint(maskedit1.Text);
dm.SQL_Bairros.ParamByName(´vcodbai´).AsInteger := vvcodbai;
dm.sql_bairros.ParamByName(´vnombai´).AsString := maskedit2.Text ;
dm.sql_bairros.CommandText := commit;
dm.sql_bairros.ExecSQL;
________________
Ainda axo melhor assim caso use BDE:
insira um componente -> Ttable
Na propriedade TABLENAME do Ttable escolha a tabela: bairro.
Na propriedade DATABASENAME do Ttable escolha Suas configuração do BDE caso tiver
e na propriedade NAME do Ttable digite: tbBairro
E agora faça assim:
procedure TCadBai.BtnSalvarBairrosClick(Sender: TObject);
begin
tbBairro.open;
tbBairro.insert;
tbBairro.FieldByName(´CODBAI´).asInteger := StrToInt(maskedit1.Text);
tbBairro.FieldByName(´NOMBAI´).asString := maskedit2.Text;
tbBairro.Post;
tbBairro.Refresh;
tbBairro.Close; // Só feche a tabela caso ela não seteja ligada no grid
end;
dm.SQL_Bairros.Close ;
dm.SQL_Bairros.CommandText := ´INSERT INTO bairros (codbai,nombai) values (:vcodbai,:vnombai)´;
vvcodbai := strtoint(maskedit1.Text);
dm.SQL_Bairros.ParamByName(´vcodbai´).AsInteger := vvcodbai;
dm.sql_bairros.ParamByName(´vnombai´).AsString := maskedit2.Text ;
dm.sql_bairros.CommandText := commit;
dm.sql_bairros.ExecSQL;
________________
Ainda axo melhor assim caso use BDE:
insira um componente -> Ttable
Na propriedade TABLENAME do Ttable escolha a tabela: bairro.
Na propriedade DATABASENAME do Ttable escolha Suas configuração do BDE caso tiver
e na propriedade NAME do Ttable digite: tbBairro
E agora faça assim:
procedure TCadBai.BtnSalvarBairrosClick(Sender: TObject);
begin
tbBairro.open;
tbBairro.insert;
tbBairro.FieldByName(´CODBAI´).asInteger := StrToInt(maskedit1.Text);
tbBairro.FieldByName(´NOMBAI´).asString := maskedit2.Text;
tbBairro.Post;
tbBairro.Refresh;
tbBairro.Close; // Só feche a tabela caso ela não seteja ligada no grid
end;
GOSTEI 0
Xisto
04/06/2004
/**************************************************/ procedure TCadBai.BtnSalvarBairrosClick(Sender: TObject); var vvcodbai: integer; trs: Ttransactiondesc; begin trs.TransactionID := 1; trs.IsolationLevel := xilReadCommitted; dm.Conexao.StartTransaction(trs); try dm.SQL_Bairros.Close ; dm.SQL_Bairros.CommandText := ´INSERT INTO bairros (codbai,nombai) values (:vcodbai,:vnombai)´; vvcodbai := strtoint(maskedit1.Text); dm.SQL_Bairros.ParamByName(´vcodbai´).AsInteger := vvcodbai; dm.sql_bairros.ParamByName(´vnombai´).AsString := maskedit2.Text ; dm.sql_bairros.ExecSQL; dm.conexao.commit(trs); except dm.conexao.rollback(trs); end; maskedit1.Text := ´0´ ; maskedit2.text := ´ ´ ; dm.SQL_Bairros.Close ; dm.SQL_Bairros.CommandText := ´SELECT * FROM bairros´; dm.NAOSEIONOMEDOCLIENTEDATASET.Open; // nao precisa dm.SQL_Bairros.Open; // dbgrid1.Refresh ; maskedit1.SetFocus ; end;
Espero ter ajudado
GOSTEI 0
Aldus
04/06/2004
Olá amigos, com suas dicas funcionou direitinho.
Muito Obrigado.
Mario
Muito Obrigado.
Mario
GOSTEI 0