Consulta Expresión Demasiado Compleja Access

Soy usuario inicial de Access y quiero utilizar la expresión "SILNM"
Tengo una base de datos de vehículos por VIN.
En el VIN de un vehículo el 10mo. Dígito me indica el año de fabricación, es decir que si es a=2010, b=2011, c=2012; etc...
Cuando coloco la función:
Año: SiInm([letra]="V";"1997";SiInm([letra]="W";"1998";SiInm([letra]="X";"1999";SiInm([letra]="Y";"2000";SiInm([letra]="1";"2001";SiInm([letra]="2";"2002";SiInm([letra]="3";"2003";SiInm([letra]="4";"2004";SiInm([letra]="5";"2005";SiInm([letra]="6";"2006";SiInm([letra]="7";"2007";SiInm([letra]="8";"2008";SiInm([letra]="9";"2009";SiInm([letra]="A";"2010";SiInm([letra]="B";"2011";SiInm([letra]="C";"2012";SiInm([letra]="D";"2013";SiInm([letra]="E";"2014";SiInm([letra]="F";"2015";SiInm([letra]="G";"2016";SiInm([letra]="H";"2017";SiInm([letra]="J";"2018";SiInm([letra]="K";"2019";SiInm([letra]="L";"2020";SiInm([letra]="M";"2021";SiInm([letra]="N";"2022";SiInm([letra]="P";"2023";SiInm([letra]="R";"2024";"Sin Info")))))))))))))))))))))))))))

Access devuelve la leyenda: "Expresión Demasiado Compleja"

¿Qué alternativa tengo?

4 Respuestas

Respuesta

El primer problema de esa expresión (en una consulta) es ... su longitud

Hay dos posibles opciones en Access para elegir un elemento de una lista, un aplica la alternativa de pares (localiza el elemento de la lista y devuelve su pareja) y la opción de comparar el elemento con una lista ordenada y devolver el coincidente.

En mi opinion la mas adecuada es SWICHT y como simple guía copio de la ayuda de Access sus ejemplos (además de los que ya hay publicados en este foro y otros).

La actual expresión se puede reutilizar en VBA corrigiéndola con la opción buscar/reemplazar y la alternativa 'el texto seleccionado' (y seleccionado la línea) una muestra funcional:

Public Function AñoLetra(LETRA$) As String
AñoLetra = Switch(LETRA = "V", "1997", LETRA = "W", "1998", LETRA = "X", "1999", LETRA = "Y", "2000", LETRA = "1", "2001", LETRA = "2", "2002", LETRA = "3", "2003", LETRA = "4", "2004", LETRA = "5", "2005", LETRA = "6", "2006", LETRA = "7", "2007", LETRA = "8", "2008", LETRA = "9", "2009", LETRA = "A", "2010", LETRA = "B", "2011", LETRA = "C", "2012", LETRA = "D", "2013", LETRA = "E", "2014", LETRA = "F", "2015", LETRA = "G", "2016", LETRA = "H", "2017", LETRA = "J", "2018", LETRA = "K", "2019", LETRA = "L", "2020", LETRA = "M", "2021", LETRA = "N", "2022", LETRA = "P", "2023", LETRA = "R", "2024", "", "SinInfo")
' En la consulta ==>> Año: AñoLetra([letra]) <<==
End Function

Los ejemplos de Access (que se quedaron en el tintero)

Ejemplo de la función Choose

Function GetChoice(Ind As Integer)
    GetChoice = Choose(Ind, "Speedy", "United", "Federal")
End Function

Ejemplo de la función Switch

Function MatchUp (NombreCiudad As String)
    Matchup = Switch(NombreCiudad = "Londres", "Inglés", NombreCiudad _
                    = "Roma", "Italiano", NombreCiudad = "París", "Francés")
End Function
Respuesta
2

Access sólo permite 10 Siinm encadenados. Lo mejor es hacerlo en código y usar select case. Vamos a suponer que tienes un formulario donde en un control tipo texto vas a escribir la letra, y que este control se llama así, Letra. En sus propiedades-eventos-Después de actualizar, crea un procedimiento de evento y entre Private Sub y End sub puedes poner

select case letra

case is="V"

texto2=1997

Case is="W"

texto2=1998

case is="x"

texto2=1999

así hasta que termines y al final le pones

End Select

Personalmente haría una tabla con los campos Letra y Año. Pondría todos los datos, y en el formulario sustituiría el cuadro de texto Letra por un combinado donde eligiera la letra y automáticamente en el cuadro de texto Texto2 me pusiera el año.

De todas formas, si quieres, repito, si quieres, mándame un mensaje(sólo el mensaje) a [email protected] y te mando un par de ejemplos. Si lo haces, en el asun to del mensaje pon tu alias Iver Gutierrez, ya que si no sé quien me escribe no los abro.

Muchas gracias estimado Icue 

Pero mi información la tengo que extraer del VIN para lo que ya hice la fórmula:  Der(Izq([ventas 2017].[vin];10);1) de donde obtengo la letra del VIN.
Como menciono, todavía soy inexperto en este sentido y no conozco las propiedades o eventos.
Muchas gracias por tu predisposición y ayuda!

Es lo mismo, cuando hablo de un cuadro de texto Letra, es por ponerle un nombre. Primero, la expresión no es así como la tienes puesta. Si el campo se llama Vin, si quieres obtener el primer dígito de la derecha es

der([vin];1), si lo utilizas en consultas o como origen de un control

Con eso llega

Y en el caso que nos ocupa, yo pondría en el evento Después de actualizar del cuadro de texto Vin y suponiendo que el cuadro de texto donde quieres que te aparezca el año se llama también Año

Select case right([Vin],1)

case is="v"

año=1997

case is="w"

año=1998

etc..

End select

Respuesta

Puedes simplificar la expresión creando una tabla Agario de búsqueda que relacione cada letra del VIN con su año de fabricación, y luego hacer una consulta para obtener el año correspondiente.

Respuesta

Pruebe con esta función

Function periodo(strVIN As String) As String

Dim letra As String

letra = Mid(strVIN, 10, 1)
periodo = Switch(letra = "V", "1997", letra = "W", "1998", letra = "X", "1999", letra = "Y", "2000", letra = "1", "2001", letra = "2", "2002", letra = "3", "2003", _
letra = "4", "2004", letra = "5", "2005", letra = "6", "2006", letra = "7", "2007", letra = "8", "2008", letra = "9", "2009", letra = "A", "2010", letra = "B", "2011", _
letra = "C", "2012", letra = "D", "2013", letra = "E", "2014", letra = "F", "2015", letra = "G", "2016", letra = "H", "2017", letra = "J", "2018", _
letra = "K", "2019", letra = "L", "2020", letra = "M", "2021", letra = "N", "2022", letra = "P", "2023", letra = "R", "2024", True, "Sin Info")

End Function

Ejemplo de llamada:

¿

? Periodo("PLACA8869D897")
2013

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas