Página 1 de 2
No. do pedido repetido
Enviado: 15 Out 2013 16:40
por marcos.gurupi
Caros,
Parece que estamos no forum do velho e bom clipper, mas fiz a atualizacao do meu sistema onde os terminais trabalha com XP/Win 7 e o servidor de dados é win2003 server, acontece que apos a atualizacao do sistema tudo estava indo bem... derrepente os no. dos pedidos comecaram a repetir, verifiquei a rotina e estava normal (sempre uso a mesma rotina), modifiquei (segue abaixo a modificação), tudo parecia bem mas derrepente alguem faz um pedido e por acaso nao consegue visualiza-lo e na seguencia se outro vendedor fizer o pedido os no. ficam repetidos ai vira uma bagunça. Alguem saberia me dizer se é algo entre o xhb 1.0.0 q estou usando e o win2003 server ?
Segue abaixo a rotina q uso atualmente para definir no. do pedido:
Código: Selecionar todos
Select 12 // AREA DE PEDIDOS
ordsetfocus(1) //ORDEM DE PEDIDO
dbgobottom()
sPedido:=Pedido+1
DO WHILE .T.
DbSeek(sPedido)
If Found()
sPedido+=1
Loop
Endif
IF TRAVARQIVO(5)
dbappend()
replace pedido with SPEDIDO
Ou sera q o FLOCK nao estah travando o arq. corretamente ?
Código: Selecionar todos
FUNCTION TRAVARQIVO(tempo)
DO WHILE TEMPO > 0
IF FLOCK()
RETURN .T.
ENDIF
TEMPO = TEMPO - 1
ENDDO
RETURN .F.
NOTA: Para nivel de informacao: a rede está instalado com dominio
No. do pedido repetido
Enviado: 16 Out 2013 11:07
por Toledo
Marcos, resta saber o que acontece depois do "replace pedido with SPEDIDO".
Abraços,
No. do pedido repetido
Enviado: 16 Out 2013 21:11
por marcos.gurupi
Vc quer q eu poste o restante do codigo? Eh que no final destravo o arq e volto para tela de vendas. Fica parecendo que a funcao flock() nao esta travando o arq. Por isso outros terminais pegam o mesmo no. De pedido causando a confusao. Estranho que lah estah rodando a versao antiga com xhb 0.97 e tudo corre nromalmente, quando eu coloco o sistema novo comeca bem e de uma hora pra outra o no. Pedido fica repetido
No. do pedido repetido
Enviado: 17 Out 2013 13:58
por JoséQuintas
depois do replace, use:
SKIP 0
UNLOCK
O SKIP além de movimentar o registro, salva o conteúdo anterior.
O SKIP 0 é usado como fake, não movimenta mas salva.
No. do pedido repetido
Enviado: 17 Out 2013 23:10
por marcos.gurupi
Vlw pela dica. Amanha vou implantar a alteracao na empresa e observar...
Posso usar dbskip(0) ?
No. do pedido repetido
Enviado: 18 Out 2013 11:33
por ANDRIL
Após o replace, tente comitar os dados no HD com DbCommit().
Ate+
No. do pedido repetido
Enviado: 18 Out 2013 18:32
por marcos.gurupi
Caro Jose a sua sugestao nao funcionou. Usei assim:
Código: Selecionar todos
SELECT 12 // ARQUIVO DE PEDIDOS
ORDSETFOCUS(1)
DBGOBOTTOM()
SPEDIDO:=PEDIDO+1
DO WHILE .T.
dbseek(sPedido)
If Found()
sPedido+=1
Loop
Endif
IF TRAVARQIVO(5)
dbappend()
replace pedido with SPEDIDO
Skip 0
dbcommit() //TAMBEM NAUM FUNCIONOU
dbunlock()
ELSE
LOOP
ENDIF
EXIT
ENDDO
Caro Andril eu jah havia testado com o dbcommit() e tb nao adianta. Essa rede os terminais estao usando o XP e o servidor eh win2003 server com dominio, serah q pode ser algo relacionado ao dominio ?
Ou mesmo o xhb q estou usando tem alguma incompatibilidade com o win2003 server ?
No. do pedido repetido
Enviado: 28 Out 2013 09:11
por paiva_dbdc
BOM dia
ainda esta com problema ?
uma vez aconteceu comigo e para este usuario tinha que fechar o arquivo e depois abrir ai resolveu.
era como se fosse falha de rede
Paiva
No. do pedido repetido
Enviado: 28 Out 2013 23:54
por marcos.gurupi
Caro amigo, ainda nao resolvei, estou precisando atualizar o sistema no cliente mas nao posso fazer por causa do problema. Conversei com o adm da rede mas nao acredito q irah adiantar.
Sobre fechar o arq e abrir novamente eu terei q estudar o caso, eu trabalho sempre com os arquivos abertos. Ganho em performace. Obrigado pela dica.
No. do pedido repetido
Enviado: 29 Out 2013 06:24
por sygecom
Marcos,
Quem sabe mude a lógica, eu particularmente uso de outra forma, tenho uma tabela chamada sequencia que guarda o ultimo numero usado, quando quero o proximo numero chamao essa tabela localizo o tipo de cadastro travo o registro acresento mais um dou um commit e libero o registro e apartir dai já se sabe que numero usar.
No. do pedido repetido
Enviado: 29 Out 2013 10:02
por paiva_dbdc
Marcos Bom dia
e´Justamente o que faço + para este usuario especifico NAo funcionava
acho que a rede NAo atualizava de imediato entao dava problema
a unica solucao foi fechar e abrir o arquivo toda vz
paiva
No. do pedido repetido
Enviado: 30 Out 2013 00:24
por marcos.gurupi
Leonardo obrigado pela dica mas a sua sugestao esta usando a mesma logica que eu uso com a diferenca que vc usa um arq. que controla a seguencia, se o problema e que a rede nao atualiza (mesmo usando o dbcommit) imediatamente usando um arq. separado para gerenciar a numeracao eu ainda teria o problema da nao atualizacao instantanea.
Paiva, vou tentar usar a sua sugestao. Vai ser complicado principalmente pq a minha estrutura eh usada para arquivos abertos. Vou estudar aqui. Se funcionar com vc acredito que vou ter sucesso. Tomara que nao abra um buraco em outro lugar.

)
No. do pedido repetido
Enviado: 30 Out 2013 01:40
por MARCELOG
Ola Marcos!
Em rede tudo deve ser controlado.
Experimente travar o arquivo, definir e gravar spedido, liberando o arquivo.
O tempo entre a definicao de spedido o travamento do arquivo e gravacao do registro em rede nao comporta a suposicao de inexistencia de mudanca no infimo lapso temporal.
MarceloG
No. do pedido repetido
Enviado: 30 Out 2013 08:04
por ANDRIL
Já que verificou toda sua lógica e "esta certa", parta para a configuração do servidor. Peça para que o administrador de rede desative o cache de disco para ver se resolve. Em outras versões do windows quando ocorrem problema "semelhante" consegui contornar desta forma.
Boa sorte!
No. do pedido repetido
Enviado: 30 Out 2013 14:21
por MARCELOG
Veja bem Marcos.
O usuário X efetua a leitura do arquivo e define a variável sPedido.
Supondo que número lido seja 100, a variável sPedido foi definida como 101.
Assim, faz-se uma tentativa de bloqueio do arquivo e inserção de sPedido (101).
Todavia, noutro terminal, o usuário Y realiza a mesma operação e define sPedido como sendo 101.
Porém, mais rápido que o usuário X, o usuário Y consegue o travamento do arquivo e inserção do valor de sPedido (101), liberando o arquivo.
Assim, como o arquivo está liberado, o usuário X consegue o travamento e inserção do seu valor de sPedido (101), que não foi modificado, liberando o arquivo.
Dessa forma haverá a duplicidade que você não deseja.
A definição de sPedido deve se dar com o arquivo travado, impedindo a definição de sPedido por outros usuários (forma radical).
Quando não, a função de travamento de arquivo deve tentar o procedimento uma única vez.
MarceloG
PS: Provavelmente a sua função de travamento do arquivo tem quantidades de tentativas de bloqueio antes de retornar verdadeiro ou falso, ocasionando o problema.