Unidad 54. Impresión (VI)





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.

2    Parte cíclica del listado, 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

 

Octubre-2010
Pág. 54.6

Atrás  Inicio  Adelante






Página inicial  Cursos Informática Gratuitos

Síguenos en:   Facebook       Sobre aulaClic            Política de Cookies