GERAR CODIGO NA HORA DE GRAVAR REGISTRO

ABDON 14/09/2009 15:24:06
#322825
gente queria saber uma forma de gerar o código na hora de gravar o resgistro, oque acontece no sistema é o seguinte,
quando vou incluir um novo registro faço uma rotina para gerar o código, em algumas empresas que utilizam o sistema atraves de mult-usuário, as vezes ocorre de ser feita uma inclusão ao mesmo tempo dando valores duplicados no resgistro, quero ver alguma de gerar o código quando o usuário
for gravar o registro assim evitara esse erro.

se alguem puder ajudar!!!!!!
vlw[ô]S

SANTANANETO 14/09/2009 15:27:25
#322826
caram tenho isto em uma empresa. Coloquei uma tabela um campo so para isto. é uam campo crescente, toda vez que tenho de adicinar produtos, qualquer tipo de regsitro, leio este campo na hora e adiciono 1, regravo esta campo q adiciono o resitro, assim nao repedete nunca. Cuidado se for no access, ele nao vai pdoer de passar de 32000, senao da erro, o macete é fazer ele currency se mcasa decimal, isto no access


ABDON 14/09/2009 15:32:44
#322828
eu faço essa mesma rotina que vc descreveu, mas olha o que esta acontecendo:

duas pessoas vão fazer a inclusão de um registro na mesma hora e meninuto, e mesmo com essa rotina está regerando código igual, porque verifica o ultimo registro e soma + 1 na mesmo hora.
ABDON 14/09/2009 15:35:24
#322829
e não estou sabendo como resolver, pensei em gerar o código quando o usuário for gravar o registro, mas para fazer esta rotina tenho que fazer um select, e fazendo um select eu perco o ADDNEW, e não estou querendo usar outro Data so para gerar o código.
SANTANANETO 14/09/2009 15:41:54
#322830
Mas vc tem de gerar o codigo na hora da gravação e antes de fazer a gravaçao regrava o codigo novo na tabela de codigos,p q se algue mfor la pégar outro codigo, ja foi adiconado + 1. nao tem erro, faço assim e funciona legal. regravo o codigo antes de inserir os dados., se o cleitne cancelar, tudo bem, a tabela de codigo ja esta incrementada.
ABDON 14/09/2009 16:00:41
#322838
noos mas osh tm essa for????
por assim iria pesar mto a base de dados,
imagina qdo chegar a 20000 registros vai travar seu bd todo fazerndo isso, e ainda corre o risco de dar algum erro no sistema operacional e uma tabela ficar com um valor e a outra com outro ia continuar com o erro, acho q vc encontrou uma for boa de resolver mais é arriscado.
SANTANANETO 14/09/2009 16:13:10
#322843
nao cara, vai ficar so um registro, sempre p mesmo registro, s oque incrementado, a tebela so vai ter um registro, mas toda vez que for gerar um codigo novo, e uvou la no codig oe add + 1, enta o proximo sera aquele q esta la + 1, a tabela do codig os otem u mregistro.

consta = [Ô]select * from cons[Ô]
Set constante = bancodedados.OpenRecordset(consta, dbOpenSnapshot)

While Not constante.EOF
addcons = 0

addcons = constante([Ô]codigocons[Ô]) + 1
consta = [Ô]UPDATE cons SET codigocons = [ô][Ô] & addcons & [Ô][ô][Ô]
bancodedados.Execute (consta)

constante.MoveNext
Wend
DANIKULL 14/09/2009 20:48:54
#322874
ABDON, boa noite.

Amigo eu tinha este mesmo problema e resolvi ele com duas tabelas amais para gerar o código. Este sistema que vou te passar serve para qualquer rotina.
1º. Crie uma tabela tipo Index contendo
- Código sequencial criado pelo proprio sistema e noa por auto-incremento
- tabela aberta (nome da tabela)
- usuario que a abriu
- modo de abertura (inclusão, edição, exclusão) tipo bollean

2º. Crie outra tabela tipo Index_Campo
- Código sequencial criado pelo proprio sistema e noa por auto-incremento
- código da tabela Index
- Numero sequencial baseado no ultimo código cadastrado da tabela aberta
- Se o código não foi gravado (tipo bollean)

Como funciona:

O usuário abre a tabela em modo de inclusão entãoi registra-se na tabela Index o código, o usuario que abriu a tabela e modo=Inclusão. Na tabela Index_Campo vai o código para a ação, o código da tabela Index e, vamos supor que estou incluir um novo cliente e o ultimo código foi [txt-color=#b40404]001525[/txt-color], no vampo ID vai ser armazenado o registro [txt-color=#b40404]001526[/txt-color]. Suponhamos que outro usuario va incluir um novo cliente so que ja temos um usuario incluindo outro cliente. No modo convensional seria gerado o mesmo código tanto para o primeiro usuario quanto para o segundo, so que neste caso ele não vai pegar mais na tabela cliente e sim na tabela Index_Campo, que neste caso será [txt-color=#b40404]001527[/txt-color], desta forma se outro usuario for incluir um novo cliente sera feita da mesma forma.
Se por acaso o primeito usuario cancela a inclusão o sistema não apaga esta linha da tabela Index_Campo e marca como registro gerado não incluso, pois assim que outro usuario for incluir o um novo cliente o sistema não vai gerar o código [txt-color=#b40404]001528[/txt-color] e sim pegar o código 001526 que ja havido sido gerado.
Um detalhe é que sempre que o registro for gravado na tabela a linha gerada na abela Index_Campo deverá ser apagada, este caso não ocorrerá se o usuario cancelar a inclusão pois assim se um segundo e terceiro usuario gerou novos registros o 1º registro gerado e cancelado nao ficara perdido, ok??

Se você não entendeu poste a dúvida que explico com o maior prazer...


LLAIA 14/09/2009 21:41:50
#322879
o que o NILSON2 postou é simples e funciona que é uma blz!!! Deixa o bd resolver pra vc!!!
ERLANMG 14/09/2009 21:54:15
#322883
Caros amigos
Sei que todos falam que DAO está ultrapassado, mas me atende perfeitamente, ainda não tive problemas.
Mas a questão não é essa.
A respeito do topico, dentro do botão gravar uso como segue:

Data2.RecordSource = [Ô]Select * from clientes order by codigo[Ô]
Data2.Refresh
If Data2.Recordset.EOF = True Then
text1.Text = geracodigo([Ô]1[Ô], 5)
Else
Data2.Recordset.MoveLast
text1.Text = geracodigo(Data2.Recordset!Codigo + 1, 5)
End If

Data1.Recordset.Index = [Ô]codigo[Ô]
Data1.Recordset.Seek [Ô]=[Ô], text1.Text
If Data1.Recordset.NoMatch = False Then
call exibir
MsgBox ([Ô]Código já cadastrado![Ô]), vbExclamation
call zerar
text1.SetFocus
Exit Sub
End If
Data1.Recordset.AddNew
call gravar
Data1.Recordset.Update

A probabilidade dos usuários clicarem ao mesmo tempo no botão gravar é muito baixa.

Por isso sempre deu certo comigo.





Página 1 de 2 [13 registro(s)]
Tópico encerrado , respostas não são mais permitidas