Página 1 de 1

Salvar e restaurar Posicao dos DBF

Enviado: 26 Out 2012 10:06
por paiva
Por favor

Auguem tem uma rotina/função que salve e restaure as posições dos Aquivos ?

com Índices, SET filter etc ?

tenho uns 2 clientes que as vezes aceita 2 registro com a mesma chave (Unica).

com certeza e´problema de índices por falha de enegia, rede etc.

então Pendei em SALVAR fazer ser filter TO e set ORDER 0 e varrer o arquivo (não é grande) para ver se já existe o registro.

Desde já agradeço

ob

Paiva

Salvar e restaurar Posicao dos DBF

Enviado: 26 Out 2012 11:40
por Jairo Maia
Olá Paiva,

Uma rotina que uso para salvar e restaurar o ambiente é esta:

Código: Selecionar todos

Function Ambiente( db_, in_, reg_, salva )
If (salva)
  db_:=Alias()
  in_:=IndexOrd()
  reg_:=Recn()
ElseIf !Empty( db_ )
  Sele ( db_ )
  DBSetOrder( in_ )
  Go reg_
Else
  Sele (0)
Endi
Return Nil
Para salvar o ambiente, sempre declaro como local as variáveis db_, in_, reg_, e chamo a função assim:

Código: Selecionar todos

Ambiente( @db_, @in_, @reg_, .T. )  // salva o ambiente atual
Para restaurar na saida da função chamo assim:

Código: Selecionar todos

Ambiente( db_, in_, reg_, .F. )  // retorna ambiente amterior
Porém, a duplicação de registro não é problema de indices deslocados, mas sim, SUPERAQUECIMENTO do processador do computador. Verifique em seu cliente, se a máquina está em local arejado, e até mesmo se não pega sol, e ainda, se os coolers estão funcionando corretamente. A duplicação ocorre neste caso.

O melhor mesmo é você montar uma função que checa a base buscando por registros duplicados, e excluindo o excedente.

Salvar e restaurar Posicao dos DBF

Enviado: 29 Out 2012 00:29
por rochinha
Amiguinho,
tenho uns 2 clientes que as vezes aceita 2 registro com a mesma chave (Unica).
Por acaso voce usa o velho truque do RECCO()?

para trabalho em rede esta é a pior opção para dar codificação sequencial.

Veja o post

Salvar e restaurar Posicao dos DBF

Enviado: 30 Out 2012 09:38
por paiva
BOm dia.
Sempre fiz: +- assim para TODOS meus clientes, tanto para obter o NUMERO de Cliente, pedido, orçamento , etc.

ugseq.dbf arq com campos para sequencia Registro UNICO SEM Indice.

use, lock tcodigo =strzero(val(ugseq-<codigo)+1,6)
replace ugseq->codigo with tcodigo
commited
unlock

se o cliente desse um INSERT e depois um ESC ele PERDIA uma sequencia (sem problemas)

somente UM cliente dava problema ai tive que SEMPRE fechar o arq e abri-lo depois (ugseq), POR algum Motivo um terminal fazia e na no servidor NAO era atualizado (rs) ou era atualizado DEPOIS que outro Usuario tambem fazia.


NO caso especifico ATUAL tenho 4 arquivos Pedidos ABertos+ Itens Abertos e Pedidos Faturados+ Itens faturados.
Obtenho a seq no ugseq e depois por segurança Verifico se JA EXISTE no crpedA e no crpedF.

+ recentemente por OBRIGAÇÂO do SEFAZ de NÂO poder ter FURO na sequencia, RESOLVI fazer da MESMA forma,
obtenho a sequencia no UGSEQ + somente apos informarem o Cliente e natureza/Cond Pagamento. E logo a seguir GRAVO o crpedA, dessa forma NAO permito Falha na sequencia. E ainda por cima ANTES de regravar o ugseq com a nova seq e incluir o crpedA eu recuo - 10 na sequencia e AINDA verifico se ela NAO existe no crpedA e no crpedF se NAO existir USO essa numeracao e IGNORO a re-gravacao do ugseq.

OU seja se tinha FURO por algum MOTIVO estaria Usando(recuperando esse furo para o pedido ATUAL)

+ mesmo assim em 1 ou 2 clientes andou acontecendo de ter registro duplicados.


Minha DUVIDA e´se duplicou na CRIACAO do pedido ou se Apos FATURAR (gravo o Registro do crpedA no crpedF e TAMBEM os Itens Abertos no Faturados e depois deleto do crpedA e dos Itens abertos),
vai que apos gravar o crpedF e os Itens Faturadose depois tentar deletar o crpedA e os Itenas Abertos ele NAo consiga (rs).


POR este MOTIVO pensei em SALVAR a SITUACAO do Arquivo (indices, POSICAO e Principalmente FILTROS), desligar tudo e VARRER fisicamente o pedido ABERTO que e´ Pequeno. e se PRECISO fosse o pedido FATURADO de traz para frente uma quantidade X de registro, pelo fato do Pedido Faturado ser MUTO GRANDE.

na GRANDE Maioria dos clientes NUNCA aconteceu de duplicar. Uso terminal SERVER em Praticamente TODOS os clientes. + como nem tudo é PERFEITO, os M. saem do terminal SEM sair do sistema aberto e os M. maiores desligam o servidor todo dia (rs) ai ferra Apesar de EU Abrir e Fechar os arquivos a Cada Programa, se pelo menos deixassem sempre no MENU nao teria problemas.

a cada 4 dias se Não re-indexaram eu FORÇO a re-indexação. + mesmo assim se alguem ficou Pendurado ou entra +- na mesma hora ao tentar Re-indexar outro usuario entrou em alguma opcao do MENU e esta usando determinados arquivos, QUEM estava re-indexando NAO consegue continuar e APESAR das MENSAGENS avisando os M. nao fazem a re-idexação.

o IDEAL seria que se pudesse DAR choque no OPERADOR, quem sabe apos uns X choques ele aprenderia a trabalhar corretamente .

se Por acaso tiveres alguma ideia ou solucao simples que funcione melhor ?
desde ja agradeço

Salvar e restaurar Posicao dos DBF

Enviado: 30 Out 2012 11:10
por Poka
Paiva

Eu uso essa rotina, veja se serve.


Código: Selecionar todos

//
// chamadas
salva_pos("cliente")
// outras rotinas
volta_pos("cliente")
*-----------------------------
funct salva_pos(xnomearq)
   // salva posicao da area
   //area_alias:=(xnomearq)->(alias())
    recno_alias:="recno_alias"+xnomearq
    ordem_alias:="ordem_alias"+xnomearq
    public &recno_alias
    public &ordem_alias
    &recno_alias:= (xnomearq)->(recno())
    &ordem_alias:=(xnomearq)->(indexord())
retu nil
*-----------------------------
funct volta_pos(xnomearq)
    // volta posicao da area
    recno_alias:="recno_alias"+xnomearq
    ordem_alias:="ordem_alias"+xnomearq
    dbselectarea(xnomearq)
    dbsetorder(&ordem_alias)
    (xnomearq)->(dbgoto(&recno_alias))
    rele recno_alias
    rele ordem_alias
retu nil

Poka