|
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/ |
| |
| |
| | | |
|
| | | | |
| | |
|