Estou com um problema em um cliente, onde esta ocorrendo duplicao dos dados no banco.
Tenho o mesmo sistema em outros 3 clientes onde não ocorre isto.
Seque em anexo o banco de dados e o prg.
Sistema duplicando dados
Moderador: Moderadores
-
gilsonpaulo
- Usuário Nível 3

- Mensagens: 135
- Registrado em: 02 Fev 2008 11:30
- Localização: Quatro Barras
Sistema duplicando dados
- Anexos
-
GB1.zip- (20.11 KiB) Baixado 237 vezes
-
CADENT.zip- (12.15 KiB) Baixado 247 vezes
Re: Sistema duplicando dados
Por favor, especifique a duplicidade.
Pelo que vi no seu arquivo DBF, vc não esta normalizando os dados.
Pelo que vi no seu arquivo DBF, vc não esta normalizando os 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}
{POG - Programação Orientada a Gambiarra}
-
gilsonpaulo
- Usuário Nível 3

- Mensagens: 135
- Registrado em: 02 Fev 2008 11:30
- Localização: Quatro Barras
Re: Sistema duplicando dados
Se voce observar o numero 000850,000852,000855,000856,000860,000861,000862 estão duplicados
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
Re: Sistema duplicando dados
Amiguinho,
Se voce usa rede siga a sequencia de liberação de registro e posterior comitação, ou seja, travou o registro com dbAppend(APPEND) ou dbRLock(REGLOCK) para salvar destrave o registro com dbRUnlock() e commit local, dbCommit().
Outra coisa, sempre re-selecione a área da tabela antes destes comandos, nunca dispare comandos de salvamento para uma área estando em outra, pode funcionar? mas não é o correto.
Verifique como o cache na sessão DOS(smartdrv) esta funcionado bem, sem atrasos ou avanços.
Verifique se o ambiente DOS está compatível e idêntico em todos os clientes, podem haver diferenças, mas a falta de memória nestes momentos pode causar estes problemas.
Utilize o EXEcutável de um cliente que não tem estes problemas na máquina do cliente com problemas para ver se continua, se sim, o código do sistema neste cliente tem problemas.
Desative antivirus no servidor e nesta máquina com causa problemas e deixe funcionar para ver se continua o problema.
Analise como os usuários se comportam, que programas usam e quanto tempo seu sistema fica aberto ou ocioso.
Sendo o caso de usuário ou máquina com problemas é interessante saber se a mesma esta sendo reiniciada por algum motivo, para tal seria legal colocar um pequeno programinha em Clipper no autorun que gravasse a data e hora que ele foi ativado, ou seja, se a máquina foi reiniciada no inicio do dia e fechado no fim do dia deverão existir somente uma data e hora, caso existam várias a mesma esta tendo reinicializações, sendo que talvez estejam acontecendo quando seu sistema esta aberto.
Em suma revise o módulo que esta trabalhando com esta tabela e seus indices.
Se voce usa rede siga a sequencia de liberação de registro e posterior comitação, ou seja, travou o registro com dbAppend(APPEND) ou dbRLock(REGLOCK) para salvar destrave o registro com dbRUnlock() e commit local, dbCommit().
Outra coisa, sempre re-selecione a área da tabela antes destes comandos, nunca dispare comandos de salvamento para uma área estando em outra, pode funcionar? mas não é o correto.
Verifique como o cache na sessão DOS(smartdrv) esta funcionado bem, sem atrasos ou avanços.
Verifique se o ambiente DOS está compatível e idêntico em todos os clientes, podem haver diferenças, mas a falta de memória nestes momentos pode causar estes problemas.
Utilize o EXEcutável de um cliente que não tem estes problemas na máquina do cliente com problemas para ver se continua, se sim, o código do sistema neste cliente tem problemas.
Desative antivirus no servidor e nesta máquina com causa problemas e deixe funcionar para ver se continua o problema.
Analise como os usuários se comportam, que programas usam e quanto tempo seu sistema fica aberto ou ocioso.
Sendo o caso de usuário ou máquina com problemas é interessante saber se a mesma esta sendo reiniciada por algum motivo, para tal seria legal colocar um pequeno programinha em Clipper no autorun que gravasse a data e hora que ele foi ativado, ou seja, se a máquina foi reiniciada no inicio do dia e fechado no fim do dia deverão existir somente uma data e hora, caso existam várias a mesma esta tendo reinicializações, sendo que talvez estejam acontecendo quando seu sistema esta aberto.
Em suma revise o módulo que esta trabalhando com esta tabela e seus indices.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
-
gilsonpaulo
- Usuário Nível 3

- Mensagens: 135
- Registrado em: 02 Fev 2008 11:30
- Localização: Quatro Barras
Re: Sistema duplicando dados
A rede e netware 5.1 as estacao rodam ms-dos com boot remoto, com o smardrv desativado.
Sobre o commit, devo dar antes ou depois do unlock().
As maquinas, são novas, o servidor é um poweredge t300 da dell o swith e da planet 24 portas, é tudo novo.
Vou relinkar o sistema com blinker, notei que algumas poucas vezes o sistema acusava memory low
Obrigado a todos pela ajuda ate agora.
Sobre o commit, devo dar antes ou depois do unlock().
As maquinas, são novas, o servidor é um poweredge t300 da dell o swith e da planet 24 portas, é tudo novo.
Vou relinkar o sistema com blinker, notei que algumas poucas vezes o sistema acusava memory low
Obrigado a todos pela ajuda ate agora.
Re: Sistema duplicando dados
1) Vc deve usar o DBCommit antes do DBUnlock.
Vc primeiro deve descarregar os dados do registro que estão na memória no disco e depois desbloquear o registro. Fazendo o contrário, vc corre o risco de um outro usuário pegar o registro desbloqueado com informações antigas.
2) Vc usa arquivo temporário para entrar com as informações de vendas. Pelo que entendi (não estudei todo o programa) vc coloca para o usuário que esta digitando gravar (atualizar a base principal) e pergunta se é para limpar a base temporária.
Me ocorre o seguinte:
- O usuário não limpou a base e começou a entrar com mais dados de outra vendas. Como o filtro esta ativo para a tela, os dados anteriores não vão aparecer na tela, mas serão gravados.
- O usuário editou (carregou para o arquivo temporário) esses registro e mandou salvar novamente. Se vc não usa pesquisa por indice ou a chave de pesquisa esta errada, o sistema grava novamente os dados do temporário como novos registros.
Se vc colocar uma auditoria que grave a informação de data, hora, usuário, chave, ação (incluir / alterar / excluir) que gravou do temporário para o principal, já dá para pegar o que o usuário esta fazendo.
Veja que não é sujeira de arquivo. São os mesmo registros exatamente na mesma ordem.
Vc primeiro deve descarregar os dados do registro que estão na memória no disco e depois desbloquear o registro. Fazendo o contrário, vc corre o risco de um outro usuário pegar o registro desbloqueado com informações antigas.
2) Vc usa arquivo temporário para entrar com as informações de vendas. Pelo que entendi (não estudei todo o programa) vc coloca para o usuário que esta digitando gravar (atualizar a base principal) e pergunta se é para limpar a base temporária.
Me ocorre o seguinte:
- O usuário não limpou a base e começou a entrar com mais dados de outra vendas. Como o filtro esta ativo para a tela, os dados anteriores não vão aparecer na tela, mas serão gravados.
- O usuário editou (carregou para o arquivo temporário) esses registro e mandou salvar novamente. Se vc não usa pesquisa por indice ou a chave de pesquisa esta errada, o sistema grava novamente os dados do temporário como novos registros.
Se vc colocar uma auditoria que grave a informação de data, hora, usuário, chave, ação (incluir / alterar / excluir) que gravou do temporário para o principal, já dá para pegar o que o usuário esta fazendo.
Veja que não é sujeira de arquivo. São os mesmo registros exatamente na mesma ordem.
"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}
{POG - Programação Orientada a Gambiarra}
-
gilsonpaulo
- Usuário Nível 3

- Mensagens: 135
- Registrado em: 02 Fev 2008 11:30
- Localização: Quatro Barras
Re: Sistema duplicando dados
Ok pessoal, muito obrigado pelas dicas, mas descobri que o problema esta com a netware 5.1, voltei o servidor com a netware 3.12 e não ocorreu mais o problema.
Re: Sistema duplicando dados
Para evitar o que está acontecendo com o colega, além dos DbCommit() e DbUnlock() e seleção do arquivo para dar os replaces nos campos, eu uso há muito tempo, as funções como no seguinte exemplo:
select arquivo
initvars() // inicia as variáveis com um "m" antecedendo cada campo - assim o campo codigo fica "mcodigo"
// na rotina de inclusão do registro a entrada das variáveis fica assim
@ x,y say "Código: " get mcodigo pict "99999" valid suafunção etc. // evita edição direta no campo do arquivo
// essa função pode verificar se já existe o
// registro com esse código
@ x+1,y say "Nome: " get mnome pict "@!"
read
...
select arquivo
replvars() // dará replace em todos os campos, editados ou não
dbcommit()
dbunlock()
// na alteração de campos fica mais fácil
select arquivo
equvars() // carregará as variáveis de memória com o conteúdo de todos os campos do arquivo
@ x,y get mcodigo
@ y,z get mnome
read
// para salvar
replvars()
clrvars() // limpa as variáveis de memória
// no final da rotina
freevars // libera as variáveis de memória quando não serão mais necessárias
****
segue em anexo o fonte dessas instruções
select arquivo
initvars() // inicia as variáveis com um "m" antecedendo cada campo - assim o campo codigo fica "mcodigo"
// na rotina de inclusão do registro a entrada das variáveis fica assim
@ x,y say "Código: " get mcodigo pict "99999" valid suafunção etc. // evita edição direta no campo do arquivo
// essa função pode verificar se já existe o
// registro com esse código
@ x+1,y say "Nome: " get mnome pict "@!"
read
...
select arquivo
replvars() // dará replace em todos os campos, editados ou não
dbcommit()
dbunlock()
// na alteração de campos fica mais fácil
select arquivo
equvars() // carregará as variáveis de memória com o conteúdo de todos os campos do arquivo
@ x,y get mcodigo
@ y,z get mnome
read
// para salvar
replvars()
clrvars() // limpa as variáveis de memória
// no final da rotina
freevars // libera as variáveis de memória quando não serão mais necessárias
****
segue em anexo o fonte dessas instruções
- Anexos
-
FUNCVARS.TXT- funções em Clipper para entrada de dados
- (1.68 KiB) Baixado 200 vezes
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.

