Informes Dinámicos ( Con crystal o sin )

07/09/2006 - 09:25 por Sitoweb | Informe spam
Hola a todos, a ver si alguien puede ayudarme.

Tengo que hacer unos listados y el problema es que no se los campos que
tengo que listar. Me explico :

Puede ser que dependiendo del usuario que ejecute la aplicacion quiera el
Listado con unos Datos o otros, con lo que ami se me comploca el diseño de
los informes con crystal reports por que no puedo crear el informe xq no se
los campos que tengo que poner. ( y no puedo crear 50.00 reports con todas
las combinaciones.)

Como puedo hacer para decidir que campos quiero poner en el informe y los
que no.

La otra duda es: se puede hacer esto con el crystal report o tengo que
hacerlo de otra manera.

Gracias..
No cual sería la solución.
 

Leer las respuestas

#1 Luis Miguel Blanco
07/09/2006 - 18:08 | Informe spam
Hola Sitoweb

Si trabajas con SQL Server como base de datos puedes utilizar Reporting
Services, que es un generador incluido en este producto para la creación de
informes. Tiene la gran mayoría de características necesarias en un diseñador
de informes, y se integra en Visual Studio 2003/2005 (dependiendo de la
versión de SQL Server que uses) para realizar el diseño de los informes.

Cuando se diseña un informe con Reporting Serv. se crea un archivo con
extensión .RDL cuyo contenido es código XML, ya que RDL no es otra cosa que
una variante de XML. Esto te da la posibilidad de poder generar por código el
listado, partiendo de cero, con lo que puedes incluir los campos que
necesites, creando un informe a medida de cada ocasión.

Tienes una introducción a Reporting Services en la siguiente dirección:

http://www.algoritmodigital.com

Es una revista electrónica gratuita que sólo requiere que te des de alta
para poder acceder a su base de artículos. Una vez que hayas entrado, busca
los artículos que yo he publicado, entre los que encontrarás varios sobre
Reporting, que te permitirán hacerte una idea inicial de su funcionamiento.

Posteriormente, para crear tus informes con Reporting usando código, en
primer lugar debes establecer una referencia hacia el servicio web
correspondiente a Reporting Services, el cual ofrece un conjunto de métodos
para su manipulación por código. El ejemplo que te
expongo está realizado con SQL Server 2005, pero creo que podrías adaptarlo
si es necesario para la versión de Reporting de SQL Server 2000.

Si has utilizado los nombres predeterminados en la instalación de Reporting,
la ruta de este servicio web será similar a la siguiente:

http://localhost/ReportServer/Repor...e2005.asmx

A continuación debes echar un vistazo a un archivo .rdl que ya tengas creado
y observar su estructura para poder generar por código uno acorde a tus
necesidades. Ya que el código rdl no es otra cosa que xml, puedes usar la
clase XmlTextWriter para generar este archivo. A continuación te adjunto un
bloque de código como ejemplo de lo que podría ser este proceso. Debes tener
en cuenta que tendrías que completarlo con la generación del resto de
etiquetas y atributos xml para el archivo, pero esto lo puedes ver fácilmente
en cualquier rdl que hayas creado anteriormente:

'//////////////////////////////
Imports System.IO
Imports System.Xml
Imports System.Text
Imports MiProyecto.WSReportService
Imports System.Net
'
Dim oArchivoStream As FileStream = New
FileStream("c:\pruebasReporting\MiReport1.rdl", FileMode.CreateNew)
Dim oEscritorXML As XmlTextWriter = New XmlTextWriter(oArchivoStream,
Encoding.UTF8)
oEscritorXML.Formatting = Formatting.Indented

oEscritorXML.WriteProcessingInstruction("xml", "version=""1.0""
encoding=""utf-8""")
oEscritorXML.WriteStartElement("Report")
oEscritorXML.WriteAttributeString("xmlns",
"http://schemas.microsoft.com/sqlser...tion")

oEscritorXML.WriteElementString("Width", "10.50cm")
oEscritorXML.WriteElementString("PageWidth", "20cm")
oEscritorXML.WriteElementString("PageHeight", "28.5cm")

oEscritorXML.WriteStartElement("DataSources")
oEscritorXML.WriteStartElement("DataSource")
oEscritorXML.WriteAttributeString("Name", "dsNorthwind")
oEscritorXML.WriteStartElement("ConnectionProperties")
oEscritorXML.WriteElementString("DataProvider", "SQL")
oEscritorXML.WriteElementString("ConnectString", "Data
Source=localhost;Initial Catalog=Northwind")
oEscritorXML.WriteElementString("IntegratedSecurity", "true")
oEscritorXML.WriteEndElement()
oEscritorXML.WriteEndElement()
oEscritorXML.WriteEndElement()

oEscritorXML.WriteStartElement("DataSets")
oEscritorXML.WriteStartElement("DataSet")
oEscritorXML.WriteAttributeString("Name", "dsDatos")
oEscritorXML.WriteStartElement("Fields")
oEscritorXML.WriteStartElement("Field")
oEscritorXML.WriteAttributeString("Name", "LastName")
oEscritorXML.WriteElementString("DataField", "LastName")
oEscritorXML.WriteEndElement()
oEscritorXML.WriteStartElement("Field")
oEscritorXML.WriteAttributeString("Name", "FirstName")
oEscritorXML.WriteElementString("DataField", "FirstName")
oEscritorXML.WriteEndElement()
oEscritorXML.WriteEndElement()
oEscritorXML.WriteStartElement("Query")
oEscritorXML.WriteElementString("DataSourceName", "dsNorthwind")
oEscritorXML.WriteElementString("CommandType", "Text")
oEscritorXML.WriteElementString("CommandText", "SELECT LastName,FirstName
FROM Employees")
oEscritorXML.WriteEndElement()
oEscritorXML.WriteEndElement()
oEscritorXML.WriteEndElement()

oEscritorXML.WriteStartElement("Body")
oEscritorXML.WriteElementString("Height", "1.85cm")
oEscritorXML.WriteStartElement("ReportItems")
oEscritorXML.WriteStartElement("Table")
oEscritorXML.WriteAttributeString("Name", "tblInforme")
oEscritorXML.WriteElementString("Top", "0.5cm")
oEscritorXML.WriteElementString("Left", "0.3cm")
oEscritorXML.WriteElementString("DataSetName", "dsDatos")
'
'
' volcar el buffer de escritura en el stream asociado
oEscritorXML.Flush()
oArchivoStream.Close()
oArchivoStream.Dispose()
oArchivoStream = Nothing
'//////////////////////////////

Por último abres el archivo .rdl y lo pasas a un array de bytes; instancias
un objeto del servicio web de Reporting Services y ejecutas su método
CreateReport(), pasándole como parámetro el array que contiene la definición
de tu informe, y si todo ha ido bien, ya podrías ver en la consola de SQL
Server 2005, en la parte correspondiente a Reporting tu nuevo informe.

'//////////////////////////////
oArchivoStream = New FileStream("c:\pruebasReporting\MiReport1.rdl",
FileMode.Open)
Dim aInforme() As Byte = New Byte(oArchivoStream.Length) {}
oArchivoStream.Read(aInforme, 0, oArchivoStream.Length)
oArchivoStream.Close()

Dim oWSReporting As ReportingService2005 = New ReportingService2005()
oWSReporting.Credentials = CredentialCache.DefaultCredentials

Dim aAvisos() As Warning
aAvisos = oWSReporting.CreateReport(Me.txtNombreInforme.Text,
"/ReportPropio", True, aInforme, Nothing)

If aAvisos IsNot Nothing Then
For Each oAviso As Warning In aAvisos
MessageBox.Show(oAviso.Message)
Next
End If
'//////////////////////////////

Y esto sería todo, espero que te sea de utilidad.
Un saludo
Luis Miguel Blanco
http://www.dotnetmania.com


"Sitoweb" wrote:

Hola a todos, a ver si alguien puede ayudarme.

Tengo que hacer unos listados y el problema es que no se los campos que
tengo que listar. Me explico :

Puede ser que dependiendo del usuario que ejecute la aplicacion quiera el
Listado con unos Datos o otros, con lo que ami se me comploca el diseño de
los informes con crystal reports por que no puedo crear el informe xq no se
los campos que tengo que poner. ( y no puedo crear 50.00 reports con todas
las combinaciones.)

Como puedo hacer para decidir que campos quiero poner en el informe y los
que no.

La otra duda es: se puede hacer esto con el crystal report o tengo que
hacerlo de otra manera.

Gracias..
No cual sería la solución.

Preguntas similares