SET QUERY AND LOCK
SET QUERY AND LOCK ( bloq )
Parâmetro | Tipo | Descrição | |
---|---|---|---|
bloq | Boolean | → | True = bloquear os registros encontrados por pesquisas; False = Não bloquear os registros |
Descrição
O comando SET QUERY AND LOCK permite solicitar o bloqueio automático dos registros encontrados por todas as pesquisas que seguem o chamado deste comando na transação atual. Isso significa que os registros não podem ser modificados por um processo diferente ao processo atual entre uma pesquisa e a manipulação de resultados.
Por padrão, os registros encontrados pelas pesquisas não estão bloqueados. Passe True no parâmetro bloq para ativar o bloqueio.
Este comando deve imperativamente ser utilizado no interior de uma transação. Se for chamado fora deste contexto, é gerado um erro. Isso permite um melhor controle do bloqueio de registros. Os registros encontrados permanecerão bloqueados até que a transação termine ( confirmada ou cancelada). Depois que a transação se completa, todos os registros são desbloqueados.
Os registros estão bloqueados para todas as tabelas na transação atual.
Quando uma instrução SET QUERY AND LOCK (True) for executada, os comandos de pesquisa (por exemplo QUERY) adotam um funcionamento específico se for encontrado um registro bloqueado:
- A pesquisa se detém e a variável sistema OK toma o valor 0,
- A seleção atual fica vazia,
- O conjunto sistema LockedSet contém o registro bloqueado que causou que a pesquisa fosse interrompida.
Portanto, neste contexto é necessário testar o conjunto LockedSet definido depois de uma pesquisa infrutífera (seleção atual vazia ou variável OK em 0) para determinar a causa da falha.
Chame SET QUERY AND LOCK(False) com o objetivo de desativar o mecanismo posteriormente.
SET QUERY AND LOCK modifica unicamente o comportamento dos comandos de pesquisa em outras palavras:
- QUERY
- QUERY SELECTION
- QUERY BY EXAMPLE
- QUERY BY FORMULA
- QUERY BY SQL
- QUERY SELECTION BY FORMULA
- QUERY SELECTION WITH ARRAY
- QUERY WITH ARRAY
- QUERY BY ATTRIBUTE
- QUERY SELECTION BY ATTRIBUTE
Entretanto, SET QUERY AND LOCK não afeta os outros comandos que modificam a seleção atual tais como as ALL RECORDS, RELATE MANY etc.
Exemplo
Neste exemplo, não é possível apagar um cliente que teria sido passado da categoria “C” a categoria “A” em outro processo entre QUERY e DELETE SELECTION:
START TRANSACTION
SET QUERY AND LOCK(True)
QUERY([Clientes];[Clientes]Categoria=“C”)
//Neste momento, os registros encontrados são bloqueados automaticamente por todos os outros processos
DELETE SELECTION([Clientes])
SET QUERY AND LOCK(False)
VALIDATE TRANSACTION
Gestão de erros
Se o comando não é chamado no contexto de uma transação, um erro é gerado.