¿Cómo Obtener Diferentes Datos de un Campo?

Espero ser claro y darme a entender. Tengo el campo Clave, en el que se encuentras los diferentes datos como por ejemplo: OFIC-002, OFIC-003, OFIC-004, INCO-0045, INCO-0046, INCO-0047, AZON-0700, AZON-0701, AZON-0702. Lo que yo quiero obtener de este campo son los últimos registros de cada conjunto de claves, es decir, OFIC-004, INCO-0047, AZON-0702. Y que se haga de manera automática ya que con el paso del tiempo se irán aumentando claves, pero que siempre me obtenga la ultima consecutiva de cada conjunto de letras iguales.

2 respuestas

Respuesta

Es una clave alfanumérica ascendente, solo hay que diferenciar la parte fija de la variable (que simulara a un auto numérico).

Por los datos expuestos esto se logra mediante el guion (-), por lo que la parte fija será lo que anteceda al guion y la variable lo que siga al guion, en Access se pueden obtener así:

Parte-fija = Left(Clave,Instr(clave, "-") -1)
Parte-variable = right(Clave, Instr(clave, "-") -2)

Lo mas habitual es utilizar la función de dominio DMax.
En la red hay abundantes ejemplos bajo el titulo de 'falsos-auto numéricos' y se puede crear en una sola línea en la que se tiene en cuenta la generación de nuevas claves (su primera vez: el numero uno) e incrementada en cualquier otro caso.
Habitualmente se utilizan las funciones:
DMAX -- Para obtener el mayor de la parte variable
VAL -- Para convertir el texto (la parte variable) a numero
LEFT -- Para obtener la parte fija
RIGHT -- Para obtener la parte variable
INSTR -- Para localizar el guion el la cadena de texto
FORMAT -- Para reconstruir la parte variable (añadir los ceros y conservar la longitud original)
NZ -- Para devolver un cero si la función DMax devuelve un NULL si no existe en el conjunto

Si se conocen esas funciones, podemos obtener en una sola línea el siguiente, solo se precisa que se le pase como parámetro la parte fija (INCO, AZON ... REVB, AZXC)

Mejor preparo un ejemplo y con MID que es más idóneo

Para una tabla (nombre 'Datos') y un campo (nombre 'CLAVE) con los valores publicados

Se necesita el dato 'Serie' (la parte fija de la clave ... AZON, INCO, OFIC ...)
En base a el:
.- Filtra los datos
.- Toma la parte numérica (que es un texto)
.- La convierte a numero
.- Toma el mayor
.- Le incrementa una unidad

Si se diera el caso de ser una nueva serie, devuelve un cero que incrementa y genera el primero de la serie

NOTA: Es necesario que la parte incremental sea de longitud constante (el numero de ceros), si esta longitud es variable, se tendrá que modificar el 'relleno' de ceros

 Siguiente = Serie & Format(Nz(DMax("Val(Mid(Clave,instr(Clave, '-') +1))", "Datos", "MID(Clave,1,instr(Clave,'-')-1)= '" & Serie & "'"), 0) + 1, "-000")

Gracias por el apoyo, pero la verdad no es lo que buscaba. Lo logré de la siguiente manera. Cree 2 consultas, la primera que me buscara del campo Id todos los registros que empezaran con INCO por ejemplo, y la segunda consulta que de la consulta 1 buscara el máximo registro. De ahí en mi formulario en el textbox se plasmara el resultado de la consulta 2. 

Una vez más gracias por el apoyo. 

Hay muchas formas de programar, cuando se trata de series consecutivas que comparten espacio (ejemplo: una tabla con las facturas en las que se pretende diferenciar por serie (serie AAA = trabajador uno, serie BBB trabajador 2 ...)
En estos casos lo primero: elegir con que serie se desea interactuar (si son facturas, quien las emite sea el emisor un trabajador o un grupo).
Para facilitarle al usuario la elección: un combo con dos campos (el trabajador, grupo o sección en un campo -el visible- y en el otro el código que se le asigne -que oculto hace la misma función-.

Seleccionado uno de los Items del combo (por ejemplo 'Juan, sección de pijamas') se dispone del dato indispensable que he denominado en el ejemplo como 'Serie'.

Y vamos a crear una nueva factura: click en ¿? Y se generara la siguiente: que será 'la mayor' de esa serie (la ultima es un dato ambiguo) a la que se le añade una unidad.

OFIC-003 ====> OFIC-004

Ello permite generar un ID sin repeticiones con un único campo (es mas fácil de relacionar)

Es una forma de lograrlo que se adaptara o no a la necesidad, y eso (la adaptación) depende del programador y la gestión de datos que necesite.
No es mejor o peor porque se pueda hacer con una única línea y un único campo o necesite mas de una línea y campo para obtener el mismo resultado.

Lo correcto es utilizar el método que se entienda y siempre que se adapte a la necesidad real.

Respuesta

El sistema tiene que saber lo que vas a escribir, si INCO, AZON, etc. Puedes hacerlo en el evento al bajar una tecla usando If len([clave])=4 then...o si no quieres calentarte la cabeza, puedes crear una tabla, para el ejemplo la he llamado Dependencias con

Y construir la tabla como

De forma que cuando en el formulario selecciono una dependencia

Automáticamente, me asigna un valor en Clave

Y a medida que vaya rellenado registros

En este caso, pero ya te digo que puedes hacerlo de muchas formas, el código del evento Después de actualizar del combinado es

Private Sub Dependencia_AfterUpdate()
Dim v
v = Nz(DLast("right([clave],4)", "tabla1", "left([clave],4)='" & Me.Dependencia & "' and clave is not null")) + 1
Clave = Dependencia & "-" & Format("" & v & "", "0000")
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas