INCREMENTO DE NUMEROS.

USUARIO.EXCLUIDOS 13/04/2007 17:09:15
#211808
Alguém sabe se tem como eu colocar uma rotina em um form (evento load ou algo parecido) que faça com que ele incremente +1 independente de banco de dados ou de quantas vezes ele é aberto? Por exemplo. Quero que quando eu abrir o form ele já me apresente o último número usado mais um. Depois, quando eu for dando o OK ele vá incrementando mais um nesse número. Se eu abrir e não acrescentar nada (botão OK) ele permanece com o mesmo número. Será que me fiz entender?
é que quero que vá pro meu banco de dados tudo já formatadinho, em vez de ficar acessando BD toda hora pra ver se número já existe. Quero que o form (ou outra rotina) mesmo cuide desse incremento.
CLEVERTON 13/04/2007 17:14:36
#211812
Mas porque vc não coloca um campo autonúmerico e vem de ficar consultando o BD pra saber o último número ?
USUARIO.EXCLUIDOS 13/04/2007 18:02:13
#211829
Pessoalmente nao gosto de autonumericos - prefiro ter o controle na mao dos meus dados...

mas nao vejo pq nao fazer um
Select Max(ID) + 1 from tabela;
na abertura do form - se o banco for monstruosamente grande vc nao esta falando de Access - neste caso vc vai ter trigger, e neste caso vc cria uma trigger que na hora de inserir registro no banco - ele busca o ultimo numero e adiciona pra vc... se vc realmente precisa buscar dados - e de novo partindo do principio que seu banco eh monstruoso - certamente o campo eh chave - o que implica dizer que ele tem um indice - neste caso a pesquisa por MAX nao deveria durar mais do que meio segundo (se demorar)

agora se for no access - vai de boa com o SQL - se quiser fazer mais rapido usa ate o DAO inves de ADO e vc vai ter o resultado em menos de .01

se isso nao for o suficiente - gera uma chave no registro do windows (existem exemplos de codigo no site com isso) - toda vez que for fechar o programa vc guarda o proximo numero na chave e toda vez que abrir o programa vc pega o numero de lah
LCSD 13/04/2007 22:05:34
#211849
Bruno

Ele poderia ter uma tabela em que armazene os numeradores, eu tenho no SQL Server mas o Access suporta fácil.

Gere uma tabela com 2 campos, o NomeNumerador e o CodigoNumerador e na função voce retorna o valor, exemplo:

CodCli = Incremento("CodigoCliente")

Na rotina de Incremento monte um Select Case para montar a SQL de consulta e no RecordSet você incrementa


rsTemp(0).Value = rsTemp(0).Value + 1
rsTemp.UpDate

Incremento = rsTemp(0).Value

Pronto, esta rotina dará suporte a sempre que necessitar de códigos incrementais sem necessitar Triggers.

Até Breve
[s41]


USUARIO.EXCLUIDOS 13/04/2007 23:56:54
#211852
hehe - grd kpera...
faz tempo q nao vejo vc na area...

acho que sou um dos "romanticos" da programacao - nao tem jeito - update pra mim eh usando SQL

eu ja vi isso que vc ta descrevendo antes - sinceramente - se seu banco nao tem 90 mil registros e ta trabalhando com access - eu topo vai, nao concordo mas topo... (isso pq deveria buscar relativamente rapido)

se tem mais do que isso e vc precisa destes dados o tempo todo - por favor me diz q ta pelo menos com um mySQL - e neste caso - eu subo o numero para pelo menos 900 mil - e acredito ainda q vc ta usando indices

agora se ta na casa de 9 milhoes - talvez seja a solucao ideal - mas ate lah - vc vai tentar usar algo mais robusto do que VB
LCSD 14/04/2007 16:39:56
#211912
Bruno

A Tabela de Sequências é para uso geral, por exemplo, CodigoDeProcessos, CodigoDeMinutas -> neste caso retorna 2 valores, Número ANUAL da Minuta e o Ano, então eu tenho que "ZERAR" todo dia 01 Janeiro, etc....

Então nesta rotina tem "n" configurações, tratadas no Select e no retorno da função.

Sem programar uma Trigger é uma saída, não sei se você me entendeu mas seria o seguinte

Reg________Campo______________Valor
01_________CodigoProcesso_____455
02_________CodigoMinuta_______758

Quando a função fosse incrementar o novo processo, seria o 456 e atualizaria ANTES o valor, depois repassaria

CodCli = Incremento("CodigoProcesso")

Na rotina de Incremento monte um Select Case para montar a SQL de consulta e no RecordSet você incrementa


rsTemp(0).Value = rsTemp(0).Value + 1
rsTemp.UpDate

Incremento = rsTemp(0).Value

Pronto, ela dá suporte para vários retornos.

Foi isto que você entendeu?


USUARIO.EXCLUIDOS 14/04/2007 17:35:51
#211915
Gente, tipo, eu também prefiro usar o banco de dados para controlar isso, mas por exemplo com firebird eu uso GEN_ID dele, que usa um generator (nada mais é que um campo que armazena números), daí eu incremento o número e recupero "ao mesmo tempo", não correndo o risco de duas máquinas gerarem o mesmo número...

NETOCAZUZA, eu não aconselho você a gerar o número na hora que entrar no form, porque imagine se você está com o programa em rede e duas pessoas entram no cadastro de cliente juntas, ele irá gerar o mesmo número para ambas, e a que tentar gravar por último terá um erro, o ideal é gerar o número na hora que gravar ou então usar uma tabela de incrementos como disse o nosso mummy KPella (no caso do firebird usaria generator)...

Enfim, acho que depende sim do banco de dados, pois dependendo de qual utiliza pode aproveitar melhor suas funcionalidades...

Qualquer dúvida poste...flw
USUARIO.EXCLUIDOS 16/04/2007 10:09:16
#212055
Na verdade o meu problema é muito simples pois sou iniciante em VB. To fazendo um programa gerenciador de uma escola só pra treinar. Então tem um form de digitação de matrícula. Só queria que na abertura desse form, ele trouxesse o campo da matrícula já previamente preenchido com o número atual mais ano 0012007, 0022007, 0032007, então seria alguma coisa do tipo número + year pois com isso, ao mudar o ano letivo, não correriamos o risco de ter matrícula duplicada e ficaria fácil pesquisar o ano que o cara entrou na escola.
Até dei uma lida no tutorial e vi que dá pra fazer isso usando autonumeração dá tabela, mas to tentando isso e não tá dando certo. Devo tá fazendo alguma besteira. Pode ser uma parada bem simples pq o programa não é tão avançado assim.
USUARIO.EXCLUIDOS 16/04/2007 11:14:27
#212069
Ah, agora explico melhor, mas como já disse não recomendo gerar o número ao abrir o form, mas sim ao gravar o registro...

Quanto à colocar o ano, também não acho legal, primeiro que ficaria um número muito grande no banco de dados, além do mais pelo que vejo nas escolas, você cadastra um aluno, e o RM (registro de matricula) será o mesmo sempre, ou seja, quando ele se matricular, você pode gerar um número automático normalmente, e em outro campo você coloca o ano letivo em que ele se matriculou, daí pra pesquisar existirá dois campos, RM e ANO, ou ainda você pode "gravar" os campos separados, mas exibi-los juntos, exemplo:

txtCodigo = rst("CODIGO_ALUNO") & "." & rst("ANO_MATRICULA")


Mesmo sendo um sistema simples, pense em fazer separado o cadastro de alunos e a matricula, pois imagina, se fulano estuda em 2005, sai em 2006, mas decidi entrar em 2007, quer dizer que o seu RM será o mesmo, não irá perder o cadastro, apenas adicionar uma matricula, ou ainda você pode imaginar uma escola com cursos diferentes matutinos e noturnos, onde uma pessoa entra em dois ao mesmo tempo, ela teria dois cadastros? ou duas matriculas?

Bem, espero que tenha entendido o que quis passar, qualquer dúvida é só postar...flw
USUARIO.EXCLUIDOS 17/04/2007 09:52:16
#212231
Tem razão Matioli. Segui o seu conselho e to digitando a matrícula. Tá funcionando tudo certinho. Agora, qual o comando que dou pro tex box já vir preenchido com o próximo número? Pq por enquanto to atribuindo e já tem uma rotina impedindo números duplicados.Mas pra travar mais ainda, gostaria que ele consultasse na tabela o número do último registro e já retornasse na abertura do form (último registro mais um).
USUARIO.EXCLUIDOS 17/04/2007 10:12:43
#212238
Resposta escolhida
sql = "select max(matricula) + 1 as Mat from alunos"

txtMatricula.text = rs!Mat

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