o que anda acontecendo comigo é o seguinte quando eu bloqueio um determinado registro em uma estação ele fica bloqueado mas se eu desbloqueio um registro de uma outra tabela ele também é desbloqueado, eu montei uma rotina de teste e pude constatar que ao utilizar em DBF este problema não ocorre, apenas no quando utilizo banco de dados, estou utilizando Postgress, acredito que a unica maneira de corrigir este problema seria seja utilizar um bloco de transação mais isto implicaria em ter que verificar uma rotina gigantesca que possuo hoje, pois eu precisaria retirar o commit e unlock de todas as tabelas que possuo.
#include "sqlrdd.ch"
#define SQL_DBMS_NAME 17
#define SQL_DBMS_VER 18
request sqlrdd
REQUEST SR_PGS
#include 'pgs.ch'
**
*
request hb_nomouse // desativa o mouse
request dbfcdx
request dtos
*
FUNCTION MAIN(cDriver)
clear
clear typeahead
setcolor('w/n,w+/n')
Set AutOpen ON
if cDriver == nil
? 'PARAMETRO NAO ESPECIFICADO [DBFCDX,SQLRDD]'
return .t.
endif
cDriver := upper(cDriver)
** conecta no banco de dados
if cDriver=='SQLRDD' .AND. !Connect()
return .t.
end
use orcament alias orcament shared new via cDriver
use orc_prod alias orc_prod shared new via cDriver
cls
? ' orcament tentando bloquear o registro : ',orcament->(recno())
while orcament->(!rlock())
end
? ' orc_prod tentando bloquear o registro : ',orc_prod->(recno())
while orc_prod->(!rlock())
end
? 'registros bloqueados'
? 'orcament->'+valtoprg(orcament->(recno()))
? 'orc_prod->'+valtoprg(orc_prod->(recno()))
alert('desbloqueando orc_prod')
orc_prod->(dbunlock())
alert('desbloqueado orc_prod;;'+;
'orc_prod' +sr_showvector( orc_prod->(dbRLockList()) )+';;'+;
'orcament' +sr_showvector( orcament->(dbRLockList()) ))
dbcloseall()
return .t.
/*****************************************************************************/
FUNCTION CONNECT(cDatabase)
cConnString := 'pgs=128.1.1.251;uid=postgres;dtb=filial012;pwd=postgres'
nDetected := DetectDBFromDSN(cConnString)
if nDetected > SYSTEMID_UNKNOW
**@ 24,00 say 'Conectando a ' + cConnString + '...'
nCnn := SR_AddConnection(nDetected,cConnString)
end
*
* Retorna "connection handle" ou -1 se falhar
if nCnn < 0
@ 24,00 say 'Erro de conexao !!! Veja "sqlerror.log" para detalhes...'
quit
end
**@ 24,00 say space(80)
return .t.
Observação estou utilizando o xHarbour comercial de novembro de 2009