Bloqueando grupo de registros
Moderador: Moderadores
Bloqueando grupo de registros
Tenho em determinado momento que bloquear vários registros de um mesmo dbf numa mesma operação. Verifiquei que quando uso mais de um lock() para o mesmo dbf apenas o ultimo fica bloqueado.
No clipper (52e) verifiquei que somente funciona varios registros bloqueados na mesma operação quando são de dbfs diferentes. Existe tb um limite para o número de bloqueios de regs em dbfs diferentes ?
Obrigado pela atenção.
No clipper (52e) verifiquei que somente funciona varios registros bloqueados na mesma operação quando são de dbfs diferentes. Existe tb um limite para o número de bloqueios de regs em dbfs diferentes ?
Obrigado pela atenção.
Vc só pode bloquear um registro ou o arquivo todo.
Vc pode bloquear um registro para cada arquivo da sua aplicação. Quando vc bloqueia um segundo registro, o primeiro registro bloqueado é desbloqueado.
Vale lembrar que o bloquei de registro permite ler o mesmo, não permitindo a alteração por outra estação/aplicação.
O bloqueio de arquivo não vai permitir abrir o mesmo compartilhado em outra estação/aplicação.
Eu não testei, mas talvez vc possa abrir um arquivo exclusivo, em outra aplicação como somente de leitura.
Vc pode bloquear um registro para cada arquivo da sua aplicação. Quando vc bloqueia um segundo registro, o primeiro registro bloqueado é desbloqueado.
Vale lembrar que o bloquei de registro permite ler o mesmo, não permitindo a alteração por outra estação/aplicação.
O bloqueio de arquivo não vai permitir abrir o mesmo compartilhado em outra estação/aplicação.
Eu não testei, mas talvez vc possa abrir um arquivo exclusivo, em outra aplicação como somente de leitura.
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
{POG - Programação Orientada a Gambiarra}
- vagucs
- Membro Master

- Mensagens: 1480
- Registrado em: 10 Jul 2004 10:45
- Localização: Ipanema - MG
- Contato:
vc so tem as duas opções acima
Travar um registro ou o arquivo Todo. Como vc quer travar mais de um registro so mesmo travando o arquivo todo para isto, ou vc pode tambem, abrir o mesmo arquivo em areas de trabalho diferentes, assim cada uma area teria um handle diferente e na logica vc conseguiria travar mais de um registro, apesar de estar em areas diferentes, nao acho uma boa aplicação, fazer isto assim.
Travar um registro ou o arquivo Todo. Como vc quer travar mais de um registro so mesmo travando o arquivo todo para isto, ou vc pode tambem, abrir o mesmo arquivo em areas de trabalho diferentes, assim cada uma area teria um handle diferente e na logica vc conseguiria travar mais de um registro, apesar de estar em areas diferentes, nao acho uma boa aplicação, fazer isto assim.
Eliane,
Não sei se vai te ajudar, mas a partir da versão 5.2 tem as funções para bloqueio de multiplos registros.
Eu particularmente nunca utilizei esses comandos.
DBRLOCK( numero de registro)
caso não seja fornecido o numero de registro, os registros anteriormente travados são liberados e o reg corrente será travado, porem se fornecermos o numero do regristro, esse será adicionado a lista de reg travados e os demais registros que estejam travados, não serão liberados. A partir dessa função é possivel travar multiplos ao mesmo tempo no mesmo arquivo de dados.
DBRUNLOCK (numero do registro)
se não for fornecido numero de registro serão liberado todos.
DBRLOCKLIST()
retorna a lista de reg travados de um arquivo em uso.
Tem exemplos no livro CLIPPER 5.2 EM REDE de GORKI STARLIN.
Se for isso mesmo que voce quer, posso mandar uns exemplos que tem no livro.
Um abraço
Poka
Não sei se vai te ajudar, mas a partir da versão 5.2 tem as funções para bloqueio de multiplos registros.
Eu particularmente nunca utilizei esses comandos.
DBRLOCK( numero de registro)
caso não seja fornecido o numero de registro, os registros anteriormente travados são liberados e o reg corrente será travado, porem se fornecermos o numero do regristro, esse será adicionado a lista de reg travados e os demais registros que estejam travados, não serão liberados. A partir dessa função é possivel travar multiplos ao mesmo tempo no mesmo arquivo de dados.
DBRUNLOCK (numero do registro)
se não for fornecido numero de registro serão liberado todos.
DBRLOCKLIST()
retorna a lista de reg travados de um arquivo em uso.
Tem exemplos no livro CLIPPER 5.2 EM REDE de GORKI STARLIN.
Se for isso mesmo que voce quer, posso mandar uns exemplos que tem no livro.
Um abraço
Poka
-
Stanis Luksys
- Colaborador

- Mensagens: 1329
- Registrado em: 18 Jun 2005 03:04
- Localização: São Paulo
- Contato:
Olá Poka,
Estes exemplos que você tem... poderia mandar pra mim? Nunca usei isso de travar multiplos registros no mesmo DBF ao mesmo tempo. Ja deu pra sacar pelo seu exemplo aqui, mas queria dar uma olhada nesses códigos... hehe... o Clipper ainda me surpreende...
Se puder:
stanis.luksys@gmail.com
Valeuzão!
Estes exemplos que você tem... poderia mandar pra mim? Nunca usei isso de travar multiplos registros no mesmo DBF ao mesmo tempo. Ja deu pra sacar pelo seu exemplo aqui, mas queria dar uma olhada nesses códigos... hehe... o Clipper ainda me surpreende...
Se puder:
stanis.luksys@gmail.com
Valeuzão!
Stanis Luksys
sites.google.com/hblibs
Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
sites.google.com/hblibs
Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
Obrigado a todos pela atenção. Recebi um exemplo, mas ainda não testei. Poka, seria parecido com isto ?
Examples
This example shows two different methods for locking multiple
records:
Examples
This example shows two different methods for locking multiple
records:
Código: Selecionar todos
Examples
This example shows two different methods for locking multiple
records:
---------------------------------------------
FUNCTION dbRLockRange( nLo, nHi )
---------------------------------------------
LOCAL nRec
FOR nRec := nLo TO nHi
IF ! DBRLOCK( nRec )
DBRUNLOCK() // Failed - unlock everything
ENDIF
NEXT
RETURN DBRLOCKLIST() // Return array of actual locks
-----------------------------------------
FUNCTION dbRLockArray( aList )
----------------------------------------
LOCAL nElement, nLen, lRet
lRet := .T.
nLen := LEN( aList )
FOR nElement := 1 TO nLen
IF ! DBRLOCK( aList[ nElement ] )
DBRUNLOCK() // Failed - unlock everything
lRet := .F.
ENDIF
NEXT
RETURN DBRLOCKLIST()
Segue exatamente como está no livro.
Dbrlock(<numero do registro>)
Esta função foi incrementada a partir da versão 5.2 do Clipper e até certo ponto é similar a funão RLOCK(), porem DBRLOCK() permite que seja travado o registro corrente ou um outro registro qualquer no arquivo de dados aberto. Em <numero do registro> em arquivo DBF devemos especificar o numero do registro que desejamos travar. Caso não seja fornecido o numero do registro, os registros anteriormente travados serão liberados, e o registro corrente será travado, porém se fornecermos o <numero do registro>, este será travado e a adicionado á lista de registros travados e os demais registros que estejam travados, não são liberados.
A partir dessa função é possível conseguir o travamento sobre múltiplos registros ao mesmo tempo no arquivo de dados em uso.
Esta função quando executada, retorna .T., isto é , verdadeiro, caso o registro foi travado com sucesso, e .F. , caso o registro não tenha sido travado, normalmente, porque este já tenha sido travado de alguma forma por outra estação.
O exemplo a seguir demonstra uma função do usuário que trava uma faixa se registro no mesmo arquivo de dados.
Use folha new
If .not. travafixa( 10,30)
? “ registros não disponiveis”
retu
endif
go 10
do while recno() <= 30 // processa os registros travados
repla folha->salário with folha->salário * 1.2
folha->(dbskip())
enddo
///////////////////
function travafixa (ninicio, nfim)
local I, lresultado:=.t., nfim, ninicio
for i:= ninicio to nfim
if .not., dbrlock(I)
dbrunlock() // libera os travados
lresultado :=.f.
exit
endif
next
retu (lresultado)
//////////////////
DBRUNLOCK( <numero do registro > )
Liberar todos ou um registro especifico.
Esta função é uma das novidades da versão 5.2 do CA Clipper onde a partir desta é possível liberar todos ou apenas um registro que esteja travado sobre um mesmo arquivo de dados. Com a função DBRLOCK() é possível travar + de um registro ao mesmo tempo no mesmo arquivo de dados. Para liberar todos os registros podemos ativar DBRUNLOCK , mas se desejarmos liberar apenas um único registro do arquivo de dados da lista do registros travados de um arquivo de dados, basta fornecer o <numero do registro> que deve ser destravado.
A seguir são travados 3 registros e depois é liberado apenas um destes.
Local nreg, lresultado:= .t.
Use vendas new index inome
Dbseek(“JOAO”)
If DBRLOCK( RECNO())
? “registro travado”
skip
if DBRLOCK( RECNO())
? “registro travado”
skip
if DBRLOCK( RECNO())
? “ registro travado”
else
? “registro nao disponivel”
UNLOCK() // libera os travamentos
Lresultado:= .f.
Endif
Else
? “registro não disponível”
unlock()
lresultado:=.f.
endif
else
? “ registro nao disponivel”
unlock()
lresultado:=.f.
endif
if lresultado
nreg:=recno() // obtem o numero atual do ponteiro de registro
DBRUNLOCK( nreg) // libera somente o ultimo registro
Endif
///////////////////////
LISTA DE REGISTROS TRAVADOS
DBRLOCKLIST()
Retorna a lista de travamento de registros de um arquivo de dados.
Ela retorna um vetor (array) de uma dimensao, onde consta a lista dos registros que estão atualmente travados sobre o arquivo de dados selecionado para uso. A partir dessa lista é possível saber se um registro do arquivo de dados passa pela nossa estação de trabalho.
A seguir é montada uma função que ao ser chamada, lista a relação de registros travados sobre os arquivos de dados em uso.
Function listarlock()
Local avetrec, I
Avetrec:= DBRLOCKLIST() // cria o vetor com a lista de registros travados
For i:= 1 to len( avetrec)
? avetrec (i)
next
retu nil
Exemplo tirado do livro CLIPPER 5.2 EM REDE de GORKI STARLIN 2ª edição.
Poka
Dbrlock(<numero do registro>)
Esta função foi incrementada a partir da versão 5.2 do Clipper e até certo ponto é similar a funão RLOCK(), porem DBRLOCK() permite que seja travado o registro corrente ou um outro registro qualquer no arquivo de dados aberto. Em <numero do registro> em arquivo DBF devemos especificar o numero do registro que desejamos travar. Caso não seja fornecido o numero do registro, os registros anteriormente travados serão liberados, e o registro corrente será travado, porém se fornecermos o <numero do registro>, este será travado e a adicionado á lista de registros travados e os demais registros que estejam travados, não são liberados.
A partir dessa função é possível conseguir o travamento sobre múltiplos registros ao mesmo tempo no arquivo de dados em uso.
Esta função quando executada, retorna .T., isto é , verdadeiro, caso o registro foi travado com sucesso, e .F. , caso o registro não tenha sido travado, normalmente, porque este já tenha sido travado de alguma forma por outra estação.
O exemplo a seguir demonstra uma função do usuário que trava uma faixa se registro no mesmo arquivo de dados.
Use folha new
If .not. travafixa( 10,30)
? “ registros não disponiveis”
retu
endif
go 10
do while recno() <= 30 // processa os registros travados
repla folha->salário with folha->salário * 1.2
folha->(dbskip())
enddo
///////////////////
function travafixa (ninicio, nfim)
local I, lresultado:=.t., nfim, ninicio
for i:= ninicio to nfim
if .not., dbrlock(I)
dbrunlock() // libera os travados
lresultado :=.f.
exit
endif
next
retu (lresultado)
//////////////////
DBRUNLOCK( <numero do registro > )
Liberar todos ou um registro especifico.
Esta função é uma das novidades da versão 5.2 do CA Clipper onde a partir desta é possível liberar todos ou apenas um registro que esteja travado sobre um mesmo arquivo de dados. Com a função DBRLOCK() é possível travar + de um registro ao mesmo tempo no mesmo arquivo de dados. Para liberar todos os registros podemos ativar DBRUNLOCK , mas se desejarmos liberar apenas um único registro do arquivo de dados da lista do registros travados de um arquivo de dados, basta fornecer o <numero do registro> que deve ser destravado.
A seguir são travados 3 registros e depois é liberado apenas um destes.
Local nreg, lresultado:= .t.
Use vendas new index inome
Dbseek(“JOAO”)
If DBRLOCK( RECNO())
? “registro travado”
skip
if DBRLOCK( RECNO())
? “registro travado”
skip
if DBRLOCK( RECNO())
? “ registro travado”
else
? “registro nao disponivel”
UNLOCK() // libera os travamentos
Lresultado:= .f.
Endif
Else
? “registro não disponível”
unlock()
lresultado:=.f.
endif
else
? “ registro nao disponivel”
unlock()
lresultado:=.f.
endif
if lresultado
nreg:=recno() // obtem o numero atual do ponteiro de registro
DBRUNLOCK( nreg) // libera somente o ultimo registro
Endif
///////////////////////
LISTA DE REGISTROS TRAVADOS
DBRLOCKLIST()
Retorna a lista de travamento de registros de um arquivo de dados.
Ela retorna um vetor (array) de uma dimensao, onde consta a lista dos registros que estão atualmente travados sobre o arquivo de dados selecionado para uso. A partir dessa lista é possível saber se um registro do arquivo de dados passa pela nossa estação de trabalho.
A seguir é montada uma função que ao ser chamada, lista a relação de registros travados sobre os arquivos de dados em uso.
Function listarlock()
Local avetrec, I
Avetrec:= DBRLOCKLIST() // cria o vetor com a lista de registros travados
For i:= 1 to len( avetrec)
? avetrec (i)
next
retu nil
Exemplo tirado do livro CLIPPER 5.2 EM REDE de GORKI STARLIN 2ª edição.
Poka

