Muy buenas tardes
Tengo un inconveniente que no se si conozca alguien como darle la vuelta a tal problema.
En visual basic 6 y crystal report 8.5
Cargo un reporte usando el OCX colocado en la ventana CrystalReport1
Pero tengo el problema de que mi programa guarda en la Base de Datos la seleccion de 2 impresoras, 1 de Matriz, y 1 de Papel BOND, inyeccion de tinta o lazer.
El problema es que puede estar predeterminada en el sistema Windows una impresora que no es ninguna de las que he guardado en la base de datos. Entonces cuando mando salida de impresion por el objeto CrystalReport1 busca como impresora la predeterminada.
He logrado hacer esto con unas impresiones que son por el Printer de VB6, pero tengo otra cosa que es el caso salida a CrystalReport directo a impresora y no se como hacerlo.
Yo guardo informacion de las 2 Impresoras que mi programa necesita asi:
Private Sub GuardarImpresoras()
strSQL = "Select * From CONFIG_IMPRESORAS"
Set RsDatos = New Recordset
RsDatos.Open strSQL, cnConexdb, adOpenStatic, adLockOptimistic
If RsDatos.RecordCount > 0 Then
If cmbImpresoraMatriz.Text <> "" Then
RsDatos("id") = cmbImpresoraMatriz.ListIndex
RsDatos("impresora") = cmbImpresoraMatriz.Text
RsDatos("tipo") = "Matriz"
RsDatos.Update
End If
If cmbImpresoraPapelBOND.Text <> "" Then
RsDatos("id") = cmbImpresoraPapelBOND.ListIndex
RsDatos("impresora") = cmbImpresoraPapelBOND.Text
RsDatos("tipo") = "PapelBOND"
RsDatos.Update
End If
Else
If cmbImpresoraMatriz.Text <> "" Then
RsDatos.AddNew
RsDatos("id") = cmbImpresoraMatriz.ListIndex
RsDatos("impresora") = cmbImpresoraMatriz.Text
RsDatos("tipo") = "Matriz"
RsDatos.Update
End If
If cmbImpresoraPapelBOND.Text <> "" Then
RsDatos.AddNew
RsDatos("id") = cmbImpresoraPapelBOND.ListIndex
RsDatos("impresora") = cmbImpresoraPapelBOND.Text
RsDatos("tipo") = "PapelBOND"
RsDatos.Update
End If
End If
MsgBox "SU SELECCION DE IMPRESORAS HA SIDO GUARDADO", vbInformation, "SELECCION GUARDADA"
End Sub
Y en unas impresiones por el objeto Printer por codigo lo mando asi:
Tomo primero el Id de Impresora:
Private Sub ImpresoraSeleccionada()
'Buscamos la Configuracion de Impresoras indicadas como salida
strSQL = "Select * From CONFIG_IMPRESORAS"
Set RsDatos = New Recordset
RsDatos.Open strSQL, cnConexdb, adOpenStatic, adLockOptimistic
If RsDatos.RecordCount > 0 Then
RsDatos.MoveFirst
While Not RsDatos.EOF
If RsDatos("tipo") = "Matriz" Then
IdImpresoraMatriz = RsDatos("id")
NombreImpresoraMatriz = RsDatos("impresora")
ElseIf RsDatos("tipo") = "PapelBOND" Then
IdImpresoraPapelBOND = RsDatos("id")
NombreImpresoraPapelBOND = RsDatos("impresora")
End If
RsDatos.MoveNext
Wend
End If
End Sub
Y lo uso para la salida de impresion:
With Printer
Set Printer = Printers(IdImpresoraPapelBOND)
..........
Wend
De esa forma no importa que impresora este predeterminada en el sistema operativo, el programa mandara la salida de impresion a la que tiene indicada en la BD.
Pero con CrystalReport no se como, es decir, la ayuda de CrystalReport indica que para que el objeto CrystalReport1 haga caso de indicarle a que impresora mandar, debe indicarsele los 3 campos:
MsgBox "Impresora: " & Printer.DeviceName & vbCrLf & "Driver: " & Printer.DriverName & vbCrLf & "Puerto: " & Printer.Port
Crystal1.PrinterName = "Microsoft XPS Document Writer"
Crystal1.PrinterDriver = "winspool"
Crystal1.PrinterPort = "Ne00"
En teoria, algo asi bastaria para que el control de CrystalReport mande a esa impresora que se le indica (sin que sea realmente la predeterminada en el sistema).
Pero no se como obtener el puerto, yo recojo para mi programa la info de impresoras cargandolas en uns ComboBox, asi:
Sub ListaImpresoras()
Dim C As Integer
cmbImpresoraMatriz.Clear
cmbImpresoraPapelBOND.Clear
For C = 0 To Printers.Count - 1
cmbImpresoraMatriz.AddItem Printers(C).DeviceName
cmbImpresoraPapelBOND.AddItem Printers(C).DeviceName
Next
For C = 0 To Printers.Count - 1
If Printers(C).DeviceName = Printer.DeviceName Then
cmbImpresoraMatriz.ListIndex = C
cmbImpresoraPapelBOND.ListIndex = C
Exit For
End If
Next
End Sub
De la lista escojo las impresoras y las guardo con el 1er codigo expuesto aqui, pero no se como tomar el puerto desde un control ComboBox.
EN RESUMEN:
Como podria hacer para que el control CrystalReport que tengo en la ventana imprima por la impresora que yo le indique y no la que este predeterminada en el sistema operativo??
Si uso Crystal1.PrinterName = RsDatos("Impresora") No me lo toma solo con eso, puedo darle el Id_index y Nombre de la Impresora pero no se como tomar el Puerto "de esa impresora en particular" y no que recoga la de la predeterminada.
Por favor, quien pueda orientarme sobre esto, muy agradecido por sus comentarios sobre el caso.