Seleccionar origen de datos de Crystal Report 8.5

14/07/2003 - 17:09 por Guay | Informe spam
Hola compañer@s!

Necesito que me hecheis una mano en una cosa. Tengo informes en crystal
report 8.5 que son de estructura igual pero que se basan en diferentes
consultas (de la misma estructura tambien) de una base de datos access97. El
problema es que para cada una tengo que hacer el mismo informe y me tiene
cansado!!! Le intento hacer un set location de otra consulta, la renombro
con un set alias, con el Visual Linking Expert añado una consulta nueva en
la que se basaran los datos y la anterior la pongo en invisible pero nada!!!
He probado a hacer mil virguerias pero SIEMPRE termina por borrarme los
registros y tengo que agregar otra vez a mano los campos. Seguro que tiene
que haber alguna forma para solucionar esto aunque yo aun no haya dado con
ella. Haber si alguien se ha topado con la misma situacion en la que yo
estoy. Es algo urgente y ademas estoy perdiendo mucho tiempo con esto!!!

Muchas gracias.

Un saludo.


Saúl Cintero
Dep. Informática
TransNatur Norte S.L
 

Leer las respuestas

#1 Edgar Contreras
15/07/2003 - 03:46 | Informe spam
Mira ahi te pongo el codigo que yo uso. TE comento primero que yo tengo una
aplicacion que se puede conectar a diversos motores de bases de datos, por
lo que el nombre de la misma, la ubicacion , etc puyede cambiar, lo que si
de plano no cambia es el formato del reporte, por lo que te mando la funcion
con la que me aseguro de abrir el reporte con los datos correctos:


Public Type gdServer
strSDN As String
strDBUser As String
strDBPass As String
intDBType As Integer
strDBName As String
End Type


Public Sub subPreparaRepInt(ByRef crxRep As CRAXDDRT.Report, byVal
gTypParametros As gdServer, ByVal strQuery As String, _
Optional blnAdo As Boolean = False, Optional adoRst
As ADODB.Recordset = Nothing)

'Le mando por referencia el reporte de CR (crxRep), ya sea que lo haya
abierto a partir de un archivo .rpt o como un diseñador incrustado en la
aplicacion, eso finalmente 'no me estorba, ya que a final de cuentas los
metodos y las propiedades no varian.
'Le mando un tipo de datos definido por mi en donde guardo parametros que
saco de un archivo INI, los cuales tu puedes obtener o manejar de
dondequieras
'Asi como esta la funcion tengo la posibilidad de mandarle el comando SQL
(strQuery) para que me genere el Recordset CR o le mando directamente el
Recordset
'que yo haya generado en donde realice la llamada (adoRst) y le indico con
True (blnAdo) que viene un objeto tipo ado. (Ya se, tiempo despues me di
cuenta que
'no era necesaria esta bandera, pero ya la deje asi)

On Error GoTo Err_handler

Dim intCount As Integer

With crxRep
'Limpio el reporte en caso de que hubiese sido salvado con informacion
.DiscardSavedData
.EnableAsyncQuery = True
.EnablePerformQueriesAsynchronously = True

If False = blnAdo Then
'Reviso si viene el objeto ado o no, en caso negativo, le asigno la
ubicacion a todas las tablas que forman parte del reporte (teoricamente con
que se la asignes
'a una sola tabla deberia funcionar, pero me encontre con casos en
que no sucedia, por lo que me aseguro con el bucle, y asi no queda duda)
.Database.SetDataSource gtypParametros.strSDN
For intCount = 1 To .Database.Tables.Count
.Database.Tables(intCount).SetLogOnInfo
gtypParametros.strSDN, gtypParametros.strDBName, gtypParametros.strDBUser,
gtypParametros.strDBPass
.Database.Tables(intCount).Location crxRep.Database.Tables(intCount).Name
Next intCount
.SQLQueryString = strQuery
Else
'En caso de haber mandado el recordset, simplemente se asigna al
reporte.
.Database.SetDataSource adoRst
End If
.ReadRecords
End With

Exit Sub

Err_handler:
If Err.Number = 457 Or Err.Number = 35602 Then
Resume Next
End If

End Sub


La manera de llamar la funcion seria:

'En caso de que uses una instruccion SQL
Private sub Form_Load()
Dim gtypServer as gdServer
Dim strSQL as String

...
'Abre el reporte como desees, formas hay al menos dos.
'Realiza las operaciones que desees
...

with gtypServer

strSDN=TU_DSN_EN_CASO_DE_QUE_USES_ODBC_SINO_MEJOR_USA_REPORTES_CON_ADO
strDBUser=El usuario
strDBPass=El Password
intDBType=Esta_bandera la uso para otras cosas, podrias ponerle 0
strDBName=Nombre_de_la_base_de_datos
end with

'LA consulta SQL obviamente debe de incluir los mismos campos o columnas
que el reporte (incluyendo el nombre) de lo contrario CR osara por querer
'acomodar las columnas a su antojo en los campos del reporte
strSQL=TU_CONSULTA_SQL

subPreparaRepInt TU_REPORTE, gtypServer, strSQL, False

...
'Continua con tu proceso de mostrar el reporte
'Sigue con otras instrucciones que tengas
...
End Sub


'En caso de que uses un recordset de ADO
Private sub Form_Load()
Dim gtypServer as gdServer 'Solo porque este parametro es obligatorio
para la funcion
Dim adoRst as ADODB.Recordset

...
'Abre el reporte como desees, formas hay al menos dos.
'Realiza las operaciones que desees
...

with gtypServer
strSDN=""
strDBUser=""
strDBPass=""
intDBType=0
strDBName=""
end with

'Abre tu recordset
adoRst.open ...

subPreparaRepInt TU_REPORTE, gtypServer, "", True, adoRst

...
'Continua con tu proceso de mostrar el reporte
'Sigue con otras instrucciones que tengas
...
End Sub


Espero te Sirva.

Saludos.
Edgar Contreras


(Guía de netiquette del foro)
http://perso.wanadoo.es/rubenvigon/foro

"La informacion es presentada como es y sin garantia alguna"

Preguntas similares