:-O
Olá, colegas,
Estou com um grande problema no meu DBF, ou no sistema mesmo.
Eu abro o DBF, pelo programa, em rede com USE REGISTRO SHARED NEW. Outros 4 usuários também acessam o sistema na rede. O sistema fica em um diretório de um servidor, e em cada terminal há o mapeamento desse diretório, formando uma unidade, e o sistema é aberto diretamente do servidor, por um ícone de atalho na área de trabalho. Coisa normal.
O que tem acontecido é que muitos campos tem sido gravado no DBF, mas, posteriormente, uns segundos, são apagados, sem mais nem menos.
Eu suspeito que os registros estão se sobrepondo a outros gravados anteriormente. Mas é só uma suspeita.
A minha rotina de inclusão está assim:
(...)
APPEND BLANK
RLOCK()
REPLACE MATRICULA WITH MATRI
REPLACE CRONDALFA WITH CRO
REPLACE SOBRENOME WITH SOBREN
REPLACE SEXO WITH SEX
REPLACE TELEFONE WITH TEL
REPLACE NOME WITH NOM
REPLACE DATA WITH DTOC(DATN)
REPLACE ENDERECO WITH END
REPLACE UF WITH U
REPLACE DATAHOJE WITH DTOC(DATE())
REPLACE PAI WITH PA
REPLACE MAE WITH MA
REPLACE OBSERV1 WITH OBS
REPLACE OBSERV2 WITH OBS2
DBUNLOCK()
DBCOMMIT()
(...)
Será que falta alguma coisa nessa rotina?
Como disse, os registros são gravados, mas depois apagam.
Obrigado.
dbf apagando registros
Moderador: Moderadores
-
Glauco Cruz Costa
- Usuário Nível 3

- Mensagens: 102
- Registrado em: 15 Dez 2005 22:02
- Localização: Brasília/DF
- Contato:
1 - Seu erro é desbloquear o registro e depois forçar a gravação.
dbunlock() e dbcommit().
Esse tipo de erro é muito comum.
Coloque dbcommit() e depois dbunlock(). Isso faz a gravação e depois libera o registro para outros usuários.
2 - Veja as funções do usuário para trabalhar com rede. O dbappend() já bloqueia o registro.
São aquelas funções que nós colocamos no sistema para controlar bloqueio de registro, arquivo e criar registro em branco.
Deve ter algo assim para baixar neste site.
Verifique.
Boa sorte.
dbunlock() e dbcommit().
Esse tipo de erro é muito comum.
Coloque dbcommit() e depois dbunlock(). Isso faz a gravação e depois libera o registro para outros usuários.
2 - Veja as funções do usuário para trabalhar com rede. O dbappend() já bloqueia o registro.
São aquelas funções que nós colocamos no sistema para controlar bloqueio de registro, arquivo e criar registro em branco.
Deve ter algo assim para baixar neste site.
Verifique.
Boa sorte.
- Augusto
- Usuário Nível 3

- Mensagens: 473
- Registrado em: 26 Ago 2003 17:50
- Localização: Maricá/RJ
- Contato:
Parceiro...
O que eu posso dizer é que para se gravar um novo registro (APPEND BLANK) o bloqueio tem de ser no aqrquivo com FLOCK(). O RLOCK() é utilizado para alteração e exclusão de registros. Quanto ao COMMIT antes ou depois do UNLOK em meus sistemas eu faço primeiro o UNLOCK e depois o COMMIT e nunca deu problema... Principalmente sumir registro.
O que eu posso dizer é que para se gravar um novo registro (APPEND BLANK) o bloqueio tem de ser no aqrquivo com FLOCK(). O RLOCK() é utilizado para alteração e exclusão de registros. Quanto ao COMMIT antes ou depois do UNLOK em meus sistemas eu faço primeiro o UNLOCK e depois o COMMIT e nunca deu problema... Principalmente sumir registro.
:xau Fui...
goulart@provsul.com.br
Faça da PROVSUL o seu Provedor de Serviços WEB
Visite: www.PROVSUL.com.br
goulart@provsul.com.br
Faça da PROVSUL o seu Provedor de Serviços WEB
Visite: www.PROVSUL.com.br
- alaminojunior
- Colaborador

- Mensagens: 1717
- Registrado em: 16 Dez 2005 21:26
- Localização: Ubatuba - SP
Meu caro, o que realmente está acontecendo é que o comando Append Blank está falhando ! Como ? Isso mesmo, está falhando.
Quando vc emite um comando Append Blank, ele retorna se falhou ou não(pode ser que no momento de uma inclusão, já tenha outro usuario, fazendo o mesmo ), daí cabe a voce implementar uma rotina para verificar esta falha, e entrar num loop até que o registro tenha sido liberado.
Só corrigindo nosso amigo Augusto, para incluir novos registros no DBF, a função RLock() funciona sim senhor.
A função Flock() trava o banco por inteiro, nesse caso só precisamos travar o registro em questão. É o mesmo que Set Exclusive On.
A função DbAppend() quando bem sucedida, cria um novo registro e já trava o mesmo para uso.
Quando vc emite um comando Append Blank, ele retorna se falhou ou não(pode ser que no momento de uma inclusão, já tenha outro usuario, fazendo o mesmo ), daí cabe a voce implementar uma rotina para verificar esta falha, e entrar num loop até que o registro tenha sido liberado.
Só corrigindo nosso amigo Augusto, para incluir novos registros no DBF, a função RLock() funciona sim senhor.
A função Flock() trava o banco por inteiro, nesse caso só precisamos travar o registro em questão. É o mesmo que Set Exclusive On.
A função DbAppend() quando bem sucedida, cria um novo registro e já trava o mesmo para uso.
- digitom
- Usuário Nível 2

- Mensagens: 93
- Registrado em: 06 Abr 2006 13:52
- Localização: Anápolis-Go
- Contato:
Alamino,
Interessante esta tua colocação dizendo que o append falha.
Isso já aconteceu comigo, e nunca havia pensado nesta hipotese "falha".
Bem, teria como você postar um exemplo de uma "rotina para verificar esta falha, e entrar num loop até que o registro tenha sido liberado"?
Ajudaria muitos colegas, (inclusive eu) para que este tipo de erro não volte a acontecer.
Interessante esta tua colocação dizendo que o append falha.
Isso já aconteceu comigo, e nunca havia pensado nesta hipotese "falha".
Bem, teria como você postar um exemplo de uma "rotina para verificar esta falha, e entrar num loop até que o registro tenha sido liberado"?
Ajudaria muitos colegas, (inclusive eu) para que este tipo de erro não volte a acontecer.
Fui 
Tenho um código que verifica se falha ou não. Espero ajudá-los. Na minha rede nunca deu problemas.
IF pa_choice = 1
*******************
* I N C L U S A O *
*******************
IF pa_indice <> NIL
*----- Dá mensagem "registro já existente" se encontrar registro
l_acha := NewFACHAREG (pa_dbf, pa_choice, pa_chave, pa_indice, pa_mensa)
IF l_acha
EXIT
ENDIF
ENDIF
*----- Inclusão - dá append blank e trava registro
l_lock := &pa_dbf->( ADIREG(5) )
IF ! l_lock
DO WHILE .t.
l_lock := &pa_dbf->( ADIREG(10) )
IF l_lock
EXIT
ENDIF
l_resp := NEWALERT("O Registro atual não foi bloqueado pela rede " +;
"para poder ser inserido no arquivo " + RTRIM(pa_dbf) + ".DBF. " +;
"Tente bloquear novamente ou se Retornar os dados serão perdidos...",;
{ 'Tentar Bloquear' , ' Retornar ', 'Senha-Prg' } )
IF l_resp = 01
LOOP
ELSE
IF l_resp = 02 .OR. LASTKEY() = K_ESC
RETURN(.f.)
ELSE
NEWMENSA(' Entre com a Senha de Rede-Dig ou <ENTER> para Sair : ')
@ 13,22 SAY "SENHA .......: "
l_senha := DIG_SEN(13,37,0)
IF l_senha != <colocar uma senha>
LOOP
ENDIF
EXIT
ENDIF
ENDIF
ENDDO
ENDIF
function adireg
*************************************************************
* objetivo..: retorna verdadeiro se o registro foi "apendado" (adicionado
* no arquivo.
* o novo registro passa a ser o registro atual e travado.
* parametros: 1.numerico - tempo de espera em segundos (0 = sempre)
*************************************************************
parameters tempo
private sempre
go bottom
append blank
if .not. neterr() .and. lock()
return (.t.)
endif
sempre = (tempo = 0)
* efetua tentativas para adicionar o registro durante um determinado tempo
* enviando atraves do parametro tempo, ou indefinidamente caso
tempo=0.
do while (sempre .or. tempo>0)
go bottom
append blank
if .not. neterr() .and. lock()
return(.t.)
endif
tempo = tempo - 1
enddo
return (.f.) && nao travado, registro nao restrito
** fim - adireg()
IF pa_choice = 1
*******************
* I N C L U S A O *
*******************
IF pa_indice <> NIL
*----- Dá mensagem "registro já existente" se encontrar registro
l_acha := NewFACHAREG (pa_dbf, pa_choice, pa_chave, pa_indice, pa_mensa)
IF l_acha
EXIT
ENDIF
ENDIF
*----- Inclusão - dá append blank e trava registro
l_lock := &pa_dbf->( ADIREG(5) )
IF ! l_lock
DO WHILE .t.
l_lock := &pa_dbf->( ADIREG(10) )
IF l_lock
EXIT
ENDIF
l_resp := NEWALERT("O Registro atual não foi bloqueado pela rede " +;
"para poder ser inserido no arquivo " + RTRIM(pa_dbf) + ".DBF. " +;
"Tente bloquear novamente ou se Retornar os dados serão perdidos...",;
{ 'Tentar Bloquear' , ' Retornar ', 'Senha-Prg' } )
IF l_resp = 01
LOOP
ELSE
IF l_resp = 02 .OR. LASTKEY() = K_ESC
RETURN(.f.)
ELSE
NEWMENSA(' Entre com a Senha de Rede-Dig ou <ENTER> para Sair : ')
@ 13,22 SAY "SENHA .......: "
l_senha := DIG_SEN(13,37,0)
IF l_senha != <colocar uma senha>
LOOP
ENDIF
EXIT
ENDIF
ENDIF
ENDDO
ENDIF
function adireg
*************************************************************
* objetivo..: retorna verdadeiro se o registro foi "apendado" (adicionado
* no arquivo.
* o novo registro passa a ser o registro atual e travado.
* parametros: 1.numerico - tempo de espera em segundos (0 = sempre)
*************************************************************
parameters tempo
private sempre
go bottom
append blank
if .not. neterr() .and. lock()
return (.t.)
endif
sempre = (tempo = 0)
* efetua tentativas para adicionar o registro durante um determinado tempo
* enviando atraves do parametro tempo, ou indefinidamente caso
tempo=0.
do while (sempre .or. tempo>0)
go bottom
append blank
if .not. neterr() .and. lock()
return(.t.)
endif
tempo = tempo - 1
enddo
return (.f.) && nao travado, registro nao restrito
** fim - adireg()
- acelconsultoria
- Usuário Nível 3

- Mensagens: 231
- Registrado em: 10 Jan 2006 17:05
- Localização: Itápolis-SP
E aí, galera, blz ?
Bom, eu uso uma rotina para fazer o Append no registro em rede... vou postar aqui, quem sabe ela pode ser útil para resolver o problema de falha do Append.
FUNCTION MAIN
PRIVATE CODIGO, NOME, ENDERECO, CIDADE, ESTADO, CEP
USE CLIENTES
M->CODIGO := 1
M->NOME := "JOAO DA SILVA"
M->ENDERECO := "R. RODRIGUES ALVES, 333"
M->CIDADE := "BAURU"
M->ESTADO := "SP"
M->CEP := "14.900-000"
DO WHILE !ADREG(5) ; ENDDO // loop para realizar o Append Blank, usando a funcao ADREG()
REPLACE CODIGO WITH M->CODIGO
REPLACE NOME WITH M->NOME
REPLACE ENDERECO WITH M->ENDERECO
REPLACE CIDADE WITH M->CIDADE
REPLACE ESTADO WITH M->ESTADO
REPLACE CEP WITH M->CEP
DBCOMMIT()
UNLOCK
RETURN
FUNCTION ADREG( TEMPO )
PRIVATE SEMPRE
APPEND BLANK
IF !NETERR()
RETURN .T.
ENDIF
SAVE SCREEN
MENSAGEM( "Aguarde tentativa de acesso ao arquivo" )
SEMPRE := ( TEMPO = 0 )
WHILE ( SEMPRE .OR. TEMPO > 0 ) // loop aguardando a liberacao de outro usuario para fazer o append.
APPEND BLANK
IF !NETERR()
RESTORE SCREEN
RETURN .T.
ENDIF
IF INKEY( 0.5 ) = T_ESC
EXIT
ENDIF
TEMPO -= 0.5
ENDDO
BEEP2() // funcao que emite um som em caso de erro
MENSAGEM("NÆo foi poss¡vel adicionar registro!",2)
RESTORE SCREEN
RETURN .F.
Espero poder colaborar com o assunto em questão postando aqui a minha idéia.
Abraços.
Bom, eu uso uma rotina para fazer o Append no registro em rede... vou postar aqui, quem sabe ela pode ser útil para resolver o problema de falha do Append.
FUNCTION MAIN
PRIVATE CODIGO, NOME, ENDERECO, CIDADE, ESTADO, CEP
USE CLIENTES
M->CODIGO := 1
M->NOME := "JOAO DA SILVA"
M->ENDERECO := "R. RODRIGUES ALVES, 333"
M->CIDADE := "BAURU"
M->ESTADO := "SP"
M->CEP := "14.900-000"
DO WHILE !ADREG(5) ; ENDDO // loop para realizar o Append Blank, usando a funcao ADREG()
REPLACE CODIGO WITH M->CODIGO
REPLACE NOME WITH M->NOME
REPLACE ENDERECO WITH M->ENDERECO
REPLACE CIDADE WITH M->CIDADE
REPLACE ESTADO WITH M->ESTADO
REPLACE CEP WITH M->CEP
DBCOMMIT()
UNLOCK
RETURN
FUNCTION ADREG( TEMPO )
PRIVATE SEMPRE
APPEND BLANK
IF !NETERR()
RETURN .T.
ENDIF
SAVE SCREEN
MENSAGEM( "Aguarde tentativa de acesso ao arquivo" )
SEMPRE := ( TEMPO = 0 )
WHILE ( SEMPRE .OR. TEMPO > 0 ) // loop aguardando a liberacao de outro usuario para fazer o append.
APPEND BLANK
IF !NETERR()
RESTORE SCREEN
RETURN .T.
ENDIF
IF INKEY( 0.5 ) = T_ESC
EXIT
ENDIF
TEMPO -= 0.5
ENDDO
BEEP2() // funcao que emite um som em caso de erro
MENSAGEM("NÆo foi poss¡vel adicionar registro!",2)
RESTORE SCREEN
RETURN .F.
Espero poder colaborar com o assunto em questão postando aqui a minha idéia.
Abraços.
Adm. Maickon Sato
Consultoria e Projetos
-------------------------------------------------------
Consultoria e Projetos
-------------------------------------------------------
- alaminojunior
- Colaborador

- Mensagens: 1717
- Registrado em: 16 Dez 2005 21:26
- Localização: Ubatuba - SP
Pessoalmente uso uma rotina muito simples:
do while .t.
dbappend()
if neterr()
loop
else
exit
endif
enddo
repl ....
repl ...
unlock
porém neste caso, se outro usuario travou o registro antes de vc e saiu para tomar um café, essa rotina entrará num loop até que o outro usuario volte e destrave o registro ! A solução então é definir um numero de vezes que o sistema tentará dar o append. Caso falhar as N vezes, ele aborta emitindo um aviso.
Certo ?
Qualquer dúvida .... já sabe né....
Abraços
do while .t.
dbappend()
if neterr()
loop
else
exit
endif
enddo
repl ....
repl ...
unlock
porém neste caso, se outro usuario travou o registro antes de vc e saiu para tomar um café, essa rotina entrará num loop até que o outro usuario volte e destrave o registro ! A solução então é definir um numero de vezes que o sistema tentará dar o append. Caso falhar as N vezes, ele aborta emitindo um aviso.
Certo ?
Qualquer dúvida .... já sabe né....
Abraços