Como cambiar ID al cambiar de año
El análisis indica que la expresión (HS_15-0000) estaría compuesta de tres partes:
.- Una fija: "HS_"
.- Una variable cada año: 15
.- Una variable incremental para cada subconjunto año: -0000
Como el guion es un texto, podemos despreciarlo sin mas (o crear números negativos ... lo que no merece la pena)
Considerando que seria menos oneroso (o igual de oneroso) el separar la (parte fija + año) que solo el año, optaría en aras de la simplicidad el utilizarlas conjuntamente con lo que resultaría:
Seleccionar al subconjunto formado por parte fija+año que seria = Left ([el_dato], 5)
En una secuencia tal que HS_15-0123 ==> Left("HS_15-0123",5) ==> HS_15
La parte numérica de ese subconjunto se extraería así: Right ([el_dato], 4)
En una secuencia tal que HS_15-0123 ==> Right("HS_15-0123",4) ==> 0123
Como el resultado (0123) es un texto, para evaluarlo como numero le aplicamos a una función (VAL) : Val( Right("HS_15-0123",4)) ==> 123
Ya tenemos un numero para poder seleccionar al mas alto, algo que se hace con la función DMax.
Para 'juntar' todo eso hay que ponerse de acuerdo en el entorno de aplicación, asi que partiremos de un supuesto:
.- Una tabla con los datos (la llamaremos Facturas)
.- Un campo de esa tabla tipo texto y (al que llamaremos Id_Factura)
.- Tendremos en cuenta el cambio de año (para iniciar una nueva serie).
El mayor de la tabla seria:
= Dmax("Val( Right(Id_Factura, 4))","Facturas") , pero aun no es valido del todo, necesitamos el mayor del subconjunto del año actual, asi que aplicamos condición:
Para la condición tenemos (según se aclaro antes) la parte que implica al año
(... Left("HS_15-0123",5) ==> HS_15 ...)
Quedaria algo como: Left(ID_Factura, 5)
Que hay que comparar con el adecuado al año actual (el año actual = Format(Date,"yy") mas la parte fija:
Left(ID_Factura, 5) = "HS_" & Format(Date,"yy")
La añadimos a lo anterior, la condición:
= Dmax("Val( Right(Id_Factura, 4))","Facturas", "Left(ID_Factura, 5) = '" & "HS_" & Format(Date,"yy") & "'")
Al aplicarlo y en tiempo de ejecución, el motor de Access leería esto:
Dmax("Val( Right("HS_15-nnnn", 4))","Facturas", "Left("HS_15-0123", 5) = 'HS_15' ")
Dmax("Val( "nnnn")","Facturas", "HS_15 = 'HS_15' ")
Dmax("nnnn","Facturas", "HS_15 = 'HS_15' ") ==> nnnn
Aparece un problema, cuando se inicie el 2016 el filtro seria asi:
Dmax("nnnn","Facturas", "HS_15 = 'HS_16' ") ==> NULL (no hay registros creados en el año 2016)
Asi que a la expresión le aplicamos la función NZ:
= Nz( Dmax("Val( Right(Id_Factura, 4))","Facturas", "Left(ID_Factura, 5) = '" & "HS_" & Format(Date,"yy") & "'"), 0)
Y el año 2016 como mayor devolvería un CERO
Lo incrementamos:
= Nz( Dmax("Val( Right(Id_Factura, 4))","Facturas", "Left(ID_Factura, 5) = '" & "HS_" & Format(Date,"yy") & "'"), 0) + 1
Pero el numero queremos que tenga cuatro dígitos, le damos formato:
= Format( Nz( Dmax("Val( Right(Id_Factura, 4))","Facturas", "Left(ID_Factura, 5) = '" & "HS_" & Format(Date,"yy") & "'"), 0) + 1,"0000")
Le añadimos la parte fija (y el guion antes despreciado)
= "HS_" & Format(Date,"yy") " -" & Format( Nz( Dmax("Val( Right(Id_Factura, 4))","Facturas", "Left(ID_Factura, 5) = '" & "HS_" & Format(Date,"yy") & "'"), 0) + 1,"0000")
Lo cual daría como resultado el siguiente al mayor (o el primero de ese subconjunto al iniciar el año).
Una observación importante (que suele pasar desapercibida): devuelve el mayor del subconjunto de los datos GUARDADOS EN LA TABLA, mientras no se guarden en la tabla .... no existen