Erro ao gravar registro novo - dbappend()
Moderador: Moderadores
Erro ao gravar registro novo - dbappend()
Olá Pessoal,
Tenho um sistema, em clipper ainda, rodando há mais de 20 anos, já estou trabalhando para migrar para harbour, mas estou com um problema muito sério, seguinte:
O servidor está com windows server 2012, os terminais, há 3 meses atrás, estavam com xp, agora estão com windows 7.
Quando estavam com xp, não ocorria esse problema, como disse, o sistema já funciona há mais de 20 anoas, depois que colocaram windows 7, estou tendo problema ao gravar registro novo num arquivo de pedidos, simplesmente passa pelo dbappend(), não gera registro novo, não trava o registro, dbrlock() ou rlock(), testei os dois achando que poderia ser um deles, e simplesmente não grava o registro, descobri o problema pque criei um arquivo auxiliar onde, caso não grava o registro, o sistema gera um arquivo de ocorrências, cheguei fazer um loop, checando a existencia do registro, não encontrando, tenta gravar novamente, fiz o loop com 6 tentativas, maioria deles, passam as 6 tentativas, não grava daí gero o arquivo de ocorrencias para identificar o usuario que o registro não foi gravado, achei que poderia ser algo no terminal, mas não, ocorre em qualquer um, no balcão tem 7 terminais.
Esse sistema está compilado no clipper 5.2e, linkeditado no blinker 7.0 e trabalhando com cdx.
Gostaria ai de uma opinião, ou quem sabe, alguém já passou por isso, me dar uma luz do que pode estar ocorrendo, por incrível que pareça, como disse, depois que colocaram windows 7 nas estações, ao invés de melhorar, que seria a lógica, passei a ter esse problema.
Desde já agradeço que puder dispor de suas atenções para me ajudar, até eu ter condição de migrar para harbour, daí acredito ser outro mundo.
Att.
Josadac
Tenho um sistema, em clipper ainda, rodando há mais de 20 anos, já estou trabalhando para migrar para harbour, mas estou com um problema muito sério, seguinte:
O servidor está com windows server 2012, os terminais, há 3 meses atrás, estavam com xp, agora estão com windows 7.
Quando estavam com xp, não ocorria esse problema, como disse, o sistema já funciona há mais de 20 anoas, depois que colocaram windows 7, estou tendo problema ao gravar registro novo num arquivo de pedidos, simplesmente passa pelo dbappend(), não gera registro novo, não trava o registro, dbrlock() ou rlock(), testei os dois achando que poderia ser um deles, e simplesmente não grava o registro, descobri o problema pque criei um arquivo auxiliar onde, caso não grava o registro, o sistema gera um arquivo de ocorrências, cheguei fazer um loop, checando a existencia do registro, não encontrando, tenta gravar novamente, fiz o loop com 6 tentativas, maioria deles, passam as 6 tentativas, não grava daí gero o arquivo de ocorrencias para identificar o usuario que o registro não foi gravado, achei que poderia ser algo no terminal, mas não, ocorre em qualquer um, no balcão tem 7 terminais.
Esse sistema está compilado no clipper 5.2e, linkeditado no blinker 7.0 e trabalhando com cdx.
Gostaria ai de uma opinião, ou quem sabe, alguém já passou por isso, me dar uma luz do que pode estar ocorrendo, por incrível que pareça, como disse, depois que colocaram windows 7 nas estações, ao invés de melhorar, que seria a lógica, passei a ter esse problema.
Desde já agradeço que puder dispor de suas atenções para me ajudar, até eu ter condição de migrar para harbour, daí acredito ser outro mundo.
Att.
Josadac
- Mario Mesquita
- Usuário Nível 4

- Mensagens: 613
- Registrado em: 08 Dez 2009 13:47
- Localização: Rio de Janeiro
Erro ao gravar registro novo - dbappend()
Olá.
Pra dar append na tabela, tem que estar travado com Flock(). Está assim no seu sistema?
Até onde sei, tudo isso funciona bem com Windows 7.
Sds.
Pra dar append na tabela, tem que estar travado com Flock(). Está assim no seu sistema?
Até onde sei, tudo isso funciona bem com Windows 7.
Sds.
Erro ao gravar registro novo - dbappend()
Olá Mário!
Flock() como sugeriu não seria para travar o arquivo ?
Como são vários terminais gravando pedido ao mesmo tempo, a vida toda travo apenas o registro após o append, da seguinte forma:
Flock() como sugeriu não seria para travar o arquivo ?
Como são vários terminais gravando pedido ao mesmo tempo, a vida toda travo apenas o registro após o append, da seguinte forma:
Código: Selecionar todos
(ALIAS)->(dbappend())
if (ALIAS)->(dbrlock())
replace ...
(ALIAS)->(dbcommit(),dbunlock())
else
Alert()
Endif- Itamar M. Lins Jr.
- Administrador

- Mensagens: 7928
- Registrado em: 30 Mai 2007 11:31
- Localização: Ilheus Bahia
- Curtiu: 1 vez
Erro ao gravar registro novo - dbappend()
Olá!
A mudança é mínima.
Saudações,
Itamar M. Lins Jr.
Se vc puder disponibilizar uma máquina ai com os fontes e uma base de dados velha com anydesk, eu posso ajudar a converter para Harbour 3.2 e LetoDBf. Vc fica olhando. Não tem mistério nenhum.já estou trabalhando para migrar para harbour,
A mudança é mínima.
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Itamar M. Lins Jr.
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Erro ao gravar registro novo - dbappend()
Notei uma diferença entre Clipper/Harbour, onde em Clipper eu usava ultimo+1 e tudo bem, mas no Harbour os erros foram mais frequentes.
Isso era no caso da numeração automática.
Talvez o Harbour seja "mais rápido" nessa parte, e a solução do Clipper não funcione.
Faz tempo que tratei de forma diferente isso, e agora nem uso mais.
Mas... cadê o teste se funcionou o dbAppend() ?
Esse é exemplo, ou o fonte tá assim mesmo?
Isso era no caso da numeração automática.
Talvez o Harbour seja "mais rápido" nessa parte, e a solução do Clipper não funcione.
Faz tempo que tratei de forma diferente isso, e agora nem uso mais.
Mas... cadê o teste se funcionou o dbAppend() ?
Esse é exemplo, ou o fonte tá assim mesmo?
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Erro ao gravar registro novo - dbappend()
Olá JoseQuintas!
No fonte está assim mesmo, gravo a venda em dois arquivos de dados, cabecalho e itens, estou tendo problema é no arquivo onde gravo o cabecalho, daí tenho que verificar, quando não grava a parte do cabecalho, o sistema tenta gravar novamente, quando atinge o numero de tentativas, informo ao usuário que a venda não foi gravada, muito estranho.
No fonte está assim mesmo, gravo a venda em dois arquivos de dados, cabecalho e itens, estou tendo problema é no arquivo onde gravo o cabecalho, daí tenho que verificar, quando não grava a parte do cabecalho, o sistema tenta gravar novamente, quando atinge o numero de tentativas, informo ao usuário que a venda não foi gravada, muito estranho.
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Erro ao gravar registro novo - dbappend()
Código: Selecionar todos
/*
ZE_REDE - ROTINAS PARA USO EM REDE
1995.04 José Quintas
*/
#include "inkey.ch"
FUNCTION RecLock( lForever )
LOCAL nCont := 1
hb_Default( @lForever, .T. )
wSave( MaxRow() - 1, 0, MaxRow(), MaxCol() )
DO WHILE .T.
IF rLock()
EXIT
ENDIF
Mensagem( "Aguardando liberação do registro em " + Alias() + "... Tentativa " + lTrim( Str( nCont ) ) + iif( lForever, "", ". ESC cancela" ) )
IF Inkey( 0.5 ) == K_ESC .AND. ! lForever
EXIT
ENDIF
nCont += 1
ENDDO
WRestore()
SKIP 0
RETURN ( rLock() )
FUNCTION RecAppend( lForever )
LOCAL nCont := 1, lOk := .F.
hb_Default( @lForever, .T. )
wSave( MaxRow()-1, 0, MaxRow(), MaxCol() )
DO WHILE .T.
APPEND BLANK
IF ! NetErr()
lOk := .T.
RecLock()
EXIT
ENDIF
Mensagem( "Aguardando liberação do arquivo: " + Alias() + "... Tentativa " + LTrim( Str( nCont ) ) + iif( lForever, "", ". ESC cancela" ) )
IF Inkey( 0.5 ) == K_ESC .AND. ! lForever
EXIT
ENDIF
nCont += 1
ENDDO
WRestore()
SKIP 0
RETURN lOk
FUNCTION RecDelete( lForever )
LOCAL lOk := .F.
hb_Default( @lForever, .T. )
IF RecLock( lForever )
DELETE
RecUnlock()
lOk := .T.
ENDIF
RETURN lOk
FUNCTION RecUnlock()
SKIP 0
UNLOCK
RETURN NIL
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Erro ao gravar registro novo - dbappend()
JoséQuintas,
Apesar de estar em harbour a rotina que postou, pelo que entendi, vc executa o append, testa erro na rede depois trava o registro, é o que faço tbem, a diferença é que trabalho referenciando o alias, tipo ALIAS->(dbappend()), ALIAS->(dbrlock()), assim por diante.
No caso da sua rotina, antes de executá-la, o alias foi definido, tipo DbSelectArea(ALIAS), é isso ?
Apesar de estar em harbour a rotina que postou, pelo que entendi, vc executa o append, testa erro na rede depois trava o registro, é o que faço tbem, a diferença é que trabalho referenciando o alias, tipo ALIAS->(dbappend()), ALIAS->(dbrlock()), assim por diante.
No caso da sua rotina, antes de executá-la, o alias foi definido, tipo DbSelectArea(ALIAS), é isso ?
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Erro ao gravar registro novo - dbappend()
alias->( RecLock() )
alias->( RecAppend() )
alias->( RecUnlock() )
alias->( RecAppend() )
alias->( RecUnlock() )
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Erro ao gravar registro novo - dbappend()
Ok, não percebi que é Clipper.
Pode criar a função do Harbour:
No Clipper precisa algum tipo de DO WHILE com as chamadas a OL_Yield() da OSLIB.
Pode criar a função do Harbour:
Código: Selecionar todos
FUNCTION hb_Default( a, b )
IF ValType( a ) != ValType( b ) .OR. a == Nil
a := b
ENDIF
RETURN Nil
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Erro ao gravar registro novo - dbappend()
Aliás... está aí...
Já pode melhorar o fonte, mesmo em Clipper, fazendo modificações já existentes no Harbour.
E enquanto não compila o fonte com Harbour, continua compilando com Clipper.
Mesmos fontes nos dois.
Já pode melhorar o fonte, mesmo em Clipper, fazendo modificações já existentes no Harbour.
E enquanto não compila o fonte com Harbour, continua compilando com Clipper.
Mesmos fontes nos dois.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Erro ao gravar registro novo - dbappend()
Perguntei se era a rotina do aplicativo.JSystem escreveu: pelo que entendi, vc executa o append, testa erro na rede depois trava o registro, é o que faço tbem, a diferença é que trabalho referenciando o alias, tipo ALIAS->(dbappend()), ALIAS->(dbrlock()), assim por diante.
Nela está fazendo rLock() mesmo se o dbAppend() falhar.
Está testando o bloqueio, e não o append.
De repente, o bloqueio funciona em registro fantasma, e tá salvando em lugar nenhum.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Erro ao gravar registro novo - dbappend()
Certo José, para eu testar o append, não o bloqueio, o que acha dessa implementação ?JoséQuintas escreveu:Está testando o bloqueio, e não o append.
Código: Selecionar todos
Function FAppend(ALIAS)
nTent:=1 ; rOk:=.f.
Do While .t.
(ALIAS)->(dbappend())
if ! neterr()
rOk:=.t.
// Posso colocar numa funcao, como no seu exemplo.
if (ALIAS)->(dbrlock())
rOk:=.t.
replace ...
(ALIAS)->(dbcommit(),dbunlock())
exit
Endif
mensagem("Aguardando liberacao do registro, tentativa "+ltrim(str(nTent))+", ESC Cancela" )
if inkey(0.5)==K_ESC
exit
Endif
nTent++
loop
Endif
mensagem("Aguardando liberacao do arquivo, tentativa "+ltrim(str(nTent))+", ESC Cancela" )
if inkey(0.5)==K_ESC
exit
Endif
nTent++
Enddo
Return rOk
Utiliza skip 0, qual a diferença ?
- Itamar M. Lins Jr.
- Administrador

- Mensagens: 7928
- Registrado em: 30 Mai 2007 11:31
- Localização: Ilheus Bahia
- Curtiu: 1 vez
Erro ao gravar registro novo - dbappend()
Olá!
Isso não irá resolver em definitivo.
Se antes funcionava ?
O Win7 tem outro SMB precisa mexer nos registros. Optimisc Locking... E outros problemas de atualizações do Win7.
Só vai resolver usando Terminal Service, LetoDbf. Nem usando Harbour com rede mapeada resolve, vira e mexe dá um problema de corromper indices, precisando no mínimo de reindexar. Dbappend() faz dbRlock(), DbrLock() é desnecessário.
https://comp.lang.clipper.visual-object ... on-network
Leia aqui tem alguma coisa explicando. O Harbour tem umas funções para desligar, mas não está atualizado para as novas versões do SMB. Talvez funcione, mas não evita os antivirus de atrapalhar. O Norton antivirus mesmo, pode sobrepor um arquivo DBF/CDX/NTX, achando que foi infectado.
Saudações,
Itamar M. Lins Jr.
Isso não irá resolver em definitivo.
Se antes funcionava ?
O Win7 tem outro SMB precisa mexer nos registros. Optimisc Locking... E outros problemas de atualizações do Win7.
Só vai resolver usando Terminal Service, LetoDbf. Nem usando Harbour com rede mapeada resolve, vira e mexe dá um problema de corromper indices, precisando no mínimo de reindexar. Dbappend() faz dbRlock(), DbrLock() é desnecessário.
Código: Selecionar todos
DBAPPEND()
Append a new record to the database open in the current work area
------------------------------------------------------------------------------
Syntax
DBAPPEND([<lReleaseRecLocks>]) --> NIL
Arguments
<lReleaseRecLocks> is a logical data type that if true (.T.),
clears all pending record locks, then appends the next record. If
<lReleaseRecLocks> is false (.F.), all pending record locks are
maintained and the new record is added to the end of the Lock List. The
default value of <lReleaseRecLocks> is true (.T.).
Returns
DBAPPEND() always returns NIL.
Description
DBAPPEND() is a database function that lets you add records to the
current database. The enhancement to this function lets you maintain
multiple record locks during an append.
DBAPPEND() without a parameter as in earlier versions of CA-Clipper,
clears all pending record locks prior to an append. This is the same as
DBAPPEND(.T.).
Examples
. This example appends a blank record to the database, Sales,
without releasing the record locks in the current Lock List, and then
checks for a network error:
USE Sales NEW
SET INDEX TO Sales
DBAPPEND(.F.)
IF NETERR()
? "A network error has occurred!"
ENDIF
Leia aqui tem alguma coisa explicando. O Harbour tem umas funções para desligar, mas não está atualizado para as novas versões do SMB. Talvez funcione, mas não evita os antivirus de atrapalhar. O Norton antivirus mesmo, pode sobrepor um arquivo DBF/CDX/NTX, achando que foi infectado.
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Itamar M. Lins Jr.
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Erro ao gravar registro novo - dbappend()
Acho melhor não complicar.JSystem escreveu:to José, para eu testar o append, não o bloqueio, o que acha dessa implementação ?
Quando chama alias->( fAppend() ), a função já vai ser executada no alias indicado, não precisa complicar a função, além do mais, elimina parâmetro a mais, e evita esquecer dele.
Quanto ao Skip 0, testado também numa época usando Clipper+Sixcdx e VB6 com ADS Local, e não se trata nem de ficar visível na rede, mas também na mesma máquina em uso simultâneo.
NÃO SEI dizer sobre COMMIT, nunca usei, nunca precisei, e nunca testei.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
