PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV 25 → Como travar um registro do banco de dados que está sendo usado, para evitar que outra estação altere ao mesmo tempo?
Como travar um registro do banco de dados que está sendo usado, para evitar que outra estação altere ao mesmo tempo?
Started by Boller, Jun., 17 2023 9:45 AM - No answer
Registered member
3,659 messages
Popularité : +175 (223 votes)
Posted on June, 17 2023 - 9:45 AM
Prezados,

O primeiro que abriu o registro bloqueia e o segundo aguarda, da seguinte forma:

Os comandos HLockRecNum e HUnlockRecNum são funções da linguagem Windev que são usadas para bloquear e desbloquear um registro em um arquivo de dados, respectivamente. Isso é útil em um sistema ERP com muitos acessos à base de dados, pois garante que apenas uma aplicação tenha acesso a um registro de cada vez, evitando conflitos de dados.

HLockRecNum
A função HLockRecNum é usada para bloquear um registro e restringir o acesso a este registro para todas as outras aplicações【9†source】. Sua sintaxe é a seguinte:

pascal
Copy code
<Result> = HLockRecNum([<Data file> [, <Record to lock>]] [, <Lock>])
Onde:

<Result> é um booleano que retorna True se a operação foi realizada e False se ocorrer um problema.
<Data file> é o nome do arquivo de dados usado. Se não for especificado, HLockRecNum usará o último arquivo de dados usado pela última função HFSQL.
<Record to lock> é o número do registro a ser bloqueado. Se não for especificado, HLockRecNum lidará com o registro atual.
<Lock> é usado para definir o tipo de bloqueio definido no registro【11†source】.
Um exemplo de uso desta função é o seguinte:

pascal
Copy code
// Bloquear um registro no arquivo de dados do Cliente
HLockRecNum(Customer, hCurrentRecNum, hLockReadWrite)
// Processar o registro
...
// Restaurar o acesso ao registro
HUnlockRecNum
Neste exemplo, um registro no arquivo de dados do Cliente é bloqueado para leitura e gravação, processado e, em seguida, o acesso a ele é restaurado usando HUnlockRecNum【10†source】.

HUnlockRecNum
A função HUnlockRecNum é usada para desbloquear um registro bloqueado pela função HLockRecNum ou uma função de leitura usada com um parâmetro de bloqueio, como HRead usado com a constante hLockWrite ou hLockReadWrite【20†source】. Sua sintaxe é a seguinte:

pascal
Copy code
<Result> = HUnlockRecNum([<Data file> [, <Record number>]])
Onde:

<Result> é um booleano que retorna True se o registro foi desbloqueado e False se ocorrer um problema.
<Data file> é o nome do arquivo de dados usado. Se não for especificado, HUnlockRecNum usará o último arquivo de dados usado pela última função HFSQL.
<Record number> é o número do registro a ser desbloqueado. Se este número não for especificado (ou for igual a 0 ou à constante hCurrentRecNum), HUnlockRecNum lerá o registro atual【22†source】.
Um exemplo de uso desta função é o seguinte:

pascal
Copy code
// Bloquear
HLockRecNum(CUSTOMER, hRecNumCurrent, hLockReadWrite)
// Modificar o registro
...
// Desbloquear
HUnlockRecNum(CUSTOMER, hRecNumCurrent)
Neste exemplo, um registro no arquivo de dados do Cliente é bloqueado para leitura e gravação, modificado e, em seguida, desbloqueado usando HUnlockRecNum【21†source】.

Aqui estão exemplos de procedures que implementam essas funções em um ERP com muitos acessos à base de dados:

pascal
Copy code
PROCEDURE BloquearRegistro(Tabela, NumeroRegistro)
LOCAL Resultado

// Bloquear o registro na tabela especificada
Resultado = HLockRecNum(Tabela, NumeroRegistro, hLockReadWrite)

IF Resultado = False THEN
// Tratar o erro
Error("Não foi possível bloquear o registro: " + HErrorInfo())
ELSE
// Registro bloqueado com sucesso
Info("Registro bloqueado com sucesso")
END

END

PROCEDURE DesbloquearRegistro(Tabela, NumeroRegistro)
LOCAL Resultado

// Desbloquear o registro na tabela especificada
Resultado = HUnlockRecNum(Tabela, NumeroRegistro)

IF Resultado = False THEN
// Tratar o erro
Error("Não foi possível desbloquear o registro: " + HErrorInfo())
ELSE
// Registro desbloqueado com sucesso
Info("Registro desbloqueado com sucesso")
END

END
Neste exemplo, as procedures BloquearRegistro e DesbloquearRegistro são usadas para bloquear e desbloquear um registro, respectivamente. A função HErrorInfo é usada para obter informações sobre um erro, se ocorrer.




User
Como poderia fazer uma interface para o segundo usuário ser avisado que o registro está em uso?


ChatGPT
Você pode fazer uma interface de usuário para notificar o segundo usuário de que um registro está em uso. Aqui está um exemplo de como você pode fazer isso usando o Windev:

pascal
Copy code
PROCEDURE AcessarRegistro(Tabela, NumeroRegistro)
LOCAL Resultado

// Tente bloquear o registro
Resultado = HLockRecNum(Tabela, NumeroRegistro, hLockReadWrite)

IF Resultado = False THEN
// Se o bloqueio falhar, informe ao usuário que o registro está em uso
Info("O registro que você está tentando acessar está atualmente em uso por outro usuário. Por favor, tente novamente mais tarde.")
ELSE
// Se o bloqueio for bem-sucedido, o usuário pode prosseguir com a edição do registro
...
// Após a edição, desbloquear o registro
HUnlockRecNum(Tabela, NumeroRegistro)
END
END
Neste exemplo, a procedure AcessarRegistro tenta bloquear um registro para edição. Se o bloqueio falhar (indicado por HLockRecNum retornando False), uma mensagem de informação é exibida para o usuário informando que o registro está em uso. Se o bloqueio for bem-sucedido, o usuário pode prosseguir com a edição do registro e, em seguida, o registro é desbloqueado com HUnlockRecNum.

Note que isso é apenas um exemplo simples e, em um sistema ERP real, você provavelmente terá que lidar com muito mais casos e possíveis erros. Além disso, a mensagem de erro deve ser exibida de uma maneira que se ajuste ao design geral da interface do usuário do seu aplicativo.

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/