Erro ao gravar registro novo - dbappend()

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Erro ao gravar registro novo - dbappend()

Mensagem por JoséQuintas »

Pequena correção:

Já mexi sim, pra instalar o ODBC do MySQL, e o run-time do Visual C que o ODBC precisa.

NÃO TENHO nenhuma reclamação de DBF, mas agora prefiro MySQL.

Sinceramente.... estou com medo de alterar o aplicativo da imobiliária pra MySQL e começar a ter problemas.
É que a lógica do aplicativo é complicada, e não sei se o MySQL vai dar conta do jeito que está.
Mas com certeza, a primeira coisa que fiz foi deixar igual meu aplicativo, no tratamento de rede e tudo mais.

Acho que a última reindexação lá foi em 2019, antes da pandemia, porque sou eu quem reindexa, e geralmente na hora do almoço, quando ninguém está usando.
Cheguei a passar por lá, mas não foi na hora do almoço, então não deu pra reindexar.
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/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Erro ao gravar registro novo - dbappend()

Mensagem por JoséQuintas »

Pensei aqui....
Faça um teste diferente.
Diz que o problema é que não grava, e não exatamente o append.

Coloque pra registrar o REPLACE depois do APPEND, incluindo RecNo(), Eof(), LastRec(), etc.

Quando falhar, verifique nesse histórico informações sobre o registro.

De repente não é que falha, é porque outro terminal escreve encima do append do terminal anterior.
De repente não é o W7 que falha, e sim outra máquina, que acaba gravando encima.
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/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Erro ao gravar registro novo - dbappend()

Mensagem por JoséQuintas »

Outra coisa que sugere isso....

Está testando o bloqueio de registro, e não o append.
Isso significa que se o append falhar, vai tentar bloquear outro registro, o último, justamente o que vai estar sendo usado em outra máquina, e por isso não consegue bloquear.
Assim que a máquina gravar e liberar, a outra já vai gravar encima, substituindo o conteúdo.
Então... não seria que não gravou, mas sim que foi "coberto" pelo de outro terminal.
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/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Erro ao gravar registro novo - dbappend()

Mensagem por JoséQuintas »

Porque isso só acontece na máquina com W7 ?
Sabe-se lá porque.
De repente a máquina com W7 também é mais rápida, e não acontecia antes, por questão de velocidade.

Seja o que for, esse teste está errado, e é a primeira coisa a ser corrigida.
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/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Erro ao gravar registro novo - dbappend()

Mensagem por JoséQuintas »

Só aproveitando o acontecimento....

De repente, muda pra Harbour e os problemas aumentam.
E o problema era uma coisa desse tipo, que no Harbour vai ser mais rápido e liberar o append mais rápido, pronto pra ser regravado.

Convém chamar a atenção nisso.
De repente, muitos que tiveram problema foi por coisas desse tipo.

É fácil converter pra Harbour?
Depende dos fontes.
Num caso desses, os problemas aumentariam, mas não por problema do Harbour, porque havia problema nos fontes.

É por isso que eu digo:

Aproveita que os fontes Clipper/Harbour são compatíveis, vai ajustando SEM SAIR DO CLIPPER, e eventualmente vai compilando com Harbour e testando.
Com mesmos fontes, pode ir pro Harbour e voltar ao Clipper à vontade.
Aproveita pra dar uma geral.
Os fontes estarão sempre funcionando e prontos pra uso, seja Clipper ou Harbour.
E quando tudo ok, basta colocar a compilação com Harbour, e pronto.

Faz 20 anos que o Harbour existe, se não trocou até agora, não precisa trocar do dia pra noite.
Vai tranquilo, ajustando fontes, testando, deixando sempre em uso com Clipper mesmo.... alguns meses a mais ou a menos não faz diferença, esperou 20 anos, espera mais alguns meses.
De qualquer jeito, tudo vai ficar melhor, então sem pressa.

Mas de preferência, NÃO CRIE fontes diferentes pro Harbour durante a migração.
Use sempre os mesmos, porque sempre estarão atualizados, e sempre testados/em uso pelo cliente.
Com isso não perde nada do que fizer.

Já se criar fonte diferente pra Harbour.... pode acabar jogando tudo fora, porque pode ter atualizado os fontes Clipper.... e os do Harbour não servirem mais.
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/
JSystem
Usuário Nível 3
Usuário Nível 3
Mensagens: 143
Registrado em: 21 Jan 2010 21:10
Localização: Uberaba

Erro ao gravar registro novo - dbappend()

Mensagem por JSystem »

Ok José,

Muito obrigado aí pelas orientações e dicas!

Valeu!
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Erro ao gravar registro novo - dbappend()

Mensagem por alxsts »

Olá!
JoséQuintas escreveu:Vai continuar sem teste se append funcionou.
Tem que ser pelo menos isto:
01 lOk := .F.
02 nCont := 0
03 DO WHILE nCont >= 20
04    IF dbAppend()
05       lOk := .T.
06       EXIT
07    ENDIF
Isto na linha 4 não funciona. DbAppend() sempre retorna NIL.

O correto é sempre fazer o DbAppend() e em seguida testar NetErr(). Se o DbAppend() conseguir incluir um novo registro, ele próprio já trava este novo registro e NetErr() é setado para False. Não precisa fazer RLock() ou DbRLock() depois de DbAppend() bem sucedido. RLock() ou DbRLock() liberam os locks existentes antes de tentarem fazer um novo. Se o DbAppend() conseguir inserir um novo registro, ele vai tambem travar. Se em seguida emitir um RLock() neste registro já travado, ele vai ser liberado. Será que o RLock() emitido vai travar exatamente o mesmo registro?
Mario Mesquita escreveu:Pra dar append na tabela, tem que estar travado com Flock(). Está assim no seu sistema?
Isto não é verdade... e acho que ninguém conseguiria trabalhar numa rede com alguns poucos terminais...
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Erro ao gravar registro novo - dbappend()

Mensagem por JoséQuintas »

alxsts escreveu:Isto na linha 4 não funciona. DbAppend() sempre retorna NIL.
O correto é sempre fazer o DbAppend() e em seguida testar NetErr()
Realmente, fui querer passar uma rotina mais simples, e me confundi.
Use o fonte que passei antes, ajuste pras suas mensagens.
E como é Clipper, inclua a parte da OSLIB.
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/
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Erro ao gravar registro novo - dbappend()

Mensagem por Itamar M. Lins Jr. »

Olá!
DbAppend() retorna Nil no Clipper. No Harbour retorna .T. ou .F.

Código: Selecionar todos

function  main

   rddSetDefault("DBFCDX")
   Set Autopen On 
   hb_cdpSelect("UTF8EX")
   
   aStructure := { { "idcontact" ,"+",04,0} ,; //Auto increment
                   { "name"      ,"c",60,0} }

  If !hb_vfexists("contacts.dbf")      
      If dbcreate("contacts.dbf",aStructure,"DBFCDX",.t.,"ctc") //Create and open with shared mode
         index on field->name tag tgName
         ? "Return of DbAppend: ", ctc->( dbappend() )
         ctc->name := "JOSÉ DE ASSUMPÇÃO"
          
         ctc->( dbCloseArea() )
      Else
         alert("Error Creating DBF")
         cancel
      EndIf
   EndIf
   Return Nil

Código: Selecionar todos

itamar@itamar-desktop:~/fontes/testes$ ./test
   Return of DbAppend:  .T.  
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Erro ao gravar registro novo - dbappend()

Mensagem por JoséQuintas »

Mesmo assim, como é referente ao Clipper, melhor o método antigo que funciona em Clipper e em Harbour.
Assim usa o mesmo fonte nos dois.

Ou aquelas funções RecAppend(), RecLock(), RecUnlock()
Essa é a vantagem delas: pode modificar o aplicativo inteiro, e depois trata-se apenas de mexer nas 3 funções pra alterar tudo de uma vez.
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/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Erro ao gravar registro novo - dbappend()

Mensagem por alxsts »

Olá!
Itamar M. Lins Jr. escreveu:DbAppend() retorna Nil no Clipper. No Harbour retorna .T. ou .F.
Só para constar, no xHarbour, DbAppend() se comporta como no Clipper, retornando NIL. É o que consta no "xHarbour Language Reference Guide (Version 1.1)". Não testei pois não tenho ele instalado.
[]´s
Alexandre Santos (AlxSts)
Responder