HOLA DE NUEVO YO
TENGO QUE IMPRIMIR UN REPORTE DE UNAS OREDENES CON UN ACONSULTA DE SQL Y NO E PODIDO E SACADO TODOS LOS EJEMPLO QUE EXISTEN EN ESTA PAGINA Y NO EN TIENDO PORQUE EL DATA REPORT NO ME FUNCIONA .
ESTE ES EL CODIGO DE IMPRESION.
Private Sub IMPRIMIR_Click()
Dim strSQL As String
Set cnn1 = New ADODB.Connection
strCnn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=F:\CARPETA PUBLICA\VEHICULO\G y W\VEHICULOS.MDB;Persist Security Info=False"
strSQL = "SELECT * From Orden, detalles1 where Orden.IdOrden = detalles1.IdOrden AND Orden.IdOrden = '" & codigo.Text & "'"
cnn1.Open strCnn
Set rstransportador = New ADODB.Recordset
Set rstransportador.ActiveConnection = cnn1
rstransportador.CursorType = adOpenKeyset
rstransportador.LockType = adLockBatchOptimistic
rstransportador.Open strSQL, strCnn, , , adCmdText
'Set DataReport1.DataSource = rstransportador
If Not rstransportador.EOF Then
Set DataReport1.DataSource = rstransportador
DataReport1.Show
Else
MsgBox "Archivo vacío.", vbInformation + vbOKOnly, App.Title
End If
Set rstransportador = Nothing
End Sub
ME SACA EL SIGUIENTE ERROR
ARGUMENTOS INCORRECTOS FUERA DEL INTERVALO PERMITIDO O EN CONFLICTOS CON OTROS.
AYUDEMEN POR FAVOR
GRACIAS
Hola, soy nuevo en este foro y he visto que tengo el mismo problema que tenías tú hace un año.
Si pudiste resolver el error estaría eternamente agradecido si me orientas un poco ya que llevo varias horas con esto.
Yo sigo intentándolo (uso VB 6.0), si descubro algo prometo publicarlo.
Gracias por adelantado,
Albert Roig
Bueno, lo prometido es deuda, y aunque no tengo ni idea de si ésto lo va a leer alguien yo lo pongo por si acaso.
Lo que he hecho es lo siguiente:
1.- Me apoyo en un Dataenvironment para tener una conexión a la BDD, incluyo un comando que realiza la misma select que voy a realizar posteriormente desde la aplicación, y diseño un report apoyándome en ese comando.
2.- Una vez diseñado quito el dataenvironment del proyecto, ya que quiero que los reports usen la misma conexión que el resto de la aplicación (ya sabéis, por caché y demás motivos).
3.- La idea básica es pasarle a un report un recordset ya resuelto, que, por tanto usará la conexión que ya tuviera. Le paso un clon del recordset para evitar posibles efectos colaterales (movimiento del registro activo, ...)
4.- La llamada desde un botón imprimir de un formulario es la siguiente:
Private Sub cmbImprimir_Click()
Dim loRep As RepExpediciones
Set loRep = New RepExpediciones
Call loRep.Entrar("Listado de Expediciones", AdoLista.Recordset.Clone)
Set loRep = Nothing
End Sub
5.- El código del report es el siguiente:
Option Explicit
Dim msTitulo As String
Public Sub Entrar(Titulo As String, Datos As adodb.Recordset)
msTitulo = Titulo
Call Rep_Configurar
Call Rep_ObtenerDatos(Datos)
Me.Show vbModal
End Sub
Private Sub Rep_Configurar()
Me.Caption = msTitulo
Me.Title = msTitulo
Me.Sections("EncabezadoInforme").Controls("LblTitulo").Caption = msTitulo
Me.Top = 100
Me.Left = 100
Me.Width = goMainForm.ScaleWidth - 200
Me.Height = goMainForm.ScaleHeight - 200
End Sub
Private Sub Rep_ObtenerDatos(poDatos As adodb.Recordset)
Dim i As Long
Dim s As Long
' Albert Roig a 30/03/2005.
' Busco en todas las secciones del listado si hay RptTextBox y RptFunction
' cuyo nombre empiece por "cam" o "fun" (campos o funciones respectivamente).
' Esos prefijos están reservados para que cojan ese campo del recordset
' pasado como parámetro. El resto del nombre es el nombre del campo real del
' recordset. Por ejemplo: camTRA_Alba. Cogerá del recordset el campo TRA_Alba.
'
' Al asignar el recordset usa la conexión a BDD del recordset.
Set Me.DataSource = poDatos
Me.DataMember = ""
For s = 1 To Me.Sections.Count
With Me.Sections(s).Controls
For i = 1 To .Count
If UCase(Left(.Item(i).Name, 3)) = "CAM" Or _
UCase(Left(.Item(i).Name, 3)) = "FUN" Then
If TypeOf .Item(i) Is RptTextBox Or _
TypeOf .Item(i) Is RptFunction Then
.Item(i).DataMember = ""
.Item(i).DataField = Mid(.Item(i).Name, 4)
End If
End If
Next i
End With
Next s
Me.Refresh
End Sub
6.- Una mejora: el método Rep_ObtenerDatos puede ir perfectamente en un módulo para que todos los reports llamen a la misma rutina, sólo hace falta pasarle el ADODB.RecordSet y el DataReport.
Con ello conseguimos un report específico, es decir: un formulario en concreto (mantenimiento de clientes) llama al report ListaClientes diseñado específicamente para él. A mi me va de maravilla porque ese recordset va a una grid que puedo filtrar, cambiar el orden, etc., y ese mismo recordset lo saco al report sin hacer nada y sin que dependa de una select en concreto diseñada en un dataenvironment.
Anexo el report.
En fin, creo que ya está.
Salu2 a to2,
Albert