Como fazer um COMMIT via Delphi usando DBEXPRESS
Bom Dia !!
Sou iniciante e estou usando Delphi 7 + Dbexpress + Firebird. Minha dúvida é o seguinte, quero fazer um COMMIT na aplicação a cada 30segundos, e não sei como fazer isto dentro do Delphi.
Alguem poderia dar um exemplo ou explicar como fazer por favor.
Obrigado.
Osvaldo Domênico.
Sou iniciante e estou usando Delphi 7 + Dbexpress + Firebird. Minha dúvida é o seguinte, quero fazer um COMMIT na aplicação a cada 30segundos, e não sei como fazer isto dentro do Delphi.
Alguem poderia dar um exemplo ou explicar como fazer por favor.
Obrigado.
Osvaldo Domênico.
Badboysjc
Curtidas 0
Respostas
Rodrigo_koga
27/04/2008
Legal voce estar aprendendo.
Mas eh o seguinte, porque voce precisa de commit a cada 30 segundos?
Commit que voce esta dizendo eh controle de transação neh?
Na minha opiniao eh o seguinte se vc esta trabalhando com transações, voce dara um commit quando finalizar a transação e naum a cada 30 segundos como voce quer.
Voce poderia explicar as pessoas o porque dar os commits que voce quer.
Ai sim poderiamos entender sua ideia e tentar explicar para voce o que pode ser feito para sua aplicação rodar redonda. Pois colocando commit a cada 30 segundos em cada uma das maquinas imagina qtas vezes o banco teria que processar.
Posta ai qq coisa.
Mas eh o seguinte, porque voce precisa de commit a cada 30 segundos?
Commit que voce esta dizendo eh controle de transação neh?
Na minha opiniao eh o seguinte se vc esta trabalhando com transações, voce dara um commit quando finalizar a transação e naum a cada 30 segundos como voce quer.
Voce poderia explicar as pessoas o porque dar os commits que voce quer.
Ai sim poderiamos entender sua ideia e tentar explicar para voce o que pode ser feito para sua aplicação rodar redonda. Pois colocando commit a cada 30 segundos em cada uma das maquinas imagina qtas vezes o banco teria que processar.
Posta ai qq coisa.
GOSTEI 0
Badboysjc
27/04/2008
Caro amigo, obrigado pela resposta.
Na verdade estou com o seguinte problema, tem hora que grava fisicamente no DB tem hora que não, estou usando um sistema que estou desenvolvendo em rede e vide regra quando o funcionario acaba de cadastrar um cliente em um terminal não aparece nos outros até dar um COMMIT via IB EXPERT por exemplo, só conseguem visualizar após isto.
Segue abaixo um exemlo simples do botão POST.
dm.cdsCliente.Post;
dm.cdsCliente.ApplyUpdates(0);
MessageDlg(´!! Informações Gravadas com Sucesso !!´,mtinformation,[mbok],0);
Se puder dar um ajuda, ficarei muito agradecido.
Abraços.
Osvaldo Domênico.
Na verdade estou com o seguinte problema, tem hora que grava fisicamente no DB tem hora que não, estou usando um sistema que estou desenvolvendo em rede e vide regra quando o funcionario acaba de cadastrar um cliente em um terminal não aparece nos outros até dar um COMMIT via IB EXPERT por exemplo, só conseguem visualizar após isto.
Segue abaixo um exemlo simples do botão POST.
dm.cdsCliente.Post;
dm.cdsCliente.ApplyUpdates(0);
MessageDlg(´!! Informações Gravadas com Sucesso !!´,mtinformation,[mbok],0);
Se puder dar um ajuda, ficarei muito agradecido.
Abraços.
Osvaldo Domênico.
GOSTEI 0
Parosan
27/04/2008
O que falta acho que não é um commit, pois o seu post já atualiza os dados na tabela fisicamente, o resultado não aparece online, porque os dados nos outros terminais não são atualizados até que na tabela seja dado um refresh ou seja reaberta.
Vc pode colocar um timer, que execute o refresh e reposicione a tabela na posição anterior ao comando, más no timer ele poderia afetar durante uma edição ou outro evento de forma inapropriada.
Vc pode colocar um timer, que execute o refresh e reposicione a tabela na posição anterior ao comando, más no timer ele poderia afetar durante uma edição ou outro evento de forma inapropriada.
GOSTEI 0
Badboysjc
27/04/2008
Caro PaRoSan, Bom Dia !!
Antes de mais nada obrigado pela orientação.
Vc acha que teria algum problema de usar da seguinte forma:
dm.cdsclientes.post;
dm.cdsclientes.applyupdates(0);
dm.cdsclientes.close;
dm.cdsclientes.open;
A questão é o seguinte dessa forma agora esta gravando sempre, agora não testei ainda com outro terminal digitando nesta mesma tabela. Minha dúvida é o seguinte.
Se der um comando CLOSE e depois OPEN no momento da gravação se tiver gente usando a mesma tabela, vai dar problema.
Se alguem tiver um exemplo simpes e poder postar eu agradeço.
Obrigado.[/b]
Antes de mais nada obrigado pela orientação.
Vc acha que teria algum problema de usar da seguinte forma:
dm.cdsclientes.post;
dm.cdsclientes.applyupdates(0);
dm.cdsclientes.close;
dm.cdsclientes.open;
A questão é o seguinte dessa forma agora esta gravando sempre, agora não testei ainda com outro terminal digitando nesta mesma tabela. Minha dúvida é o seguinte.
Se der um comando CLOSE e depois OPEN no momento da gravação se tiver gente usando a mesma tabela, vai dar problema.
Se alguem tiver um exemplo simpes e poder postar eu agradeço.
Obrigado.[/b]
GOSTEI 0
Rogerio_amorim
27/04/2008
Tente isso:
Try
ClientDataSet1.ApplyUpdates(-1);
ClientDataSet1.Refresh;
IBTransaction1.CommitRetaining;
Except
On E : Exception do
begin
MessageDlg(´NÃO FOI POSSIVEL GRAVAR, FAVOR VERIFICAR OS DADOS INFORMADOS !!´, mtWarning,[mbOK],0);
end;
End;
Try
ClientDataSet1.ApplyUpdates(-1);
ClientDataSet1.Refresh;
IBTransaction1.CommitRetaining;
Except
On E : Exception do
begin
MessageDlg(´NÃO FOI POSSIVEL GRAVAR, FAVOR VERIFICAR OS DADOS INFORMADOS !!´, mtWarning,[mbOK],0);
end;
End;
GOSTEI 0
Luiz Henrique
27/04/2008
Boa Noite badboysjc:
Nao trabalho muito com ClientDataSet(ou cds), mas espero que ajude:
- Vamos deixar de lado um pouco o commit, vamos falar deste cara ai no final, você nao necessita dele para gravar no banco.
- cds.insert/edit....cds.post(grava na cache) e cds.applyupdate(0)(grava no banco a cache).
- Agora pra que o cds funcione corretamente, existem algumas configuracoes que devem ser levadas em conta. Como por exemplo a propriedade do DataSetProvider.UpdateMode e se estiver usando TField no cds, a propriedade ProviderFlags. Procure conhece-las para que nao tenha resultados inesperados. Por exemplo:
Dois terminais alterando o mesmo registro, e o ultimo a salvar nao conseguir persistir a informacao, pelo simples fato de nao encontrar os mesmos campos originais da sua cache de comparacao no banco, pois acabaram de sofrer alteracao pelo usuario anterior, podera resolver isso informando que para esta comparacao sera usado apenas o campo chave. Veja as propriedades que lhe falei acima, e tambem outras que porventura possam interferir no upply.
Tem uma video-aula do Guinter Pauli(este sim é uma das referencias) sobre este assunto que vale a pena conhecer.
Sobre o Commit. ´Comitar´ a transacacao em vigor. Transacaoes normalmente sao usadas para controlar uma sequencia de procedimentos, como por exemplo:
try
Abre Transacao(StartTransaction).
Salva Contas a Pagar.
Lanca No Caixa.
Informa no Banco.
Fecha transacao.(Commit).
except
Desfaz Operacoes(RollBack)
end;
Se algo der errado, tipo no ´Informa no Banco´, tudo volta ao que era pelo Rollback, se nao você confirma com o Commit(que seria uma especie de applyupdate para o StartTransaction).
Espero que tenha conseguido me explicar, e desculpe se falei alguma besteira, como disse nao trabalho muito com o cds.
Um abraço a todos.
Nao trabalho muito com ClientDataSet(ou cds), mas espero que ajude:
- Vamos deixar de lado um pouco o commit, vamos falar deste cara ai no final, você nao necessita dele para gravar no banco.
- cds.insert/edit....cds.post(grava na cache) e cds.applyupdate(0)(grava no banco a cache).
- Agora pra que o cds funcione corretamente, existem algumas configuracoes que devem ser levadas em conta. Como por exemplo a propriedade do DataSetProvider.UpdateMode e se estiver usando TField no cds, a propriedade ProviderFlags. Procure conhece-las para que nao tenha resultados inesperados. Por exemplo:
Dois terminais alterando o mesmo registro, e o ultimo a salvar nao conseguir persistir a informacao, pelo simples fato de nao encontrar os mesmos campos originais da sua cache de comparacao no banco, pois acabaram de sofrer alteracao pelo usuario anterior, podera resolver isso informando que para esta comparacao sera usado apenas o campo chave. Veja as propriedades que lhe falei acima, e tambem outras que porventura possam interferir no upply.
Tem uma video-aula do Guinter Pauli(este sim é uma das referencias) sobre este assunto que vale a pena conhecer.
Sobre o Commit. ´Comitar´ a transacacao em vigor. Transacaoes normalmente sao usadas para controlar uma sequencia de procedimentos, como por exemplo:
try
Abre Transacao(StartTransaction).
Salva Contas a Pagar.
Lanca No Caixa.
Informa no Banco.
Fecha transacao.(Commit).
except
Desfaz Operacoes(RollBack)
end;
Se algo der errado, tipo no ´Informa no Banco´, tudo volta ao que era pelo Rollback, se nao você confirma com o Commit(que seria uma especie de applyupdate para o StartTransaction).
Espero que tenha conseguido me explicar, e desculpe se falei alguma besteira, como disse nao trabalho muito com o cds.
Um abraço a todos.
GOSTEI 0
Parosan
27/04/2008
Bom dia!
O código que vc colocou vai atualizar fisicamente e carregar novamente os dados atualizados na memória, quando vc fecha a tabela esta fechando os dados na memória que vc estava utilizando no terminal especifico, não afetando os demais terminais, os problemas que vc ainda tem é que em alguns casos esperar que a tabela seja editada para realizar a atualização com o servidor pode ser inconveniente pois existem tabelas que não são editados com frequencia como um caixa que apenas consulta os produtos e essa tabela pode ser necessário um timer para evitar que fique muito tempo sem atualizar os preços, outro item é o colocado pelo Luiz Henrique, dependendo do UpdateMode vc pode ter problemas com atualizações concorrentes.
O código que vc colocou vai atualizar fisicamente e carregar novamente os dados atualizados na memória, quando vc fecha a tabela esta fechando os dados na memória que vc estava utilizando no terminal especifico, não afetando os demais terminais, os problemas que vc ainda tem é que em alguns casos esperar que a tabela seja editada para realizar a atualização com o servidor pode ser inconveniente pois existem tabelas que não são editados com frequencia como um caixa que apenas consulta os produtos e essa tabela pode ser necessário um timer para evitar que fique muito tempo sem atualizar os preços, outro item é o colocado pelo Luiz Henrique, dependendo do UpdateMode vc pode ter problemas com atualizações concorrentes.
GOSTEI 0
Badboysjc
27/04/2008
Caro Luis Henrique e Parosan, Bom Dia !!
Muito obrigado pela orientações, a principio o problema esta resolvido com algumas paramentrizações do provider. Estou usando da seguinte forma:
dm.cdsclientes.Post;
dm.cdsclientes.ApplyUptades(0);
dm.cdsclientes.Refresh;
Baixei as aulas sobre CDS e ajustei os providerflags, agora quando clico no botão GRAVAR e verifico no DB com IBEXPERT ja esta aparecendo na hora, agora realmente só preciso testar em outro terminal para ver se aparece o registro atualizado.
Muito obrigado mesmo..
Abraços.
Muito obrigado pela orientações, a principio o problema esta resolvido com algumas paramentrizações do provider. Estou usando da seguinte forma:
dm.cdsclientes.Post;
dm.cdsclientes.ApplyUptades(0);
dm.cdsclientes.Refresh;
Baixei as aulas sobre CDS e ajustei os providerflags, agora quando clico no botão GRAVAR e verifico no DB com IBEXPERT ja esta aparecendo na hora, agora realmente só preciso testar em outro terminal para ver se aparece o registro atualizado.
Muito obrigado mesmo..
Abraços.
GOSTEI 0
Luiz Henrique
27/04/2008
Fala aí, mestre badboysjc, tudo azul
...é isso aí, tem que ir testando , usando, acustumando com as ferramentas que vc usa, mas lembre sempre, é importantissímo conhece-las e estuda-las a fundo, por que senão, por experiencia propria, vc fica as vezes quebrando a cabeça, por situaçoes de simples solução, que a ferramenta já provê para vc.
Sobre a questao de atualizacao de tela, lógicamente, é interessante vc atualizar a tela do usuário apos persistir os dados, pelos métodos aí já demonstrados pelos companheiros.
Bons códigos aí
T+
...é isso aí, tem que ir testando , usando, acustumando com as ferramentas que vc usa, mas lembre sempre, é importantissímo conhece-las e estuda-las a fundo, por que senão, por experiencia propria, vc fica as vezes quebrando a cabeça, por situaçoes de simples solução, que a ferramenta já provê para vc.
Sobre a questao de atualizacao de tela, lógicamente, é interessante vc atualizar a tela do usuário apos persistir os dados, pelos métodos aí já demonstrados pelos companheiros.
Bons códigos aí
T+
GOSTEI 0
Teste
27/04/2008
Vc esqueceu?
GOSTEI 0