|
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
egamavido Novato
Registrado: Segunda-Feira, 11 de Abril de 2016 Mensagens: 70
|
Enviada: Qui Jan 27, 2022 4:20 pm Assunto: Impedir que dois usuários gerem o mesmo registro |
|
|
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 |
|
|
alexbandeira Mestre
Registrado: Terça-Feira, 27 de Julho de 2004 Mensagens: 812 Localização: Paulista - PE
|
Enviada: Seg Jan 31, 2022 10:32 am Assunto: |
|
|
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 |
|
|
johnny-walker Moderador
Registrado: Sábado, 4 de Outubro de 2003 Mensagens: 10653 Localização: Contagem/MG - BRAZIL
|
Enviada: Qui Fev 17, 2022 5:54 pm Assunto: |
|
|
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 |
|
|
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|