Estoy depurando un programa realizado por un ex compañero de trabajo en Microsoft Access. El programa de repente dejó de funcionar hoy y esta línea de código parece estar causando el bloqueo. (El código de error que aparece es 3646, es decir, no coinciden los tipos de datos). No tengo experiencia en VB y SQL, así que no estoy seguro de lo que significa.

NewIndexNumber = Nz(DMax("Mid$([IndexNumbers],5,3)", "QYearOtherRecordList2"), "000")

En particular, no estoy seguro de qué se supone que debe hacer "Mid $ ([IndexNumbers], 5,3)". No sé lo que significa el signo de dólar. Los números de índice, por cierto, son solo cadenas de números como "018374".

0
cosmarchia 17 sep. 2018 a las 14:22

3 respuestas

La mejor respuesta

Como dicen las otras 2 respuestas, $ en la función Mid lo obliga a esperar un parámetro de entrada de cadena y devolver un valor de cadena. Y el significado efectivo de esa parte del comando Mid$([IndexNumbers],5,3) es que devolverá los caracteres 5 a 7 de la columna IndexNumbers.

Sin embargo, el significado completo de esa línea de código (que es el título de su pregunta) es el siguiente:

Según esa línea de código, tiene una consulta o tabla en su base de datos (presumiblemente una consulta) llamada QYearOtherRecordList2. Ese código emite una llamada de función DMax contra esa consulta, que devolverá el "Valor máximo de cadena" de los caracteres 5 a 7 de la columna IndexNumbers para esa consulta (Usando función Mid $).

'Example output sample
'Lets assume that the query, with the Mid$ function applied returns the following rows

001
034
555
142
099

'Then, the DMax function would return just the following as the Max of those values

555

Finalmente, para asegurar que NewIndexNumber contiene un valor utilizable, el DMax está envuelto en un Nz llamada a la función que significa que si por alguna razón DMax devuelve un valor Null (es decir, no hay registros devueltos por su consulta , o ninguno de los valores IndexNumbers existentes tiene más de 4 caracteres), entonces devolvemos el valor "000" para que NewIndexNumber contenga algo útil.

Basado en algunas pruebas rápidas que realicé para intentar duplicar su error, sospecharía que tal vez la consulta QYearOtherRecordList2 posiblemente haya cambiado (o tal vez haya otro código antes de esta declaración que afecte los resultados de {{X1} }) esa es la verdadera causa de su error 3464 - Data type mismatch in criteria expression.

Por cierto: en sus comentarios, mencionó el número de error correcto para ese mensaje, y en su publicación actualizada, escribió el número. Pero en ambos casos, truncó el mensaje de error, que es algo que no debe hacer al pedir ayuda. La última parte del mensaje in criteria expression es realmente VITALMENTE importante para comprender dónde puede estar el problema y cómo depurarlo.

Esa parte del mensaje es lo que apunta a la posibilidad de que el error esté realmente en una criteria también conocida como cláusula o condición where. Es por eso que creo que el problema está indirectamente relacionado con la línea de código donde ocurre el error. No hay nada fundamentalmente incorrecto con esa línea de código, pero esa línea de código se basa en que la consulta QYearOtherRecordList2 devuelva un conjunto de datos sin error.

Por lo tanto, por favor, en el futuro, incluya con precisión el número de error y el texto del mensaje de error COMPLETO para ayudarnos a ayudarlo.

Gracias.

1
Jericho Johnson 17 sep. 2018 a las 14:32

Mid$(Something, 5, 3) devuelve 3 caracteres de la cadena Something , comenzando en la posición 5.

P.ej. ?Mid$("1234567890", 5, 3) devuelve 567.

Este código parece tomar los caracteres 5 a 7 del número de índice anterior, y si eso es Null, devuelve tres ceros en su lugar.

3
Erik A 17 sep. 2018 a las 11:31

Es similar a la función Mid():

https://docs.microsoft.com/en-us/office/vba/Language/Reference/User-Interface-Help/mid-function

La función Mid$() siempre devuelve una cadena y solo funciona en cadenas, mientras que Mid() también funciona en Variantes.

1
Andre 17 sep. 2018 a las 11:30