Autonumérico en modo texto complicado

Tengo una duda que me está haciendo perder mucho tiempo y no consigo resolver.
Tengo una BD muy sencilla, en la que simplemente llevo un inventario de documentos en PDF que tengo guardados en mi ordenador, clasificados por temas de ingeniería: fontanería, energía solar, bombas de calor, etc...
Dispongo de una tabla llamada "DOCUMENTOS", en la que tengo las siguientes columnas (todas son de tipo texto):
- ID (clave autonumérica de ACCESS)
- AUTOR
- AÑO
- TITULO
- Tematica
- CODIGO
El campo CODIGO lo compongo aprovechando los 4 primeros caracteres de la temática del documento, más un guión bajo, y 4 dígitos correlativos, de forma que, si tengo (por ejemplo), 3 archivos relacionados con la calefacción, tendrán los códigos: CALE_0001, CALE_0002 y CALE_0003.
Mi problema radica en que yo pretendo que, al añadir un nuevo registro, con un combo despliegue todas las temáticas disponibles, y según la que yo elija, el VBA me detecte el último archivo de esa temática, y automáticamente, me coloque el código a ese nuevo registro. O, dicho de otro modo, si yo quisiera añadir un documento de calefacción, continuando con el párrafo anterior, si yo selecciono en el combo "CALEFACCIÓN", el VBA automáticamente me asignase al nuevo registro el código CALE_0004.
El código que yo estoy empleando es:
Private Sub Cuadro_combinado24_AfterUpdate()
' Al actualizar la temática
' Automáticamente, el código de documento aparece, con un número
' Más que el del último guardado
If Not Me.NewRecord Then Exit Sub
Dim tema As String, texto As String
'Guarda las primeras 4 letras de la temática (sin acentos), para crear el código
tema = Left(Me.Cuadro_combinado24, 4) & "_"
tema = Replace(tema, "Á", "A")
tema = Replace(tema, "É", "E")
tema = Replace(tema, "Í", "I")
tema = Replace(tema, "Ó", "O")
tema = Replace(tema, "Ú", "U")
texto = Format(Nz(DMax("Val(Right(CODIGO, 4))", "DOCUMENTOS", "Val(Left(CODIGO, 4)) = " & Val(tema)), 0) + 1, "0000")
End Sub
Para intentar simplificaros la tarea, mi idea es la siguiente: asigno a la variable "tema" las 4 primeras letras de la temática elegida en el cuadro desplegable 24, y le digo al VBA que encuentre el valor máximo de los códigos ya existentes, de la misma temática que tengo en la variable "tema".
Mi problema es que siempre me busca directamente el valor máximo de todos los códigos que ya existen (y no solamente de la temática que yo elijo). Si tengo 3 documentos de calefacción, pero 17 en fontanería, en vez de añadir un "0004" cuando selecciono "CALEFACCIÓN", me crea el código "CALE_0018".
Sé que es una cuestión de encontrar correctamente el registro apropiado, pero no soy capaz. Ni siquiera con DAO, en el cual aún estoy más pez, o mediante DoCmd. FindRecord, por poner un caso.

1 Respuesta

Respuesta
2

A primera vista, como te digo en el otro foro, veo varios "fallos":

1º/ a la variable tema le asignas los 4 primeros caracteres del valor del combo y le añades una barra baja. Sin embargo, luego en el DLookUp, comparas los 4 primeros caracteres del campo con esa variable tema, que tiene 5, lo que implica que nunca encontrará una coincidencia.

2º/ Si tema es una variable de texto, tienes que tratarla como texto, es decir, entre comillas simples. Además, ¿para qué usas Val()? Si es un texto, Val() te dará 0...

3º/ Te falta encadenar las variables [i]tema[/i] y [i]texto[/i] para que te quede como quieres.

Resumiendo, prueba así (te indica solo los cambios)

tema = Left(Me.Cuadro_combinado24, 4)
...
texto = Format(Nz(DMax("Right(CODIGO, 4)", "DOCUMENTOS", "Left(CODIGO, 4) = '" & tema & "'"), 0) + 1, "0000")
texto=tema & "_" & texto

Saludos! 


Muchas gracias por la rapidez que siempre das, Svein.

Tienes razón en los 2 gazapos. El del guión bajo no era tal, porque lo tenía "localizado", no tanto el de obtener el valor de la variable "tema" y obviar tratarla como número.

Se debe a que aproveché un código que tenía para otra BD de facturación, en la que todo el código era numérico.

En cualquier caso, y yendo al grano, excelente solución. Me frustra mucho que no sea a veces más intuitivo el error o el por qué no aparece el resultado que se busca, sin más opción que ir dando palos de ciego... pero así la flauta no sonará en la vida.

Muchas gracias.

Sí, a veces los mensajes de error dejan mucho que desear.

Tienes que tener en mente siempre las reglas "básicas": texto entre comillas simples, fechas y horas entre almohadillas y números directamente.

Si no te importa, cuando tengas tiempo, indica en el otro foro que la solución es satisfactoria, tanto para que no responda otro usuario, como para que si alguien tiene un problema similar, vea que así queda solucionado.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas