Mostrar últimos X registros en un formulario a partir de un cuadro de texto

Resulta que tengo un formulario con un cuadro de texto y quiero que al abrir el formulario, me muestre la cantidad de registros que muestra ese cuadro de texto, ¿Cómo lo puedo hacer?

1 respuesta

Respuesta
1

Para mostrar X registros, tienes que usar como origen de tu formulario una consulta del tipo SELECT TOP X ..., que no es más que una consulta de selección dónde le indicas el número de resultados a devolver con la cláusula TOP X.

Si quieres mostrar los X primeros registros, la consulta la debes ordenar en orden ascendente, por el campo o campos que quieras, y si quieres los últimos X registros, has de ordenarla en orden descendiente.

Sabiendo lo que tienes que hacer, veamos cómo hacerlo. Yo pondría en el evento "Al cargar" de tu formulario el siguiente código:

Dim miSQL as string
miSQL="SELECT TOP " & me.txtNumRegistros & " * FROM TuTabla ORDEN BY ID Desc"
Me.Recorsource=miSQL
Me. Requery

entendiendo que txtNumRegistros es el nombre del cuadro de texto, TuTabla es el nombre de la tabla (o consulta) que contiene los registros e ID es el campo por el que se va a ordenar.

Dicho esto, hay que hacer una precisión para que lo anterior funcione: el cuadro de texto txtNumRegistros tiene que tener un origen de datos, o en caso de ser independiente, asignarle un valor antes de la ejecución del código anterior. Si no se cumple esa premisa, al abrir el formulario el cuadro de texto estará vacío y no devolverá nada (o saltará un error).

Un saludo.


bit.ly/NkSvAcademy   /    bit.ly/ForoNkSv 

Hay un error de tecleo en el código anterior, el correcto es este:

Dim miSQL as string
miSQL="SELECT TOP " & me.txtNumRegistros & " * FROM TuTabla ORDER BY ID Desc"
Me.Recorsource=miSQL
Me. Requery

Es ORDER BY, no ORDEN BY

¡Uff como estoy!, hay otro:

Es

Me.RecordSource=miSQL

y no 

Me.RecorSource=miSQL

Ahora tengo esto puesto:

Private Sub Form_Load()
DoCmd.Maximize
Dim miSQL As String
miSQL = "SELECT TOP " & Me.Ver_reg & " * FROM INC_enviada ORDER BY ID Desc"
Me.RecordSource = miSQL
Me.Requery
End Sub

-Pero lo que veo es que no me hace la relación con otras tablas, me salen los registros que marco en el cuadro de texto pero los datos de otras tablas no

Claro, porque el el origen de datos solo le estás asignando los campos de la tabla INC_enviada.

Si antes tenías como origen del formulario una consulta (o un SELECT... en la propiedad), has de usar el mismo añadiendo lo del TOP y el ORDER BY

Buenos días, ahora tengo esto y me da error de sisntaxis en la clausula From:

Private Sub Form_Load()
DoCmd.Maximize
Dim miSQL As String
miSQL = "SELECT TOP " & Me.Ver_reg & " * FROM INC_enviada, INC_enviada.Linea, INC_enviada.Detectada_en, [Detectada_en] & "" & [Linea] AS Union_zona_linea, INC_enviada.Sección, INC_enviada.Ver_todas AS Ver_todas, INC_enviada.Hora_Act, Estados_INC.Colorear FROM INC_enviada LEFT JOIN Estados_INC ON INC_enviada.Revisado_jefe = Estados_INC.Estado WHERE (((INC_enviada.Detectada_en)=[Formularios]![Entrada]![Detectada_en])) OR ((([Detectada_en] & "" & [Linea])=[Formularios]![Entrada]![Union_zona_linea])) OR (((INC_enviada.Sección)=[Formularios]![Entrada]![Seleccion_linea])) OR (((INC_enviada.Ver_todas)=[Formularios]![Entrada]![Seleccion_linea])) ORDER BY INC_enviada.Hora_Act DESC"
Me.RecordSource = miSQL
Me.Requery
End Sub

Donde esta puede estar el problema?

Por lo pronto, te sobra el * FROM

Al resto de la SQL no le veo nada raro.

Le he quitado el * FROM del principio y ahora muestra esto

Como no soy adivino y no conozco los campos de tu BD, ni los valores que toman los parámetros, te recomiendo que hagas lo siguiente para que la depures tu mismo:

1º/ Crea una consulta nueva, cambia a vista SQL y pega:

SELECT INC_enviada, INC_enviada.Linea, INC_enviada.Detectada_en, [Detectada_en] & "" & [Linea] AS Union_zona_linea, INC_enviada.Sección, INC_enviada.Ver_todas AS Ver_todas, INC_enviada.Hora_Act, Estados_INC.Colorear FROM INC_enviada LEFT JOIN Estados_INC ON INC_enviada.Revisado_jefe = Estados_INC.Estado

Mira si te funciona.

2º/ Añadele un TOP X y mira si funciona:

SELECT TOP 5  INC_enviada, INC_enviada.Linea, INC_enviada.Detectada_en, [Detectada_en] & "" & [Linea] AS Union_zona_linea, INC_enviada.Sección, INC_enviada.Ver_todas AS Ver_todas, INC_enviada.Hora_Act, Estados_INC.Colorear FROM INC_enviada LEFT JOIN Estados_INC ON INC_enviada.Revisado_jefe = Estados_INC.Estado

3º/ Ahora, con el formulario Entrada abierto y datos en los cuadros de texto de los criterios, prueba:

SELECT INC_enviada, INC_enviada.Linea, INC_enviada.Detectada_en, [Detectada_en] & "" & [Linea] AS Union_zona_linea, INC_enviada.Sección, INC_enviada.Ver_todas AS Ver_todas, INC_enviada.Hora_Act, Estados_INC.Colorear FROM INC_enviada LEFT JOIN Estados_INC ON INC_enviada.Revisado_jefe = Estados_INC.Estado WHERE (((INC_enviada.Detectada_en)=[Formularios]![Entrada]![Detectada_en])) OR ((([Detectada_en] & "" & [Linea])=[Formularios]![Entrada]![Union_zona_linea])) OR (((INC_enviada.Sección)=[Formularios]![Entrada]![Seleccion_linea])) OR (((INC_enviada.Ver_todas)=[Formularios]![Entrada]![Seleccion_linea])) ORDER BY INC_enviada.Hora_Act DESC

4º/ Por último, añadele un TOP:

SELECT TOP 1 INC_enviada, INC_enviada.Linea, INC_enviada.Detectada_en, [Detectada_en] & "" & [Linea] AS Union_zona_linea, INC_enviada.Sección, INC_enviada.Ver_todas AS Ver_todas, INC_enviada.Hora_Act, Estados_INC.Colorear FROM INC_enviada LEFT JOIN Estados_INC ON INC_enviada.Revisado_jefe = Estados_INC.Estado WHERE (((INC_enviada.Detectada_en)=[Formularios]![Entrada]![Detectada_en])) OR ((([Detectada_en] & "" & [Linea])=[Formularios]![Entrada]![Union_zona_linea])) OR (((INC_enviada.Sección)=[Formularios]![Entrada]![Seleccion_linea])) OR (((INC_enviada.Ver_todas)=[Formularios]![Entrada]![Seleccion_linea])) ORDER BY INC_enviada.Hora_Act DESC

Si no te da error en ninguna, es que la SQL está bien construida y el problema está en otro lado. Si te da error, habrá que ver qué falla en la SQL (sintaxis, valor de un parámetro...)

Ahora tengo puesto esto:

miSQL = "SELECT TOP" & "Me.Ver_reg" & "INC_enviada.*, INC_enviada.Linea, INC_enviada.Detectada_en, [Detectada_en] & "" & [Linea] AS Union_zona_linea, INC_enviada.Sección, INC_enviada.Ver_todas AS Ver_todas, INC_enviada.Hora_Act, Estados_INC.Colorear FROM INC_enviada LEFT JOIN Estados_INC ON INC_enviada.Revisado_jefe = Estados_INC.Estado WHERE (((INC_enviada.Detectada_en)=[Formularios]![Entrada]![Detectada_en])) OR ((([Detectada_en] & "" & [Linea])=[Formularios]![Entrada]![Union_zona_linea])) OR (((INC_enviada.Sección)=[Formularios]![Entrada]![Seleccion_linea])) OR (((INC_enviada.Ver_todas)=[Formularios]![Entrada]![Seleccion_linea])) ORDER BY INC_enviada.Hora_Act DESC;"

Pero no se donde sobra ese paréntesis de cierre.

Yo los quitaba todos, porque ninguno de los que tienes puestos es estrictamente necesario.

Pregunta: cunado pones [Detectada_en] & "" & [Linea] AS Union_zona_linea, ¿cómo quieres encadenar los dos campos, con un espacio entre ellos o sin nada?

Si lo quieres con espacio, deberías poner:

[Detectada_en] & " " & [Linea] AS Union_zona_linea

y si los quieres sin espacio:

[Detectada_en] & [Linea] AS Union_zona_linea

miSQL = "SELECT TOP" & "Me.Ver_reg" & "INC_enviada.*, INC_enviada.Linea, INC_enviada.Detectada_en, [Detectada_en] & " " & [Linea] AS Union_zona_linea, INC_enviada.Sección, INC_enviada.Ver_todas AS Ver_todas, INC_enviada.Hora_Act, Estados_INC.Colorear FROM INC_enviada LEFT JOIN Estados_INC ON INC_enviada.Revisado_jefe = Estados_INC.Estado WHERE INC_enviada.Detectada_en =[Formularios]![Entrada]![Detectada_en] OR [Detectada_en] & " " & [Linea] =[Formularios]![Entrada]![Union_zona_linea] OR INC_enviada.Sección=[Formularios]![Entrada]![Seleccion_linea] OR INC_enviada.Ver_todas=[Formularios]![Entrada]![Seleccion_linea] ORDER BY INC_enviada.Hora_Act DESC"

Al ponerlo así, me da error y se me queda seleccionado hasta el primer espacio. Hay que encadenarlos con espacio.

Cada vez pones SQLs distintas, y así es difícil orientarte. Ahora pones entre comillas el campo del formulario ("Me.Ver_reg") y no sé de dónde lo sacaste, pero es un error.

Te sugiero otra cosa, para que veas si la SQL que estás creando, con los valores del formulario es correcta o no:

1º/ Pon un nuevo botón en tu formulario con este código (la SQL es la de las primeras respuestas"):

Dim miSQL As String
miSQL = "SELECT TOP " & Me.Ver_reg & " * FROM INC_enviada, INC_enviada.Linea, INC_enviada.Detectada_en, [Detectada_en] & "" & [Linea] AS Union_zona_linea, INC_enviada.Sección, INC_enviada.Ver_todas AS Ver_todas, INC_enviada.Hora_Act, Estados_INC.Colorear FROM INC_enviada LEFT JOIN Estados_INC ON INC_enviada.Revisado_jefe = Estados_INC.Estado WHERE (((INC_enviada.Detectada_en)=[Formularios]![Entrada]![Detectada_en])) OR ((([Detectada_en] & "" & [Linea])=[Formularios]![Entrada]![Union_zona_linea])) OR (((INC_enviada.Sección)=[Formularios]![Entrada]![Seleccion_linea])) OR (((INC_enviada.Ver_todas)=[Formularios]![Entrada]![Seleccion_linea])) ORDER BY INC_enviada.Hora_Act DESC"
Debug.Print miSQL

2º/ Con datos en los cuadros de texto Ver_Reg, Detectada_En, Union_zona_linea... pulsa el botón

3º/ Vete al editor de VBA, muestra la ventana Inmediato (Ver->ventana Inmediato o Crtl+G) y tendrás la SQL creada con los datos de tu formulario.

4º/ La llevas a una nueva consulta a ver si te funciona o dónde falla...

Me quita los espacios entre Detectada_en y Linea

El error más evidente (y fue fallo mío por hacer un copia pega de la SQL que no era correcta) es que sobra el * FROM.

Quítalo de la SQL y prueba de nuevo.

Para lo de los espacios, cambia esto:

[Detectada_en] & " " & [Linea]

por esto otro:

[Detectada_en] & ' ' & [Linea]

Es decir, las comillas dobles por unas simples

Me falta ese campo, si acepto me salen los 500 que indica

Quita ese INC_Enviada que va después del Cuadro de texto donde tienes el 500, es decir, que el principio de tu SQL será:

miSQL = "SELECT TOP " & Me.Ver_reg & " INC_enviada.Linea, INC_enviada.Detectada_en, .....

Ahora ya tiene que ir seguro... je je

Buenos días, si asi si que funciona.

Necesito meter mas campos, en el origen de datos, la SQL que me da es esta:

SELECT INC_enviada.Linea, INC_enviada.Detectada_en, [Detectada_en] & " " & [Linea] AS Union_zona_linea, INC_enviada.Sección, INC_enviada.Ver_todas AS Ver_todas, INC_enviada.Hora_Act, Estados_INC.Colorear, INC_enviada.ESF, INC_enviada.Modelo, INC_enviada.Descripción_grupo, INC_enviada.Fecha_INC, INC_enviada.Descripción_parte_trabajo, INC_enviada.Nº_Causa, INC_enviada.Departamento, INC_enviada.Tiempo_min, INC_enviada.Revisado_jefe, INC_enviada.INC_Info, INC_enviada.Cod_Operario, INC_enviada.Id FROM INC_enviada LEFT JOIN Estados_INC ON INC_enviada.Revisado_jefe = Estados_INC.Estado WHERE (((INC_enviada.Detectada_en)=[Formularios]![Entrada]![Detectada_en])) OR ((([Detectada_en] & " " & [Linea])=[Formularios]![Entrada]![Union_zona_linea])) OR (((INC_enviada.Sección)=[Formularios]![Entrada]![Seleccion_linea])) OR (((INC_enviada.Ver_todas)=[Formularios]![Entrada]![Seleccion_linea])) ORDER BY INC_enviada.Hora_Act DESC;

Si coloco esto antes:

miSQL = "SELECT TOP " & Me.Ver_reg & "Todo lo anterior quitando SELECT", poniendo comillas simples debería funcionar no?

ya sale:

miSQL = "SELECT TOP " & Me.Ver_reg & " " & "INC_enviada.Linea, INC_enviada.Detectada_en, [Detectada_en] & ' ' & [Linea] AS Union_zona_linea, INC_enviada.Sección, INC_enviada.Ver_todas AS Ver_todas, INC_enviada.Hora_Act, Estados_INC.Colorear, INC_enviada.ESF, INC_enviada.Modelo, INC_enviada.Descripción_grupo, INC_enviada.Fecha_INC, INC_enviada.Descripción_parte_trabajo, INC_enviada.Nº_Causa, INC_enviada.Departamento, INC_enviada.Tiempo_min, INC_enviada.Revisado_jefe, INC_enviada.INC_Info, INC_enviada.Cod_Operario, INC_enviada.Id FROM INC_enviada LEFT JOIN Estados_INC ON INC_enviada.Revisado_jefe = Estados_INC.Estado WHERE (((INC_enviada.Detectada_en)=[Formularios]![Entrada]![Detectada_en])) OR ((([Detectada_en] & ' ' & [Linea])=[Formularios]![Entrada]![Union_zona_linea])) OR (((INC_enviada.Sección)=[Formularios]![Entrada]![Seleccion_linea])) OR (((INC_enviada.Ver_todas)=[Formularios]![Entrada]![Seleccion_linea])) ORDER BY INC_enviada.Hora_Act DESC"

faltaba un espacio:

miSQL = "SELECT TOP " & Me.Ver_reg & " " & "INC_enviada.Linea

El espacio lo puedes poner antes del campo, sin necesidad de encadenar un espcaio:

miSQL = "SELECT TOP " & Me.Ver_reg & " INC_enviada.Linea

Fíjate que dejo un espacio entre las comillas y el INC_enviada, igual que después del TOP y antes de las comillas.

Vale y si se cambia el valor del cuadro de texto Ver_reg, como hago para que aparezcan con ese valor?

He probado Me.Requery al actualizar pero no me lo hace, solo refresca el formulario.

Perdona, ya lo he conseguido, he puesto toda la cadena de antes a ese cuadro de texto, al perder el enfoque.

Muchas gracias.

Yo usaría mejor "después de actualizar", así te aseguras de no ejecutar el código si no cambias de valor.

Costó, pero al final lo conseguimos, XDD. Si no necesitas ninguna aclaración adicional, y valoras la respuesta, damos por terminado este asunto.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas