Generate Unique Id only numbers

How can I generate a Unique Id where all are numbers and not letters?

Solved Solved
0 13 3,542
1 ACCEPTED SOLUTION

hI @Yesenia_Leon,

Have you taken a look at RANDBETWEEN() function?

However , please note that the repeat probability of a numeric unique number generated by RANDBETWEEN() will be significantly higher than an equal length alphanumeric UNIQUEID()

View solution in original post

13 REPLIES 13

hI @Yesenia_Leon,

Have you taken a look at RANDBETWEEN() function?

However , please note that the repeat probability of a numeric unique number generated by RANDBETWEEN() will be significantly higher than an equal length alphanumeric UNIQUEID()

Thank you very much for your help.

Another often overlooked problem to be aware of…these apps run in a distributed multi-user system. When generating your own unique number, you have to take extra precaution to prevent two different users from obtaining the same unique number. This is not an easy task. The more users in the app, the more likely a clash will occur.

Thank you, let’s keep that in mind.

I use
MAX(BIObjects[Id]) + 1

Where or how did you use this?

Hola Pedro! en cada tabla se necesita siempre un valor ID único que permita identificar cada una de las filas que las componen. En la mayoría de los casos este valor es definido aleatoriamente, con una string de letras y números generados automaticamente bajo la expresión UNIQUEID(), si Appsheet reconoce que una de tus columnas tiene valores que justifiquen elegirla como KEY, entonces en INITIAL VALUE se escribirá automáticamente esta función. La otra opción es usar una columna que sepas con 100% de seguridad que va a tener valores que se repetirán. Por ejemplo si tenes una lista de clientes y estos clientes tienen correos electrónicos, la columna de Emails sería ideal, porque los correos son valores únicos que corresponden a determinados sujetos.

Ahora en muchos otros casos, cuando alguien llega a Appsheet con preconceptos u otras formas de organización de procesos, los valores aleatorios no satisfacen las necesidades inmediatas, porque por ejemplo en la empresa se usan valores identificatorios progresivos, para ordenar stock quizás, o para mantener un conteo, etc. Entonces es aquí donde se buscan IDs consecutivos, que son muy peligrosos dentro de una estructura relacional. Es imperativo que los valores sean únicos, y los consecutivos pueden repetirse si se dan ciertas circunstancias.

Personalmente para mí la mejor solución sería tomar valores relativamente consecutivos, referidos al tiempo (fecha y hora) y agregarle al final una string aleatoria de números. Así como se organizan por ejemplo los serial numbers en la producción de guitarras. Si miras uno de esos números podes descubrir cuándo se fabricó, donde, etc…

Esta expresión concatenada te daría ese resultado (aunque seguro hay formas de sintetizarla):

YEAR(NOW()) & 
MONTH(NOW()) & 
DAY(NOW()) & 
HOUR(TEXT(TIMENOW()())) & 
MINUTE(TEXT(TIMENOW())) & 
SECOND(TEXT(TIMENOW())) & 
RANDBETWEEN(10000000, 99999999)

El resultado de esas expresión es por ejemplo: 2021123015554751696191
Siendo los 4 primeros dígitos el año, los 2 siguientes el mes, los dos siguientes el día. Después vienen la hora, minutos y segundos, que estos pueden tener 1 o 2 fígitos cada uno (se puede lograr que tengan imperativamente 2 dígitos). Los 8 números restantes son aleatorios. Así lograrías un número consecutivo en la primera mitad del resultado, y un número aleatorio al final.

Saludos!

Excelente, gracias por tu consejo, tomaré la recomendación de dejarlo con la expresión concatenada, ya que actualmente lo tenía con uniqueid(), pero para ser sincero, me parecía práctico (por la poca cantidad de caracteres), pero a su vez, me parecía un poco débil por sentir que podía llegar a repetirse.

Que tengas un excelente día!.

Me alegro que te haya servido! Si no confías en UNIQUEID() por tener pocos caracteres (aunque no son pocos, son bastantes millones de combinaciones), también podes concatenar dos, tres, cuatro, los que quieras, expresiones UNIQUEID()

UNIQUEID() & UNIQUEID()

Eso te daría de resultado 16 caracteres aleatorios, prácticamente infinito.

You might also consider using UNIQUEID("UUID").

Thank you so much Steve, will consider it too.

Alternatively:

(TEXT(NOW(), "YYYYMMDDHHMMSS") & RANDBETWEEN(10000000, 99999999))

See also TEXT()

You could add another 10,000,000 random numbers using this instead of just RANDBETWEEN(10000000, 99999999):

RIGHT(("00000000" & RANDBETWEEN(10000000, 99999999)), 8)

I don’t know what the actual limits of RANDBETWEEN() are, but I would feel comfortable using an upper bound up to 2 billion (2,000,000,000).

Gracias Steve! Siempre atento, se aprecia mucho tu trabajo y dedicación!

Top Labels in this Space