ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Impedir que dois usuários gerem o mesmo registro

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
egamavido
Novato
Novato


Registrado: Segunda-Feira, 11 de Abril de 2016
Mensagens: 70

MensagemEnviada: Qui Jan 27, 2022 4:20 pm    Assunto: Impedir que dois usuários gerem o mesmo registro Responder com Citação

Olá a todos,
Tenho uma aplicação que gera um número somente no final de uma edição, que deve ser único. Até agora deu certo, porque eu tenho certeza de que não há dois usuários ao mesmo tempo realizando a mesma edição.
Mas, eu quero garantir que o número não seja “pescado” pelo sistema de jeito nenhum, então, gostaria de fazer uma “trava” bloqueando silenciosamente o disparo de novos números, até que o primeiro usuário operando a página, libere o sistema.
Eu tentei “marcar” o banco e criar uma rotina “repeat-until”, enquanto o banco esteja “marcado”, mas o sistema entrou em loop infinito. Não sei se a estrutura esta errado ou minha ideia foi (muito) ruim. Alguém poderia me corrigir ou me dar um exemplo, sem precisar fazer esse bloqueio no banco de dados.
Segue o código que tentei, em XE2 + Access.
Citação:

DMDados.CDSSemafaro.Locate('Codigo','7',[]);
if DMDados.CDSSemafaroAtivo.Text <> '' then
begin
repeat
until (DMDados.CDSSemafaroAtivo.Text = '');
end
else
begin
DMDados.CDSSemafaro.Edit;
DMDados.CDSSemafaroAtivo.Text:= 'x';
DMDados.CDSSemafaro.Post;
DMDados.CDSSemafaro.ApplyUpdates(0);


Obrigado desde já
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
alexbandeira
Mestre
Mestre


Registrado: Terça-Feira, 27 de Julho de 2004
Mensagens: 812
Localização: Paulista - PE

MensagemEnviada: Seg Jan 31, 2022 10:32 am    Assunto: Responder com Citação

Não entendi direito, mas irei tentar te ajudar com o que entendi.

Vc quer evitar que um registro seja alterado por dois operadores simultaneamente. Não é isso?
Provavelmente é um aplicativo em rede, onde vários usuários têm acesso.

Ok, para evitar que uma tabela seja manipulada por mais de um operador ao mesmo tempo vc pode se utilizar de uma propriedade/recurso da Table.

Antes de liberar Editar ou Inserir, verifique se a tabela já se encontra em modo de Edição e ou Inserção.

Código:

If (table.state in[dsEdit,dsInsert]) Then
  ShowMesage('Tabela sendo traalhada por outro operador neste momento.')
Else
  Table.Edit; // Ou edit ou insert, conforme a sua sececcidade.


OBS: Não se esqueça de garantir que ao fechar o form de edição ou inserção a tbl ficará liberada para ser tabalhada. Algum operador pode fechar o form sem concluir a operação e a tabela ficar travada.
[/code]
_________________
Conhecemos um grande homem pelas pequenas atitudes.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário
johnny-walker
Moderador
Moderador


Registrado: Sábado, 4 de Outubro de 2003
Mensagens: 10653
Localização: Contagem/MG - BRAZIL

MensagemEnviada: Qui Fev 17, 2022 5:54 pm    Assunto: Responder com Citação

Amigo, na aplicação é muito difícil você controlar isto.
No exemplo do delphi chamado MASTAPP tem o que você quer, mas sinceramente não recomendo, mas lá utiliza-se de dois bancos de dados, o paradox e o interbase.

O recurso é simples, mas não aconselho seu uso.

O melhor seria deixar a transação no próprio banco, fiz assim num programa que tem ordem sequencial e este recurso funciona bem, mesmo em rede.


Bem, é desta forma que utilizo para gerar este número sequencial, visto que quando dá uma exceção, este número será gerado e para não perdê-lo criei esta SP.


Código:
REATE PROCEDURE SP_GENID_ARQPERM
as
declare variable max_id integer;
declare variable current_id integer;
begin
  /* Procedure para evitar que a exceção prejudique a ordem Generator/Sequence*/
  select max(id_pasta) from arq_perm
  into: max_id;
  current_id = GEN_ID(GEN_ARQ_PERM_ID,0);
  if ((:max_id - :current_id) = 0) then
    current_id = GEN_ID(GEN_ARQ_PERM_ID,1);
end


CREATE OR ALTER trigger arq_perm_bi for arq_perm
active before insert position 0
AS
BEGIN
  execute procedure SP_GENID_ARQPERM;
  IF (NEW.ID_PASTA IS NULL) THEN
    NEW.ID_PASTA = GEN_ID(GEN_ARQ_PERM_ID,0);
END


Não vou te dizer que é a melhor solução, mas funcionou para mim.


bye
_________________
P.O.W.E.R B.Y D.E.L.P.H.I
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB