Jump to content
Fivewin Brasil

RLOCK MALUCO....ME AJUDEM...POR FAVOR.


azilves

Recommended Posts

Salve a todos

Gente estou com um problema gravissimo com travamento de registro. Eu tinha uma versao em FW 1.9.1 que funcionava perfeitamente, so que agora, eu fiz algumas alterações e passei para FWH, aí veio o meu problema, estou desde o sábado com um problema de duplicação de número de pedido e notas fiscais. Escrevo abaixo a minha rotina de numeração. Eu utiliso um arquivo com um único registro e cada campo é um contador e os programas vem até ele, trava o registro, pega o número do prõximo pedido por exemplo e soma um para o próximo que quiser pegar o n~umero e destrava o registro. Pois bem, eu coloquei esta lógica em um programa e compilei em Harbour, mesmo em DOS e rodei em duas janelas, a primeira, abre o arquivo, trava o registro e abre o get para alterar o campo, já na segunda janela a mensagem de travamento de registro aparece. Até aí tudo ok. Só que, quando eu altero o conteúdo do campo na primeira janela e libero o registro, o valor do campo que aparece na segunda janela, não é o alterado na primeira janela, mas sim o anterior. Imaginem isso em um servidor com mais de 40 estações vendendo e numerando seus pedidos ao mesmo tempo. Este é o Inferno que me encontro no momento.

Agradeço a todos a atenção, se alguém ja passou por isso antes me ajude por favor.

Abraço a todos

Alexandre Zilves

Link to comment
Share on other sites

Desculpe, segue a listagem do programa que escrevi.

function main()

clear

set dele on

set excl off

sele 0

use arquivo

do while !rlock()

@ 10,10 say "Registro em uso - Aguarde"

enddo

@ 10,10 say " "

@ 10,10 get numero

read

close data

return(nil)

* Para Compilar em Clipper, retire a primeira e a última linha.

O Problema só aparece no Harbour, pois o Clipper funciona perfeitamente bem.

Êta Clipperzinho Bão sô, veinho mas ainda dando aula !!!

Link to comment
Share on other sites

Function Main()

Clear

Set dele on

Set excl off

Sele 0

//use arquivo //????

USE Arquivo ALIAS Alzives EXCLUSIVE NEW

Go Top // DbGoTop()

Do While !rLock() .And. !Eof()

If Eof()

Exit

Endif

@ 08,10 say "Registro em uso - Aguarde"

@ 10,10 say "Este e o Registro " + RecNo()

@ 12,10 get numero

Read

// Se Condicao Para gravacao... Invente a sua...

If !Eof() // Registro mostrado no Get Numero

Replace Variavel with Numero

Alzives:Commit()

Endif

DbSkip()

Enddo

//close data

DbCloseAll()

Return Nil

João Santos

São Paulo-Brasil

(11) 3106-2832 a Noite

karinhannah@ubbi.com.br

Link to comment
Share on other sites

Alexandre, não sei se posso te ajudar, mas passei exatamente pelo mesmo problema, só que eram 20 estações e usava o indice CDX.

Resumindo...

Não teve jeito de corrigir o problema usando o FWH, quando uma estação gravava o registro, a outra demorava uma decada para saber que o registro foi gravado, atualizei o harbour varias vezes para novas versões e uso o FWH 2.4. O curioso é que antes de converter para Windows funcionava a mil maravilhas.

Adotei a solução de voltar a utilizar os indices NTX. Surpreendentemente, sem mais nada feito, tudo funcionou como antes, muito bem e sem falhas, já faz bastante tempo que não tenho problemas, quando uma estação grava, bloqueia o registro e quando libera o registro a outra imediatamente sabe que foi gravado e grava novo numero, está funcionando muito bem.

Qual o indice que você utiliza?

Eroni

Link to comment
Share on other sites

Caro Amigo.

Eu Acho que o seu problema ja aconteceu comigo o que deve estar ocorrendo e o seguinte no caso de sua primeira janela assim que ela chega no comando //close data//

Ordem interna do close data:

1) libera os reg travados

2) libera os buffers p/ gravacao

3) abandona o ponteiro do arquivo e fecha.

quando ele libera os registros travados a segunda janela logo saira do loop de travado e fara a a leitura do registro antes que o (close data) da primeira janela tenha tempo de atualizar o campo logo fara a leitura antes da atualizacao no disco.

No FW 1.91 nao devia ocorrer isso porque as rotinas de acesso ao disco eram do clipper para 16 bits logo elas nao utilizam o acesso 32 bits do windows e o FWH ja deve utilizar.

Siga o exemplo do joao , utilize o comando Commit isso forcara a gravacao antes de liberar o registro bloqueado.

Eu tambem sempre utilizo o UNLOCK

Mauricio (RJ)

Mauricio.

Link to comment
Share on other sites

Ola Azilves,

Li na lista do Xhb algo parecido, nunca tive problemas com isto, pois eu forço com dbcommit(), para poder evitar este problema. Creio que ainda o CDX do xHB esteja com problemas. Tente assim, ou como o Karinh passou ou o Mou321... e nos avise se funcionou...

*/

Local vPedido:=0, Tentativa:=1

Use Arquivo New Shared

Do While !RLOCK()

IF Tentativa > 10

QUIT

Else

ALERT("Aguarde...; Arquivo em uso...")

inkey(3)

Tentativa++

Endif

Enddo

vPedido:=Npedido++

Replace ARQUIVO->Npedido with vPedido

DBCOMMIT()

DBUNLOCK()

*/

Gilberto Silverio

Link to comment
Share on other sites

Caro Amigo:

So Para vc ter uma ideia andei fazendo uns testes de indexacao e descobri algo muito interessante:

Arquivo com 75000 registros

Clipper - dos -> 3m 5s

fivewin - win98 - > 3m 52s

harbour - win98 -> 4m 25s

harbour - winxp -> 4m 58s

e olha que o ruwindows utiliza cache de disco em:

Um Abraço:

Mauricio

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...