También podemos aprovechar para esta otra situación.
Private Sub Hoja_BeginPrint(ByVal sender As Object, _
ByVal e As System.Drawing.Printing.PrintEventArgs) _
Handles Hoja.BeginPrint
Dim CadenaSQL As String
Dim Codigo As String
Dim FechaD As String = InvierteFecha(Campo01.Text, True)
Dim FechaH As String = InvierteFecha(Campo02.Text, True)
Codigo = Lista01.SelectedValue
CadenaSQL="SELECT Reserva,Socio,Fecha,Servicio,Numero,Hora,Reservado,Estado,"& _
"Socios.Codigo, " & _
"CONCAT(Socios.Apellidos,' ',Socios.Nombre) AS NomSocio, " & _
"Servicios.Codigo, Servicios.Denominacion " & _
"FROM Reservas " & _
"INNER JOIN Socios ON Socios.Codigo = Socio " & _
"INNER JOIN Servicios ON Servicios.Codigo = Servicio " & _
"WHERE ((Socio = '" & Codigo & "') AND " & _
"(Fecha >='" & FechaD & "') AND " & _
"(Fecha <='" & FechaH & "'))" & _
"ORDER BY Reserva "
Tabla = CargaTablas(Conexion, CadenaSQL, "Reserva")
Hoja.DefaultPageSettings.Landscape = False
ConfigCabecera(TextoCabecera)
End Sub
En pocas palabras, en BeginPrint se ha de ejecutar aquella parte del programa que solo ha de ejecutarse una vez al inicio del mismo.
Salvada la parte inicial del listado, el siguiente paso es la parte cíclica, repetitiva, del mismo, el evento PrintPage.
El siguiente ejemplo está basado sobre un archivo random, pero eso es anecdótico básicamente.
Private Sub Hoja_PrintPage(ByVal sender As Object, _
ByVal e As System.Drawing.Printing.PrintPageEventArgs) _
Handles Hoja.PrintPage
Dim Cy As Long ' Coordenada vertical
Dim Cabec As Boolean = True
Dim Posicion As Integer = CInt(Campo01.Text)
While Posicion <= CLng(Campo02.Text)
FileGet(Canal, Reg, Posicion)
Select Case Reg.Modelo <> " "
Case True ' registro ocupado
If Cabec Then ' Cabeceras
Cabeceras(Cy, e)
Cabec = False
End If
LineaDet(Posicion, e, Cy) ' Línea de detalle
If Cy > e.MarginBounds.Height * 0.8 Then
e.HasMorePages = True ' Hay más hojas
Exit Sub
End If
End Select
Posicion = Posicion + 1 ' Incremento del contador
End While
e.HasMorePages = False ' No hay más hojas
End Sub
Pero tiene un pequeño fallo, y es que cuando se lance el cambio de página, el proceso vuelve al inicio, y no progresaría, porque
Dim Posicion As Integer = CInt(Campo01.Text)
Volvería a su valor inicial.
La solución puede ser
Static Posicion As Integer
Y al finalizar el listado
End While
e.HasMorePages = False ' No hay más hojas
Posicion = 0
End Sub
Otro ejemplo de bucle, este basado en un archivo secuencial
Este ejemplo funciona correctamente, porque la apertura del archivo se realiza fuera del evento PrintPage, en el BeginPrint, por lo tanto al reentrar en el procedimiento, no se produce un error de fichero ya abierto, y como el control del bucle es por EOF, el proceso no se altera.
Cada vez que entremos como se produce
Dim Cabec As Boolean = True
Al entrar en el bucle se lanzan las cabeceras y no habría problema.
Private Sub Hoja_PrintPage(ByVal sender As Object, _
ByVal e As System.Drawing.Printing.PrintPageEventArgs) _
Handles Hoja.PrintPage
Dim Cy As Long ' Coordenada vertical
Dim Cabec As Boolean = True
While Not EOF(Canal)
Input(Canal, Reg.Fecha)
Input(Canal, Reg.CodArt)
Input(Canal, Reg.Tipo)
Input(Canal, Reg.Codigo)
Input(Canal, Reg.Cantidad)
Input(Canal, Reg.Descto)
If Cabec Then ' Cabeceras
Cabeceras(Cy, e)
Cabec = False
End If
LineaDet(e, Cy) ' Línea de detalle
If Cy > e.PageSettings.PaperSize.Height * 0.9 Then
e.HasMorePages = Trae ' Hay más hojas
Exit Sub
End If
End While
e.HasMorePages = False ' No hay más hojas
End Sub
Síguenos en: Facebook Sobre aulaClic Política de Cookies