Clipper On Line • Ver Tópico - Erro ao gravar registro novo - dbappend()

Erro ao gravar registro novo - dbappend()

Discussão sobre a linguagem CA-Clipper.

Moderador: Moderadores

 

Erro ao gravar registro novo - dbappend()

Mensagempor JSystem » 28 Abr 2021 12:39

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
JSystem
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 143
Data de registro: 21 Jan 2010 20:10
Cidade/Estado: Uberaba
Curtiu: 3 vezes
Mens.Curtidas: 1 vez

Erro ao gravar registro novo - dbappend()

Mensagempor Mario Mesquita » 28 Abr 2021 13:43

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.
Avatar de usuário

Mario Mesquita
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 557
Data de registro: 08 Dez 2009 12:47
Cidade/Estado: Rio de Janeiro
Curtiu: 73 vezes
Mens.Curtidas: 13 vezes

Erro ao gravar registro novo - dbappend()

Mensagempor JSystem » 28 Abr 2021 13:56

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:

(ALIAS)->(dbappend())
if (ALIAS)->(dbrlock())
    replace ...
    (ALIAS)->(dbcommit(),dbunlock())
else
    Alert()
Endif
JSystem
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 143
Data de registro: 21 Jan 2010 20:10
Cidade/Estado: Uberaba
Curtiu: 3 vezes
Mens.Curtidas: 1 vez

Erro ao gravar registro novo - dbappend()

Mensagempor Itamar M. Lins Jr. » 28 Abr 2021 15:01

Olá!
já estou trabalhando para migrar para harbour,

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.
A mudança é mínima.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

Erro ao gravar registro novo - dbappend()

Mensagempor JoséQuintas » 28 Abr 2021 18:51

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?
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Erro ao gravar registro novo - dbappend()

Mensagempor JSystem » 28 Abr 2021 20:10

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.
JSystem
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 143
Data de registro: 21 Jan 2010 20:10
Cidade/Estado: Uberaba
Curtiu: 3 vezes
Mens.Curtidas: 1 vez

Erro ao gravar registro novo - dbappend()

Mensagempor JoséQuintas » 28 Abr 2021 20:51

/*
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, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Erro ao gravar registro novo - dbappend()

Mensagempor JSystem » 28 Abr 2021 21:33

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 ?
JSystem
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 143
Data de registro: 21 Jan 2010 20:10
Cidade/Estado: Uberaba
Curtiu: 3 vezes
Mens.Curtidas: 1 vez

Erro ao gravar registro novo - dbappend()

Mensagempor JoséQuintas » 29 Abr 2021 00:02

alias->( RecLock() )
alias->( RecAppend() )
alias->( RecUnlock() )
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Erro ao gravar registro novo - dbappend()

Mensagempor JoséQuintas » 29 Abr 2021 00:06

Ok, não percebi que é Clipper.

Pode criar a função do Harbour:

FUNCTION hb_Default( a, b )

   IF ValType( a ) != ValType( b ) .OR. a == Nil
       a := b
   ENDIF

   RETURN Nil


No Clipper precisa algum tipo de DO WHILE com as chamadas a OL_Yield() da OSLIB.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Erro ao gravar registro novo - dbappend()

Mensagempor JoséQuintas » 29 Abr 2021 00:08

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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Erro ao gravar registro novo - dbappend()

Mensagempor JoséQuintas » 29 Abr 2021 00:14

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.


Perguntei se era a rotina do aplicativo.
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, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Erro ao gravar registro novo - dbappend()

Mensagempor JSystem » 29 Abr 2021 08:16

JoséQuintas escreveu:Está testando o bloqueio, e não o append.


Certo José, para eu testar o append, não o bloqueio, o que acha dessa implementação ?

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


Percebi que não utiliza dbcommit(), na qual utilizo a vida inteira rsrs.
Utiliza skip 0, qual a diferença ?
JSystem
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 143
Data de registro: 21 Jan 2010 20:10
Cidade/Estado: Uberaba
Curtiu: 3 vezes
Mens.Curtidas: 1 vez

Erro ao gravar registro novo - dbappend()

Mensagempor Itamar M. Lins Jr. » 29 Abr 2021 10:00

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.
Screenshot_20210429_094544.png

Dbappend() faz dbRlock(), DbrLock() é desnecessário.
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


https://comp.lang.clipper.visual-objects.narkive.com/h94B7M0U/windows-7-corruption-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.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

Erro ao gravar registro novo - dbappend()

Mensagempor JoséQuintas » 29 Abr 2021 11:45

JSystem escreveu:to José, para eu testar o append, não o bloqueio, o que acha dessa implementação ?


Acho melhor não complicar.
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, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Próximo



Retornar para CA-Clipper

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 8 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro