Informe en access con filtro de un formulario sale en blanco

Estoy filtrando desde un cuadro de lista a un formulario, boton impri.

El mismo abre, pero no contiene la información deseada. Queda en blanco o bien coloca todos los registros.

Aqui el codigo

Private Sub Ctl_IMPRIMIR_Click()
Dim MVariant As Variant
Dim strSQL As String
Dim i As Integer
strSQL = "DELETE Tbl_Auxiliar.* FROM Tbl_Auxiliar"

strSQL = ""
'Determina cuales registros están marcados para ser impresos
For Each MVariant In Lista0.ItemsSelected

strSQL = "INSERT INTO Tbl_Auxiliar"
strSQL = strSQL & "SELECT * "
strSQL = strSQL & "FROM [inasistencia profesores] WHERE [inasistencia profesores].[Id] = " & Me.Lista0.ItemData(MVariant) & ""
'Ejecutamos la Consulta de Anexar Datos
Next MVariant
'Genera el Informe
DoCmd.OpenReport "CARGAR INANSISTENCIAS", acViewReport, acNormal
'Marca en la Tabla Tbl_Auxiliar los ya impresos
For Each MVariant In Lista0.ItemsSelected
strSQL = ""
strSQL = "UPDATE Tbl_Auxiliar SET Impreso = -1 WHERE Tbl_Auxiliar.IdTbl_Auxiliar = " & Me.Lista0.ItemData(MVariant) & ""
Next MVariant
'Desmarco de la Lista0 los registros que estan marcados
For i = 1 To Me.Lista0.ListCount - 1
Me.Lista0.Selected(i) = False
Next i

Me.Lista0.Requery
End Sub

2 respuestas

Respuesta
1

Se le da valor a la variable strSQL, pero ¿Cuándo se ejecutan esas SQLs?.

La primera vez se le asigna un contenido y a continuación se le vuelve a asigna una cadena de texto vacía ... en mi opinión no se necesita la variable.

CurrentDb. Execute "DELETE * FROM Tbl_Auxiliar"

La segunda vez se le asigna un contenido y a continuación un comentario

For Each MVariant In Lista0.ItemsSelected
strSQL = "INSERT INTO Tbl_Auxiliar"
strSQL = strSQL & "SELECT * "
strSQL = strSQL & "FROM [inasistencia profesores] WHERE [inasistencia profesores].[Id] = " & Me.Lista0.ItemData(MVariant) & ""
'Ejecutamos la Consulta de Anexar Datos
Next MVariant

 Asumiendo que el ID es un numero, ese trozo lo escribiría así:

strSQL = "INSERT INTO Tbl_Auxiliar SELECT * FROM [inasistencia profesores] WHERE [inasistencia profesores].[Id] = "
For Each MVariant In Lista0.ItemsSelected
CurrentDb.Execute strSQL & Me.Lista0.ItemData(MVariant)
Next MVariant

Muchas Gracias por su prontas respuestas aqui dejo el codigo nuevo, abre el informe, pero no filtra el registro seleccionado o bien si me explican les subo la base.

Dim MVariant As Variant

Dim strSQL As String

Dim i As Integer

strSQL = "DELETE Tbl_Auxiliar.* FROM Tbl_Auxiliar"

strSQL = ""

'Determina cuales registros están marcados para ser impresos

For Each MVariant In Lista0.ItemsSelected

        strSQL = "INSERT INTO Tbl_Auxiliar ( id, [DNI PROFESOR], [Nombre y Apellidos], [FECHA DE AUSENCIA], [FECHA DE RETORNO], [DIAS DE FALTA], CAUSA, MEDICO, COMPROBANTE, Enfermedad, Alta )"

        strsql = strsql & "select [inasistencia profesores].id, [inasistencia profesores].[dni profesor], [inasistencia profesores].[nombre y apellidos], [inasistencia profesores].[fecha de ausencia], [inasistencia profesores].[fecha de retorno], [inasistencia profesores].[dias de falta], [inasistencia profesores].causa, [inasistencia profesores].medico, [inasistencia profesores].comprobante, [inasistencia profesores].enfermedad, [inasistencia profesores].alta"

        strsql = strsql & "from [inasistencia profesores] where [inasistencia profesores].[nombre y apellidos] = " & me.lista0.itemdata(mvariant) & ""

        'Ejecutamos la Consulta de Anexar Datos

Next MVariant

'Genera el Informe

DoCmd.OpenReport "CARGAR INANSISTENCIAS", acViewReport, acNormal

'Marca en la Tabla Tbl_Auxiliar los ya impresos

CurrentDb.Execute "UPDATE Tbl_Auxiliar SET Impreso = -1"

'Desmarco de la Lista0 los registros que estan marcados

For i = 1 To Me.Lista0.ListCount - 1

        Me.Lista0.Selected(i) = False

Next i

Me.Lista0.Requery

End Sub

Cuanto más simple sea el código, menos problemas dará y más veloz será.
Me surgen algunas dudas: la tabla auxiliar ¿Por qué se marca lo que se supone ya se imprimió si después se borrara?

.. Si se desea recordarlos lo adecuado es crear una Bitácora, es en ella donde se guardan esos cambios y movimientos de datos.

Desmarcar los elementos seleccionados en el cuadro de lista es una opción si se pretende efectuar una nueva selección, en cualquier otro caso no me parece necesario, al volver a abrir el formulario no recordara selecciones anteriores.

El código:

Dim MVariant, strSQL As String
CurrentDb.Execute "DELETE * FROM Tbl_Auxiliar"
strSQL = "INSERT INTO Tbl_Auxiliar (id, [DNI PROFESOR], [Nombre y Apellidos], [FECHA DE AUSENCIA], [FECHA DE RETORNO], [DIAS DE FALTA], CAUSA, MEDICO, COMPROBANTE, Enfermedad, Alta) "
For Each MVariant In Lista0.ItemsSelected
CurrentDb.Execute strSQL & "Select id, [dni profesor], [nombre y apellidos], [fecha de ausencia], [fecha de retorno], [dias de falta], causa, medico, comprobante, enfermedad, alta From [inasistencia profesores] Where [nombre y apellidos] = '" & Me.lista0.itemdata(mvariant) & "'"
Next MVariant
DoCmd.OpenReport "CARGAR INANSISTENCIAS", acViewReport, acNormal
End Sub

Espero que funcione sin errores (lo he escrito aquí en vivo y directo), si aprecias un error coméntalo para resolverlo.

¡Gracias! A Todos, el error lo tenia en el origen del informe, se dio cuenta un compañero de trabajo.

Devia darle el origen en tbl_Auxiliar y lo tenia en tblAuxiliar.

Muchas Muchas gracias a todos.

Este es el código que utilizo. Lo simplifique por sus consejos.

Private Sub Ctl_IMPRIMIR_Click()
  Dim IdItm As Variant, SQL As String
    If Me.Lista0.ItemsSelected.Count >= 1 Then
        CurrentDb.Execute "DELETE FROM Tbl_Auxiliar", dbFailOnError
        For Each IdItm In Me.Lista0.ItemsSelected
            CurrentDb.Execute "INSERT INTO Tbl_Auxiliar SELECT * FROM INASISTENCIA_PROFESORES WHERE NOMBRE_APELLIDOS = " & Me.Lista0.ItemData(IdItm) & "", dbFailOnError
            Me.Lista0.SetFocus: Me.Lista0.Selected(IdItm) = False
        Next IdItm
        DoCmd.OpenReport "CARGAR INANSISTENCIAS", acViewPreview, , , acNormal
        Me.Lista0.Requery
    Else
        MsgBox "SELECCIONE UN REGISTRO", vbExclamation, "Aviso": Me.Lista0.SetFocus
   End If
End Sub

Abrazo desde Argentina

Respuesta
1

Primero que todo no entiendo para que actualiza la tabla auxiliar mediante el FOR EACH() si esta tabla se acaba de crear y solo contiene los ítems seleccionados en el cuadro de lista.

For Each MVariant In Lista0.ItemsSelected
    strSQL = ""
    strSQL = "UPDATE Tbl_Auxiliar SET Impreso = -1 WHERE Tbl_Auxiliar.IdTbl_Auxiliar = " & Me.Lista0.ItemData(MVariant) & ""
Next MVariant

Puede reemplazarlo por esta línea

CurrentDb.Execute "UPDATE Tbl_Auxiliar SET Impreso = -1"

Desconozco cómo tiene el origen de datos para el reporte, en este caso, no puede detectar la inconsistencia, no obstante, le recomiendo revisar la tabla auxiliar y observa si están los registros  del INSERT.

Y tiene toda la razón enriqueh falta ejecutar la instrucción SQL. Efectivamente algo como:

Private Sub Ctl_IMPRIMIR_Click()
Dim MVariant As Variant
Dim strSQL As String
Dim i As Integer
strSQL = "DELETE Tbl_Auxiliar.* FROM Tbl_Auxiliar"
strSQL = ""
'Determina cuales registros están marcados para ser impresos
For Each MVariant In Lista0.ItemsSelected
    strSQL = "INSERT INTO Tbl_Auxiliar"
    strSQL = strSQL & "SELECT * "
    strSQL = strSQL & "FROM [inasistencia profesores] WHERE [inasistencia profesores].[Id] = " & Me.Lista0.ItemData(MVariant) & ""
    'Ejecutamos la Consulta de Anexar Datos
    CurrentDb.Execute strSQL
Next MVariant
'Genera el Informe
DoCmd.OpenReport "CARGAR INANSISTENCIAS", acViewReport, acNormal
'Marca en la Tabla Tbl_Auxiliar los ya impresos
CurrentDb.Execute "UPDATE Tbl_Auxiliar SET Impreso = -1"
'Desmarco de la Lista0 los registros que estan marcados
For i = 1 To Me.Lista0.ListCount - 1
  Me.Lista0.Selected(i) = False
Next i
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas