Gravar numero sequenciais em rede

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

jholanda
Usuário Nível 1
Usuário Nível 1
Mensagens: 5
Registrado em: 23 Dez 2005 08:26
Localização: João Pessoa - Paraiba
Contato:

Gravar numero sequenciais em rede

Mensagem por jholanda »

Caro Amigos Bom Dia e Feliz 2007 para todos

Tenho um programa que grava um numero sequencia no cadastro incial que estar funcionando blz, so que preciso fazer isto agora em varias maquinas o seja em rede e quando faço o numero fica duplicado e isto não pode acontercer, camo faço para que este numero não duplique espero ajuda o mais rapido possivel pois tenho que resolver isto ate o final de jan/2007 ou o cliente vai procurar outra pessoa.

Obrigado
Avatar do usuário
Augusto
Usuário Nível 3
Usuário Nível 3
Mensagens: 473
Registrado em: 26 Ago 2003 17:50
Localização: Maricá/RJ
Contato:

Mensagem por Augusto »

Parceiro... esse assunto, há algum tempo, já foi mais do que discutido aqui no Fórum com zilhões de soluções...

Eu lamento não poder te informar o endereço dos tópicos pois teria que sair fórum a dentro pesquisando mas, o que posso te passar é a forma como eu faço...

Vou tentar te explicar:
Eu uso um arquivo de controle contendo o um campo com o último numero utilizado.
Não hora que preciso desse numero, eu bloqueio o arquivo (FLOCK), incremento esse numero de 1, jogo o resultado na variavel que será utilizada pelo sistema, regravo (c/ COMMIT) esse numero(resultado) e libero (UNLOCK) o aquivo para ser utilizado outra vez... entendeu ??

Espero ter ajudado.
:xau Fui...
goulart@provsul.com.br

Faça da PROVSUL o seu Provedor de Serviços WEB
Visite: www.PROVSUL.com.br
Avatar do usuário
momente
Usuário Nível 3
Usuário Nível 3
Mensagens: 496
Registrado em: 03 Mar 2005 11:53
Localização: São Carlos-SP
Contato:

Mensagem por momente »

Amigo jholanda,

Coloque a sequência em um arquivo, quando por exemplo vc for gerar um pedido, o sistema busca o ultimo gravado, acrescenta mais um e grava neste mesmo arquivo e travando (não esqueça de usar o commit) o registro enquanto vc lança o pedido, assim quando alguem for lançar em outra maquina o sistema ira pegar o próximo e não o mesmo que vc esta lançando.

Existe outras maneiras de se fazer isto, aqui mesmo no fórum ja foi descutido isto, faça uma pesquisa usando a opção de busca.

Espero ter ajudado,


:)Pos
Rogerio L. Momenté
Nada é tão perfeito que não possamos melhorar.
Nunca se explique. Seus amigos não precisam e seus inimigos não vão acreditar.
www.looksystem.com.br
MARCELOG
Usuário Nível 4
Usuário Nível 4
Mensagens: 546
Registrado em: 15 Mar 2005 16:54
Localização: Divinópolis/MG

Mensagem por MARCELOG »

Procure por "auto numerar" ou simplesmente "numerar" que você vai encontrar o o tópico citado pelos colegas.

Caso contrário eu uso esse aqui:

Você cria o arquivo com um campo caractere NOVOCODI com tamanho 6.

Um prá cliente, outro para pedido, etc.

Quando incluir, chame NOVOCODI(NomedoArquivo,"I",cCodigo)
Quando excluir, chame NOVOCODI(NomedoArquivo,"E",cCodigo)

cCodigo é uma variável NIL em caso de inclusão, ou o código a ser excluído.

Isso possibilita a reutilização e números excluídos.



FUNCTION NOVOCODI(cArquivo,cAcao,cCodigo)
/*-------------------------------
-------------------------------*/
LOCAL cAlias, cOrdSetFocus, cOrdScope, nRecno
LOCAL nRetorno

//...Salva ambiente
cAlias := ALIAS()
cOrdSetFocus := ORDSETFOCUS()
cOrdScope := DBORDERINFO(DBOI_SCOPETOP)
nRecno := RECNO()

//...Define vari veis
nRetorno := 0

IF ACAOREDE(5,{||DBUSEAREA(.T.,,cArquivo,,.F.),!NETERR()}) //Uso exclusivo
IF cAcao == "I"
IF LASTREC() == 0
IF (cArquivo)->(ACAOREDE(5,{||DBAPPEND(),!NETERR()}))
nRetorno := 1
(cArquivo)->NOVOCODI := nRetorno
(cArquivo)->(DBCOMMIT())
(cArquivo)->(DBRUNLOCK())
ENDIF
ELSEIF LASTREC() == 1
IF (cArquivo)->(ACAOREDE(5,{||RLOCK()}))
nRetorno := (cArquivo)->NOVOCODI + 1
(cArquivo)->NOVOCODI := nRetorno
(cArquivo)->(DBCOMMIT())
(cArquivo)->(DBRUNLOCK())
ENDIF
ELSE
(cArquivo)->(DBGOBOTTOM())
IF (cArquivo)->(ACAOREDE(5,{||RLOCK()}))
nRetorno := (cArquivo)->NOVOCODI
(cArquivo)->(DBDELETE())
(cArquivo)->(DBRUNLOCK())
PACK
ENDIF
ENDIF
ELSEIF cAcao == "E"
IF (cArquivo)->(ACAOREDE(5,{||DBAPPEND(),!NETERR()}))
(cArquivo)->NOVOCODI := VAL(cCodigo)
(cArquivo)->(DBCOMMIT())
(cArquivo)->(DBRUNLOCK())
ENDIF
ENDIF
(cArquivo)->(DBCLOSEAREA())
ENDIF

//...Restaura ambiente
DBSELECTAREA(cAlias)
(cAlias)->(ORDSETFOCUS(cOrdSetFocus))
(cAlias)->(ORDSCOPE(0,cOrdScope))
(cAlias)->(ORDSCOPE(1,cOrdScope))
(cAlias)->(DBGOTO(nRecno))

RETURN STRZERO(nRetorno,06)


FUNCTION ACAOREDE(nTempo,bAcao)
/*-----------------------------
-----------------------------*/
LOCAL cMsg, cTit, bReacao, lSucesso, lReage

cMsg := HB_OEMTOANSI(;
"Solicita‡Æo de servi‡o nÆo atendida."+CRLF+;
"Tenta por mais "+ALLTRIM(STR(nTempo))+" segundos?")
cTit := HB_OEMTOANSI("A t e n ‡ Æ o")

bReacao := {||MSGYESNO(cMsg,cTit)}

DO WHILE .T.

IF !(lSucesso := _ACAORED(nTempo,bAcao))
lReage := EVAL(bReacao)
ENDIF

IF lSucesso .OR. !lReage
EXIT
ENDIF

ENDDO

RETURN lSucesso
//---------------

FUNCTION _ACAORED(nTempo,bAcao)

LOCAL lSempre, lSucesso

lSempre := (nTempo == NIL .OR. nTempo == 0)

DO WHILE !(lSucesso := EVAL(bAcao)) .AND. (lSempre .OR. nTempo > 0)
INKEY(.5)
nTempo -= .5
ENDDO

RETURN lSucesso
//---------------------------------
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Mensagem por Toledo »

JHolanda, dê uma olhada neste tópico abaixo:

https://pctoledo.org/forum/viewto ... =5952#5952

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Responder