Fórum Nâo atualiza dbgrid no momento em que salvo #236196

04/06/2004

0

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]


Aldus

Aldus

Responder

Posts

04/06/2004

Thematrix:reloaded

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?


Responder

Gostei + 0

05/06/2004

Thoor Cobain

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;


Responder

Gostei + 0

05/06/2004

Xisto

/**************************************************/ 
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


Responder

Gostei + 0

06/06/2004

Aldus

Olá amigos, com suas dicas funcionou direitinho.

Muito Obrigado.

Mario


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar