Ir para conteúdo
Fórum Script Brasil
  • 0

Bloquer registro p/ edição


kartter

Pergunta

Prezados,

Antigamente eu utilizada o interbase, usando o BDE p/ fazer a conexão com o banco. Nesta época, quando eu abria um registro de uma determinada tabela para edição, o próprio bde bloqueava este registro, de modo que outras estações não podessem alterar estre registro. Se eu abrisse uma grid, em uma estação, onde constavam diversas linhas de uma determinada tabela, e em outra estação, alguém alterasse alguns destes registros, eu conseguia ver o registro alterado.

Agora utilizo o Interbase com acesso nativo, ou seja, sem middware.

1º problema: 2 estações conseguem dar edit em um mesmo registro, e a alteração que é salva é referente a última pessoa que efetuou o commit. Gostaria que funcionasse igual a época do BDE, travando este registro p/ edição

2º problema: Se eu estiver com uma grid aberta, eu não consigo visualizar as atualizações feitas nela. Só consigo caso eu feche a abra a tela.

A configuração do meu componente ibtransaction é:

read_committed

rec_version

nowait

Utilizo p/ instanciar minhas tabelas o componente IBTable.

valeu pela ajuda!

Kartter

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0
Agora utilizo o Interbase com acesso nativo, ou seja, sem middware.

1º problema: 2 estações conseguem dar edit em um mesmo registro, e a alteração que é salva é referente a última pessoa que efetuou o commit. Gostaria que funcionasse igual a época do BDE, travando este registro p/ edição

2º problema: Se eu estiver com uma grid aberta, eu não consigo visualizar as atualizações feitas nela. Só consigo caso eu feche a abra a tela.

A configuração do meu componente ibtransaction é:

read_committed

rec_version

nowait

Primeira coisa que tem que ser levada em conta é a quantidade de registro com que voce pensa em trabalhar

supondo que sejam muitos registros ( acima de 40.000 ) o ideal não é usar o componente IBTable e sim o TIBQuery juntamente com os TDataSetProvider, TClientDataSet e TDataSource

1º problema: uma das maneiras de resolver isso seria, na inclusão do registro, atribuir um numero a este registro e salva-lo e depois dar o commit. desta maneira o proximo usuario que fizer uma nova inclusão terá o proximo registro disponivel.

Uma vez que voce sabe qual registro usar, voce pode fazer uma busca deste registro por parametro no arquivo

exemplo

StaticText2.Caption := ' Registros Cadastrados =  ' + inttostr(CDS_CadastroX.recordcount);

   reg := CDS_CadastroXFICHA_NUM.AsInteger;   // ultimo registro do arquivo CadastroX
   reg := reg + 1;

   Cadastro_IB.Active := false;
   CDS_Cadastro.Active := false;
   CDS_Cadastro.Params[0].AsInteger := reg;  // recebe o o numero do ultimo reg + 1
   Cadastro_IB.Active := true;
   CDS_Cadastro.Active := true;

   CDS_Cadastro.Last;
   CDS_Cadastro.Append;
   CDS_Cadastro.Edit;
   CDS_CadastroFICHA_NUM.AsInteger := reg;
   CDS_Cadastro.Post;  // mantem num de registro ate que seja gravado em definitivo
   CDS_Cadastro.ApplyUpdates(-1);
   CDS_Cadastro.Refresh;

   //ATUALIZAR OS DADOS PARA A REDE
   FMenu.IBTransaction1.Commit;
   FMenu.IBTransaction1.StartTransaction;

   CDS_Cadastro.Edit     ///  para continuar usando o registro
OBS: se o registro for descartado, simplesmente voce o deleta, lembrando que neste caso voce tera alguns numeros faltando na sequencia 2º problema: Se a grid estiver aberta, voce tera que colocar no dbnavigator no botão refresh o comando para atualizar a sua grid
CDS_Cadastro.Refresh;

   //ATUALIZAR OS DADOS PARA A REDE
   FMenu.IBTransaction1.Commit;
   FMenu.IBTransaction1.StartTransaction;

A configuração do meu componente ibtransaction está correta.

( Lembre-se isto é apenas uma das maneiras para resolver o problema, talvez não a melhor, mas funciona )

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
2º problema: Se eu estiver com uma grid aberta, eu não consigo visualizar as atualizações feitas nela. Só consigo caso eu feche a abra a tela.

A configuração do meu componente ibtransaction é:

read_committed

rec_version

nowait

Kartter, acho que quando você diz: "não consigo visualizar as atualizações feitas nela" você está se referindo às alterações efetuadas na tabela de onde, os dados mostrados no DBGrid, são obtidos. Não é mesmo?!

Quanto a visualização de dados atualizados no DGBrid, não há outro meio que não pela re-execução da consulta (o tal close/open) - é uma questão de otimização. Imagine centenas de usuários fazendo consulta o tempo todo (a cada segundo, por ex.), apenas para atualizar uma visualização, que pode nem ter sofrido auterações. No caso do Firebird e Intebase, há a possibilidade do uso de eventos para que você promova uma atualização apenas quando há alterações, mas este recurso deve ser utilizado com moderação - veja este artigo: The Power Of The Firebird Events

1º problema: uma das maneiras de resolver isso seria, na inclusão do registro, atribuir um numero a este registro e salva-lo e depois dar o commit. desta maneira o proximo usuario que fizer uma nova inclusão terá o proximo registro disponivel.
Jhonas, a dica é boa, mas acho que não é esta a situação colocada pelo Kartter. Observe que ele diz que: "2 estações conseguem dar edit em um mesmo registro"; Então, ele está falando sobre a possibilidade de mais que um usuário alterar a mesma informação (uma já cadastrada).

Acredito que este seja o caso de utilizar um Lock explícito, mas já recebi argumentos de que não seria apropriado. Veja este tópico: "Bloqueio de Registro" e opine por si só.

Abraços

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...