GERAR CODIGO NA HORA DE GRAVAR REGISTRO
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
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
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
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.
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.
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.
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.
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.
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.
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
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
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...
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...
o que o NILSON2 postou é simples e funciona que é uma blz!!! Deixa o bd resolver pra vc!!!
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.
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.
Tópico encerrado , respostas não são mais permitidas