Antonio escreveu:Desculpe se eu estiver sendo um tanto ignorante, mas na pratica não entendi muito bem esse esquema do (Randon()). Veja: estou cadastrando itens..... esses itens são numerados.... 000001, 000002...... 00000n.
Não se desculpe. A ignorância é parte importante do aprendizado. Até porquê se eu próprio fosse pedir desculpas pela minha ignorância em diversos assuntos, viveria me desculpando.
Antes da explicação, quero primeiro criar um pressuposto. Explico: esses números de controle, para mim, servem única e exclusivamente para dar suporte à criação de vínculos referenciais. São os números que ligam, por exemplo, duplicatas aos clientes que deverão pagá-las. Eu não permito que o usuário use este número para selecionar um cliente, fornecedor, etc. Para isso eu disponho de métodos que acho mais eficientes. Prefiro realmente manter meus usuários afastados desse tipo de código.
Talvez sua filosofia de trabalho seja diferente. Mas vou partir do pressuposto que você pensa como eu e prefere manter seus usuários longe desses números.
Eu estou dizendo isso tudo apenas porquê números seqüenciais são mais "amigáveis" que números aleatórios na forma como eu os represento em arquivo, conforme a explicação a seguir.
Quando precisamos implementar uma solução para criar códigos numéricos de controle, é natural que pensemos no velho esquema do
último + 1. Uma seqüência crescente, sem o reaproveitamento de códigos de registros apagados. Esse é o pensamento natural.
Mas, como esse número não estará acessível ao usuário, ele não precisa necessariamente ser um número rigorosamente seqüencial. Pode ser um número qualquer, pego ao acaso, através de algum gerador de números aleatórios, do tipo que se obtém com a função Random() da CATools, que é a função que eu uso para este fim. Uma grande vantagem a destacar: como é um número aleatório, precisamos apenas de uma pequena porção do tempo da CPU para obtê-lo. Por outro lado, um número seqüencial requer uma ida ao fim do arquivo de dados. Isso requer muito mais processamento. Pior ainda no caso dos contadores sendo armazenados em arquivos à parte, como eu próprio fazia no passado. Muito mais tempo de CPU será necessário, já que isso implica numa prévia abertura deste arquivo e a busca por uma chave de identificação do contador. Assim, gerar um número aleatório é muito mais rápido. Só há um porém: um número, sendo aleatório, pode já existir no arquivo de dados, em algum registro. É muito difícil disso acontecer. Principalmente se for um número razoavelmente largo, com uns 9 dígitos ou mais, digamos assim. Mas eu sou por natureza muito desconfiado. Por isso, para não ser pego com as calças na mão, após gerar o número, me certifico de que ele é realmente único, pesquisando-o no arquivo. Como esse código sempre faz parte de uma chave de índice, essa pesquisa é extremamente rápida.
Assim foi a primeira parte da explicação: porquê e como gerar o número aleatório e garantir sua unicidade.
A segunda parte diz respeito à forma de armazenar esse número. Isso é uma característica à parte. Nem é tão essencial ao processo em si. você poderá armazenar esse código do jeito que melhor lhe aprouver. Mas eu tenho a mania de sempre querer economizar algum espaço nos registros. Para isso eu utilizo uma nova base numérica, chamada de alfadecimal, que é semelhante à base hexadecimal, mas que utiliza todas as letras do alfabeto (ou mais). Não sei se você tem interesse nisso. Mas a título de curiosidade, observe a tabela abaixo. Há três tipos de bases: alfadecimal simples (apenas letras maiúsculas), extendida (inclui também as minúsculas) e super-extendida (inclui também alguns caracteres gráficos - mas imprimíveis). Note bem o ganho de espaço na conversão. No melhor caso, uso apenas 9 dígitos do alfadecimal super-extendido para representar um número decimal de 18 dígitos.
Uma curiosidade: dada a natureza dos dados com os quais trabalho, meus códigos de identificação tem apenas 6 dígitos e eu uso a base alfadecimal simples, com letras maísculas apenas. Para o meu caso é suficiente.
Código: Selecionar todos
Dígitos Alfadedimal Decimal Dígitos
------- ----------- ----------------------- -------
1 Z = 35 2
2 ZZ = 1.295 4
3 ZZZ = 46.655 5
4 ZZZZ = 1.679.615 7
5 ZZZZZ = 60.466.175 8
6 ZZZZZZ = 2.176.782.335 10
7 ZZZZZZZ = 78.364.164.095 11
8 ZZZZZZZZ = 2.821.109.907.455 13
9 ZZZZZZZZZ = 101.559.956.668.415 15
Alfadecimal
Dígitos Extendido Decimal Dígitos
------- ----------- ----------------------- -------
1 z = 61 2
2 zz = 3.843 4
3 zzz = 238.327 6
4 zzzz = 14.776.335 8
5 zzzzz = 916.132.831 9
6 zzzzzz = 56.800.235.583 11
7 zzzzzzz = 3.521.614.606.207 13
8 zzzzzzzz = 218.340.105.584.895 15
9 zzzzzzzzz = 13.537.086.546.263.550 17
Alfadecimal
Super
Dígitos Extendido Decimal Dígitos
------- ----------- ----------------------- -------
1 ~ = 93 2
2 ~~ = 8.835 4
3 ~~~ = 830.583 6
4 ~~~~ = 78.074.895 8
5 ~~~~~ = 7.339.040.223 10
6 ~~~~~~ = 689.869.781.055 12
7 ~~~~~~~ = 64.847.759.419.263 14
8 ~~~~~~~~ = 6.095.689.385.410.815 16
9 ~~~~~~~~~ = 572.994.802.228.616.700 18
Por enquanto acho que é só o que posso dizer sobre o assunto. Mas se eu não fui claro o suficiente e você ainda tiver alguma dúvida, é só dizer.
[]'s
Maligno
http://www.buzinello.com/prg
PS: Na verdade eu utilizo uma combinação das funções Rand() e Random().