Esse é o código usado nos testes para travamento de registro no Postgres.
A instrução HReadSeekFirst com a diretiva lockWrite
HReadSeekFirst(cobradores,id_cob,TABLE_Cobradores.COL_id_Cob,hLockWrite+hLimitParsing)
Não retornava o código que indica registro travado ( 55P03 ) do Postgres.
Após várias tentativas chegamos a essa instruçào:
sSql is string= "select * from cobradores where id_cob ="+TABLE_Cobradores.COL_id_Cob+" for update nowait;"
sQ is Data Source
SQLTransaction(sqlStart,Quantum_Conection) // abre a transação
IF HExecuteSQLQuery(sQ,Quantum_Conection,hQueryWithoutCorrection,sSql) = False THEN
Info(HErrorInfo(hErrFullDetails))
SQLTransaction(sqlRollBack,Quantum_Conection)
RETURN
ELSE
FOR EACH sQ
Trace(sQ.nome_cob)
EDT_Nome = sQ.nome_cob
RADIO_Situ= sQ.situ_cob
EDT_Comissao= sQ.comissao_cob
END
END
Note que a finalização da transação não foi feita, essa terá de ser acionada após um update.
SQLTransaction(sqlRollBack,Quantum_Conection)
Ela só foi chamada quando deu erro.
No projeto de testes, criei um botão de liberação para simular o fechamento da transação.
Com essa solução o update após a alteração, se existir, terá de ser feito com outra query da mesma forma que foi feita a query da select.
Isso anulará as instruções FileToScreen e ScreenToFile.
No projeto eu utilizei a conection do Analysis, mas isso poderá ser feito sem o Analysis.
A imagem mostrando o Lock ( lock de registro Windev + Postgres.png ), está dentro do projeto zipado.
Agradecimentos a todos que de alguma forma contribuíram para essa solução, em especial a Paulo Viana e Nelson da Softcomp.
Qualquer erro encontrado ou uma nova forma que encontraram, agradeceria se reportassem.
Abcs
Ronaldo Silva
Record_Lock.rar