azilves Posted March 18, 2004 Report Share Posted March 18, 2004 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 Quote Link to comment Share on other sites More sharing options...
azilves Posted March 18, 2004 Author Report Share Posted March 18, 2004 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 !!! Quote Link to comment Share on other sites More sharing options...
karinha Posted March 18, 2004 Report Share Posted March 18, 2004 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 Quote Link to comment Share on other sites More sharing options...
Eroni Posted March 18, 2004 Report Share Posted March 18, 2004 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 Quote Link to comment Share on other sites More sharing options...
mou321 Posted March 18, 2004 Report Share Posted March 18, 2004 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. Quote Link to comment Share on other sites More sharing options...
gsilve Posted March 18, 2004 Report Share Posted March 18, 2004 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 Quote Link to comment Share on other sites More sharing options...
mou321 Posted March 18, 2004 Report Share Posted March 18, 2004 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 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.