Adicionando novo registro em REDE

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Beto.bh
Usuário Nível 1
Usuário Nível 1
Mensagens: 18
Registrado em: 23 Ago 2007 09:55
Localização: bh/MG

Adicionando novo registro em REDE

Mensagem 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...!!!
ederxc
Usuário Nível 4
Usuário Nível 4
Mensagens: 619
Registrado em: 15 Set 2006 08:40
Localização: Pedreira -SP-

Mensagem 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
C:\Xharbour\Xdev\Fw\VSX
Beto.bh
Usuário Nível 1
Usuário Nível 1
Mensagens: 18
Registrado em: 23 Ago 2007 09:55
Localização: bh/MG

Mensagem por Beto.bh »

Cara... exceltne idéia...rsrsrs
Magavilha... vai funcionar!!!
Grande abraço!

:))
Beto.bh
Usuário Nível 1
Usuário Nível 1
Mensagens: 18
Registrado em: 23 Ago 2007 09:55
Localização: bh/MG

Eu fiz o seguinte

Mensagem 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!
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Mensagem 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
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
ederxc
Usuário Nível 4
Usuário Nível 4
Mensagens: 619
Registrado em: 15 Set 2006 08:40
Localização: Pedreira -SP-

Mensagem 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....


:|<
C:\Xharbour\Xdev\Fw\VSX
Avatar do usuário
marbio
Usuário Nível 3
Usuário Nível 3
Mensagens: 206
Registrado em: 29 Jul 2004 16:26

Mensagem 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
Sempre há uma solucao para os nossos problema clipper.....
Responder