Página 1 de 1
Adicionando novo registro em REDE
Enviado: 04 Set 2007 15:32
por Beto.bh
O lance é o seguinte: tenho um sistema em rede e tenho q cadastrar clientes e produtos em mais de um terminal ao mesmo tempo. Tanto os clientes novos como os produtos novos tem codificação automática (eu pego o codigo do último resitro, somo +1 e eis o novo código). Acontece que se duas pessoas entrarem ao mesmo tempo, ambas terão um "cliente" diferente mas com o mesmo código. Como faço pra evitar isso sem ter que travar o arquivo? Travando o arquivo eu resolvo isso mas gero um outro problema - somente um usuário pode cadastrar enquanto o(s) outro(s) tem q aguardar a liberação do arquivo.
Vlw galera...!!!
Enviado: 04 Set 2007 16:00
por ederxc
Seguinte , só pega o numero do cliente na hora de gravar , ou seja trava o arquivo com Flock() pega o ultimo resgistro e grava , após terminar a gravação dbunlock() mostra o numero que foi salvo e sai ! assim ninguem pega o numero de ninguem
:)Pos
Enviado: 04 Set 2007 16:12
por Beto.bh
Cara... exceltne idéia...rsrsrs
Magavilha... vai funcionar!!!
Grande abraço!

)
Eu fiz o seguinte
Enviado: 04 Set 2007 16:30
por Beto.bh
sua idéia ñ funcionou 100% mas me serviu pra resolver de outra forma: eu travo o último registro (q vai me dar o valor pro prx codigo) logo antes de pegar o codigo dele, daí o se alguem tentar pegar o mesmo valor ñ vai conseguir. No seu caso deu erro pq se algue estiver alterando a ficha de um cliente qualquer (no modo compartilhado) ñ vai me permitir abrir o mesmo arquivo em modo exclusivo... então eu travo só o último registro e pronto... bingo!
Mas vlw assim mesmo, como eu disse sua idéia me ajudou mt!
Enviado: 05 Set 2007 15:43
por alaminojunior
Receitinha do bolo:
1º Crie um arquivo dbf contendo este numero;
2º No momento de se pegar este codigo, abra o arquivo em modo exclusivo; ( Exclusivo sim senhor ! )
3º Faça com que esta rotina verifique a abertura do arquivo, se falhar tente de novo.
4º Ao terminar, não se esqueça de fecha-lo;
O processo é muito rapido, já uso este exemplo em meus sistemas de orcamento, e funciona que é uma beleza !!!
Boa sorte
Enviado: 05 Set 2007 16:07
por ederxc
"O lance é o seguinte: tenho um sistema em rede e tenho q cadastrar clientes e produtos em mais de um terminal ao mesmo tempo. Tanto os clientes novos como os produtos novos tem codificação automática (eu pego o codigo do último resitro, somo +1 e eis o novo código). Acontece que se duas pessoas entrarem ao mesmo tempo, ambas terão um "cliente" diferente mas com o mesmo código. Como faço pra evitar isso sem ter que travar o arquivo? Travando o arquivo eu resolvo isso mas gero um outro problema - somente um usuário pode cadastrar enquanto o(s) outro(s) tem q aguardar a liberação do arquivo. "
R:Errado
Por que não é para ficar com o DB travado a vida toda , voce trava na hora de salvar e depois destrava , dessaforma voce pode sim usar terminais atendendo clientes ao mesmo tempo ,horas pq, pq o tempo de pegar um registo e gravar é menos de um segundo , e na sua rotina de travamento voce devera por dentro de um contador , tipo 5 segundos
ex:
estou atendendo o Dunha , lanaçando o pedido dele e voce ae lançando o pedido do jão de barro , até ae NENHUMA numero do db nada nele foi realizado , digamos que mandamos salvar ao mesmo tempo
se no caso seu teminal travar primeiro o meu contador no "caso 5 segundos " fica tentando travar tbm e como voce trava e sai em menos de 1 segundo , como estou dentro de um loop , contador , consigo logo em seguida pegar o numero que voce acabou de lançar e adicionar mais 1
OBs:o Tempo do contador se deve a quantidade de maquinas em rede , se for muitas maquinas atendendo ao mesmo tempo " não tenho certeza" mas creio que 5 segundos seja pouco....
:|<
Enviado: 06 Set 2007 22:13
por marbio
Boa Noite
Olha se server este ex:
****************** Cadastro de Cliente *********
#include "common.ch"
#include "inkey.ch"
save screen to cli001
close
box3dr2(07,13,41,54)
box3df2(05,20,04,75)
setcolor(cor4)
@03,15 say empresa
@01,05 say 'Usuario.: ' +user
@05,07 say ' Cliente - Inclusao '
setcolor(cor2)
select 1
if netuse("Cliente",.f.,10)
set index to cli001,cli002
else
msgab()
return
endif
select 2
if netuse("clicod",.f.,10)
else
msgab()
return
endif
select 3
if netuse("bairro",.f.,10)
set index to bai001
else
msgab()
return
endif
do while .t.
xcodigo=0
xnome=space(40)
xendereco=space(35)
xcidade=space(25)
xcep=space(9)
xbairro=space(25)
xuf=space(2)
xpai=space(25)
xmae=space(25)
xref=space(25)
xcpf=space(14)
xrg=space(14)
xtel1=space(14)
xtel2=space(14)
xlimete=0
xprazo=0
xobs=space(40)
xnasc=ctod("")
xmala='N'
xsn=space(1)
xblo='N'
@07,07 say 'Nome.....:' get xnome pict '@!s30'
@07,50 say 'Data Nasc:' get xnasc pict '@!'
@08,07 say 'Endereco.:' get xendereco pict '@!'
@09,07 say 'Cidade...:' get xcidade pict '@!'
@10,07 say 'Bairro...:' get xbairro pict '@!' valid bairro(xbairro)
@11,07 say 'CEP......:' get xcep pict '@!'
@11,40 say 'Estado...:' get xuf pict '@!'
@12,07 say 'Nome Pai.:' get xpai pict '@!'
@13,07 say 'Nome Mae.:' get xmae pict '@!'
@14,07 say 'Ref......:' get xref pict '@!'
@15,07 say 'CPF/CNPJ.:' get xcpf pict '@!'
@15,40 say 'Doc. RG..:' get xrg pict '@!'
@16,07 say 'Telefone.:' get xtel1 pict '@!'
@16,40 say 'Celular..:' get xtel2 pict '@!'
@17,07 say 'Limete R$:' get xlimete pict '@E 9,999,999.99'
@17,40 say 'Prazo....:' get xprazo pict '999'
@18,07 say 'OBS......:' get xobs pict '@!s20'
@19,07 say 'Bloqueio.:' get xblo pict '@!'
read
@22,05 say space(60)
save screen to tela1
box3dr2(10,14,27,39)
xc=0
@11,30 prompt 'Confirma'
@12,30 prompt 'Cancela '
@13,30 prompt ' Sair '
menu to xc
do case
case xc=1
restore screen from tela1
if xnome=space(40)
restore screen from cli001
do cliente
endif
select 2
if rlock()
xcodigo=codcli
replace codcli with codcli+1
dbcommit()
unlock
endif
@06,07 say 'Codigo...: ' +str(xcodigo)
select 1
append blank
replace codigo with xcodigo
replace nome with xnome
replace endereco with xendereco
replace cidade with xcidade
replace bairro with xbairro
replace cep with xcep
replace uf with xuf
replace pai with xpai
replace mae with xmae
replace ref with xref
replace cpf with xcpf
replace rg with xrg
replace tel1 with xtel1
replace tel2 with xtel2
replace limete with xlimete
replace prazo with xprazo
replace obs with xobs
* replace data with date()
replace nasc with xnasc
replace mala with xmala
replace bloqueio with xblo
dbcommit()
unlock
inkey(0)
@06,07 say 'Codigo...: '
case xc=2
do cli001
case xc=3
restore screen
do cliente
endcase
if lastkey()=27
restore screen
do cliente
endif
enddo