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 JoséQuintas » 29 Abr 2021 16:38

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, 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: 18009
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 17:39

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, 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: 18009
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 17:44

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, 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: 18009
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 17:48

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, 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: 18009
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 18:04

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, 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: 18009
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 23:38

Ok José,

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

Valeu!
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 alxsts » 30 Abr 2021 01:27

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)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

Erro ao gravar registro novo - dbappend()

Mensagempor JoséQuintas » 30 Abr 2021 10:49

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, 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: 18009
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 Itamar M. Lins Jr. » 30 Abr 2021 11:21

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

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

itamar@itamar-desktop:~/fontes/testes$ ./test
   Return of DbAppend:  .T. 


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 » 30 Abr 2021 11:36

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, 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: 18009
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 alxsts » 01 Mai 2021 00:47

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)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

Anterior



Retornar para CA-Clipper

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 2 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