Problema de Append

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
juniorcamilo
Usuário Nível 3
Usuário Nível 3
Mensagens: 343
Registrado em: 10 Nov 2006 09:12
Localização: Pará

Problema de Append

Mensagem por juniorcamilo »

Amigos muito isoladamente falando, ou seja, dificilmente acontece, mas acontece em 2 clientes meus. apos feita a venda para um cliente vou gerar o financeiro para o mesmo, quando imprime a nota para o cliente assinar sai realmente a duplicata impressa abaixo do total da nota tento ai a confirmação que realmente foi gravada no arquivo financeiro a duplicata. Só que no final do dia quando fecha o caixa bomba cade a duplicata do cliente, some sem deixar vestigio ja fiz testes e mais teste e nada, ja ate tirei o pack na hora da reorganizacao deste arquivo e nao a vestigio do determinado registro, ai eu tirei uma logica q acho que em um determinada hora por sei la oq. outro registro sobreescreve o antigo, ou seja, ancho que o append nao esta montando um registro novo e sim travando o ultimo registro armazenado e sobreescrevendo com uma nova informação, oq fazer?
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

ancho que o append nao esta montando um registro novo e sim travando o ultimo registro armazenado e sobreescrevendo com uma nova informação, oq fazer?
Olá,
Acredito que se vc esta usando append blank em momento algum ele vai alterar um Registro que já existe, claro que vale lembrar que se vc tem esse sistema em Multi-usuario tens que fazer os devidos tratamento para rede. Agora ainda vc pode ter um usuario usando um DBU da vida e deletando um registro, ou seria ideal vc postar o codigo dessa sua rotina que esta dando o problema para nos poder dar uma analisada e quem sabe dar algumas dicas em cima do que vc já tem.

Abraços
Leonardo Machado
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

outro registro sobreescreve o antigo, ou seja, ancho que o append nao esta montando um registro novo e sim travando o ultimo registro armazenado e sobreescrevendo com uma nova informação, oq fazer?
Ao terminar a inclusão você executa um COMMIT?
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Mensagem por alaminojunior »

E também precisa verificar se o append blank teve exito. Precisa verificar como vc está incluindo um novo registro. Se além do append blank, vc emite um rlock() (desnecessário), e não existe uma verificação do exito do append, com certeza o furo está por aí.
E é lógico, como citou o Maligno, commit sempre antes de destravar. Aliás seria mais providencial, um DbCommit().
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Falar em COMMIT (traduzido para dbCommitAll()) é força de hábito pra mim. Queria dizer dbCommit(), que é melhor mesmo. :)
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem por gvc »

Vc coloca o número sequencial de lançamento? Algum controle desse tipo?
Veja sua rotina de inclusão.
Se ela depende de determinado número e esse é gerado pelo velho "pega o último número do arquivo e soma 1", ai pode estar seu problema.
Outra é liberar o registro atualiado antes do commit dos dados.
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
Avatar do usuário
juniorcamilo
Usuário Nível 3
Usuário Nível 3
Mensagens: 343
Registrado em: 10 Nov 2006 09:12
Localização: Pará

Mensagem por juniorcamilo »

sygecom escreveu:
ancho que o append nao esta montando um registro novo e sim travando o ultimo registro armazenado e sobreescrevendo com uma nova informação, oq fazer?
Olá,
Acredito que se vc esta usando append blank em momento algum ele vai alterar um Registro que já existe, claro que vale lembrar que se vc tem esse sistema em Multi-usuario tens que fazer os devidos tratamento para rede. Agora ainda vc pode ter um usuario usando um DBU da vida e deletando um registro, ou seria ideal vc postar o codigo dessa sua rotina que esta dando o problema para nos poder dar uma analisada e quem sabe dar algumas dicas em cima do que vc já tem.

Abraços
Leonardo Machado

PREN->(dbappend())
DO WHILE Travar5("PREN"); inkey(.2); ENDDO
PREN->CODCLI := cCodcli
PREN->NRODOC := cCodped+"/"+iii
PREN->NRONOT := cCodped
PREN->DTAEMI := date()
PREN->DTAENT := date()
PREN->CODBAN := "001"
PREN->TIPDOC := cTipdoc
PREN->REFERE := cRefere
PREN->CODVEN := cCodven
PREN->COBRAD := cCodven
PREN->CAIXA := cCaixa
PREN->NROCAX := Pegacaixa()
PREN->SETOR := cSetor
PREN->ENTRACAX:= "S"
PREN->CARGA := cCarga
PREN->CHAVE := cCodped+"/1"+cCaixa
if cPrazo # "00"
PREN->DTAVEN := date()+val(PZO->VENPZO&ii)
PREN->DTAVOR := date()+val(PZO->VENPZO&ii)
else
PREN->DTAVEN := dDtabase
PREN->DTAVOR := dDtabase
endif
if (q = 1) .or. (nQq = 2 .and. q = 2)
if PZO->CENTAVOS == q
PREN->VALENT := nValDupl+nCentavos
PREN->VALORI := nValDupl+nCentavos
else
PREN->VALENT := nValDupl+nDif
PREN->VALORI := nValDupl+nDif
endif
else
if PZO->CENTAVOS == q
PREN->VALENT := nValDupl+nCentavos
PREN->VALORI := nValDupl+nCentavos
else
PREN->VALENT := nValDupl
PREN->VALORI := nValDupl
endif
endif
if !empty(cObs)
PREN->HISTORICO += "OBS.:"+cObs+chr(13)
endif
PREN->(dbunlock())
PREN->(dbcommit())


olha esta ai a funcao que tanto me deixa louco, olha esta funcao tem nada nda uns 8 anos que eu fiz e so agora é que esta dando este problema e é um caso isolado....
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Mensagem por alaminojunior »

AHA
Exatamente o que eu citei.

Código: Selecionar todos

PREN->(dbappend())
DO WHILE Travar5("PREN"); inkey(.2); ENDDO 
Aquele dbappend() precisa ser testado.
Aliás um outro equívoco: O dbappend() (se não falhar) já trava o registro, não precisa travar depois com rlock().

Da maneira como está, se o dbappend() não conseguir exito, o sistema não vai retornar erro, pois existe um rlock() em seguida.

tente assim

Código: Selecionar todos

do while .t.
    dbappend()
    if neterr()
       loop
    else 
       exit
    endif
enddo
replaces...
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

Será que botaram trago no meu chimarrão ? ...não toh vendo RLOCK() nenhum....
Realmente, o que o colega alaminojunior disse faz sentido, vc deve testar dbappend()

Eu uso uma função para isso:

Código: Selecionar todos

******************
Function AppRede()
******************
PRIVATE oDlgHabla:=NIL
While .T.
   DbAppend()
   If !NetErr()
      Fim_Run()
      Return(.T.)
   Else
      MsgRun("Aguarde Inserindo Novo Registro...")
      Inkey(1)
      Fim_Run()
      Loop
   EndIf
Enddo
Fim_Run()
Return(Nil)
Outra coisa é o final, eu uso ao contrario ou seja primeiro dou o dbcommit() e depois libero o registro()
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Mensagem por alaminojunior »

não toh vendo RLOCK() nenhum....
Meu amigo gauchinho, o que se supõe com isso ?

Código: Selecionar todos

DO WHILE Travar5("PREN")
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

Travar5("PREN") não quer dizer que seja um RLOCK() pode ser apenas um FLOCK(), sei lah ele deveria ter postado essa função tmb.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Mensagem por alaminojunior »

Travar5("PREN") não quer dizer que seja um RLOCK() pode ser apenas um FLOCK()
Que diferença faz ?

Ah esse chimarrão !!!
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

alaminojunior escreveu:
Travar5("PREN") não quer dizer que seja um RLOCK() pode ser apenas um FLOCK()
Que diferença faz ?

Ah esse chimarrão !!!
Se for mult-usuario ? o RLOCK() vai travar o arquivo todo, empedindo outros Dbappend()
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Travar o arquivo todo é função do FLock(). O RLock() trava apenas o registro apontado.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

Ops, Enverti...
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Responder