Crystal Report - Como implementar un reporte dentro de otro

 
Vista:

Como implementar un reporte dentro de otro

Publicado por Luis (2 intervenciones) el 06/09/2006 18:25:48
Buenas

Tengo un problema de dificil solucion para mi. Me he diseñado un informe en Crystal Report 9 que tiene un cuerpo principal al que le paso por codigo el conjunto de resultados que me interesa (desde la aplicacion selecciono la Base de Datos de interes y le aplico el filtrado de registros mediante una consulta SQL con un WHERE).

El problema es que ahora me piden que la cabecera sea cambiante, haciendo uso de la misma Base de Datos seleccionada pero usando datos de una tabla diferente (en esta cabecera apareceria los datos de una persona que se denomina VERIFICADOR).

El problema es que por codigo se como "apuntar" a una Base de Datos determinada, mediante ADO, y suministrarle los datos filtrados al informe diseñado, pero solo para el cuerpo principal. No se como hacerlo para la cabecera tambien.

Si sirve de pista, el codigo que uso esta en Visual C++ 6 y dada la poca informacion que hay sobre el binomio Crystal Report + Visual C puede servir de ayuda para otras personas que solo necesiten un reporte basico con cambios por codigo del conjunto de resultados. Asi es como lo he implementado ...

// Definicion de variables locales
CString szSQL;
long lRegisters;
IReportPtr pRep;
_RecordsetPtr pRs;
CString szMensaje;
CString szConnStr;
IApplicationPtr pApp;
CString szReportPath;
_ConnectionPtr pConn;
IDatabasePtr pDatabase = 0;
IDatabaseTablesPtr pTables = 0;

// Generamos la instancia al objeto IApplication
pApp.CreateInstance ("CrystalRuntime.Application.9");

// Especificamos el PATH del Reporte a imprimir o exportar
szReportPath = GlobalApp.tplAppCfg.szAppPath;

if (INFORME_RUTAS == m_byTipoReport)
szReportPath += "\\INFORMES\\Rutas.rpt";
else if (INFORME_RUTASEXT == m_byTipoReport)
szReportPath += "\\INFORMES\\Rutas_ExtCpy.rpt";

_bstr_t ReportPath (szReportPath.GetBuffer (0));
_variant_t vtEmpty (DISP_E_PARAMNOTFOUND, VT_ERROR);

// Generamos las instancias a los objetos Connection y RecordSet
pRs.CreateInstance (__uuidof (Recordset));
pConn.CreateInstance (__uuidof (Connection));

// Generamos la cadena de conexion para el origen de datos del informe
szConnStr.Format ("Provider = Microsoft.Jet.OLEDB.4.0; Data Source = %s",
GlobalApp.tplGeneral.szOpenLinePath);

pConn->Open (_bstr_t (szConnStr), _bstr_t (L""), _bstr_t (L""),
adConnectUnspecified);

pRs->Open (_bstr_t (m_szSQL), pConn.GetInterfacePtr (), adOpenKeyset,
adLockReadOnly, adCmdText);

lRegisters = pRs->GetRecordCount ();

// Abrimos el Reporte usando el metodo correspondiente
pRep = pApp->OpenReport (szReportPath.GetBuffer (0));
pRep->Database->SetDataSource ((_variant_t)((IDispatch *) pRs));

m_Viewer.SetReportSource (pRep);
// pRep->PrinterSetup (0);
m_Viewer.ViewReport ();

// Liberamos recursos utilizados
pRep.Release ();
pApp.Release ();

pRs.Release ();
pConn.Release ();

return (true);

Si no me equivoco, es en SetDataSource donde le digo al informe diseñado el conjunto de resultados que me interesan, pero la cuestion es que si solo puedo indicarlos en este punto y el informe diseñado deberia aceptar dos conjuntos diferentes, este es mi problema.

Gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder