ok...pessoal.
Enviado: 20 Mai 2007 08:40
obrigado a todos pela ajuda.
vou verificar essas opções.
ROBSON
vou verificar essas opções.
ROBSON
Em homenagem a Paulo Cesar Toledo
https://pctoledo.org/
Código: Selecionar todos
DO WHILE .T.
DESC = SPACE(45)
MARC = SPACE(10)
APLI = SPACE(100)
@ 02,03 say 'Descrição:' GET DESC
@ 03,03 say 'Marca: ' GET MARC
@ 04,03 say 'Aplicação:' GET APLI
READ
IF LASTKEY()=27
EXIT
ENDIF
CONFSN()
IF CONF='S'
DO WHILE FLOCK() //Ou qqr função que substitua
LOOP
ENDDO
FLOCK()
APPEND BLANK
REPLACE A_DESC WITH DESC, A_MARC WITH MARC, A_APLI WITH APLI
COMMIT
UNLOCK
ELSE
LOOP
ENDIF
ENDDOAugusto escreveu:Volto a dizer que o travamento deve ser feito no ARQUIVO
Mas bloquear um registro já bloqueado não representa falha quando o bloqueio inicial foi feito pela mesma instância. Faça o teste. Abra um banco, execute um append e bloqueie o mesmo registro novamente (e outras tantas vezes, se quiser). Você vai reparar que seus RLock() retornarão sempre TRUE. E nem poderia ser diferente. A instância é a mesma. Um bloqueio extra não sobreporá o antigo, mas será ignorado pelo sistema operacional.MARCELOG escreveu:A sua rotina está tentando bloquear um registro qye já está bloqueado, por isso tá falhando.
Código: Selecionar todos
CONFSN()
IF CONF='S'
APPEND BLANK
IF !NetErr()
REPLACE A_DESC WITH DESC,;
A_MARC WITH MARC,;
A_APLI WITH APLI
dbUnLock()
ENDIF
ENDIF
Código: Selecionar todos
CONFSN()
IF CONF='S'
APPEND BLANK
IF !NetErr()
REPLACE A_DESC WITH DESC,;
A_MARC WITH MARC,;
A_APLI WITH APLI
dbcommit() // <------------------
dbUnLock()
ENDIF
ENDIF
Poxa! Agora que vi. Eu estava me referindo ao FLock() quando na verdade eu deveria me referir ao RLock(). Eu nunca travo registro desse jeito e acabei me distraindo. E eu nunca travo arquivo nem nunca uso o modo exclusivo.Eolo escreveu:Ainda, só pra deixar mais claro: o FLOCK() não "bloqueia totalmente" o arquivo na rede.
Estamos ficando velhos.Eolo escreveu:Putz, e eu nem tinha reparado tb!
Aqui há dois detalhes relevantes em rede:scom escreveu:IF CONF='S'
APPEND BLANK
IF REG_LOCK() // FUNÇÃO PARA TRAVAR O REGISTRO
Código: Selecionar todos
IF LASTKEY()<>27
IF PERGUNTA("Confirma inclusão ?")="S"
SELE 1 // Eu utilizaria isto para garantir que está na área correta
APPEND BLANK
IF !NetErr()
REPLACE A_DESC WITH DESC
REPLACE A_MARC WITH MARC
REPLACE A_APLI WITH APLI
DBCommit() // E o uso do COMMIT indicado pelo Eolo, é bom
Unlock
ENDIF
ENDIF
ENDIFMas seria bom Maligno, que você faça uma ressalva abaixo (digamos colocando um asterisco) em cada RLOCK() que você REDITOU. Pois daqui algum tempo, fica meio confusso o entendimento no seu conteúdo total, ora porque você adicionou uma nova mensagem dizendo:Editado pela última vez por Maligno em 20 Maio 2007 23:23; num total de 1 vez
Evidentemente que após a sua RE-EDIÇÃO todos os FLOCK() SUMIRAM (embora do Eolo, ainda não)... hehe Ou então APAGAR essa sua ultimas mensagens que você acusa o erro cometido...(e deixar as mensagens como se não tivesse ocorrido erro algum) Sei lá... só sei que eu ví tanta confusão e decidí RE-COMPILAR todas as observações dos colegas... mas agora que vejo que foi corrigida... que confusão !! hehe, isto as vezes acontece.Poxa! Agora que vi. Eu estava me referindo ao FLock() quando na verdade eu deveria me referir ao RLock().

Código: Selecionar todos
SELE 1
USE CLIENTES SHARED
APPEND BLANK
? RLOCK()Se alguém ler atenciosamente a seqüência de mensagens e ainda assim não perceber que houve um engano da minha parte (com a necessária correção), sinto muito. Vai ficar sem entender. E não tenho dó nenhuma.Pablo César escreveu:Mas seria bom Maligno, que você faça uma ressalva abaixo (digamos colocando um asterisco) em cada RLOCK() que você REDITOU. Pois daqui algum tempo, fica meio confusso o entendimento no seu conteúdo total, ora porque você adicionou uma nova mensagem
Um RLock() extra não retornará FALSE se o registro já estiver travado pela mesma instância em que ele é utilizado. Faça o teste.MARCELOG escreveu:E o rlock() falhará se o registro já estiver bloqueado, retornando .F. (veja documentação).
Ainda acho que o problema dos registro em branco tem origem em outra situação.Por isso ele está tendo registros em branco no arquivo.
Como eu disse: faça o teste. Crie um programa que abre um arquivo qualquer. Faça um append blank e em seguida execute RLock() 20 vezes. Nas 20 vezes RLock() retornará TRUE.O append blank cria o registro em branco e trava, mas os "replace"s, por conta da impossibilidade de travamento do registro (que já está bloqueado/ travado) não acontece.
Pablo,Mas a utilização do FLOCK() para inclusão de registros... não o vejo com bons olhos... em rede ?... ummmm