none
leer xml y enviar parametros a template Crystal RRS feed

  • Pregunta


  • buenas tardes creo que ando un poco perdido empiezo a programar con c#

    hace poco estaba programando en delphi y generaba un template con rave reports, le enviaba parametros leidos de una archivo xml que estraia de la base de datos en SQL server para generar un pdf y todo bien... la empresa decidio cambiar sus sistemas a c# y ando un poco perdido necesito hacer lo mismo pero con c# tengo visual studio 2010

    hasta ahora solo he consultado la base de datos y leido los nodos del xml pero no se como generar una plantilla con crystal(estoy un poco perdido en este tema antes habia usado fortesreport y rave report pero nunca crystal) y enviarles los parametros de cada uno de los nodos leidos de un xml al template que aun no logro hacer con crystal y obtener como producto final un pdf

    cualqueir aporte se los agradecere enormemente

    gracias de antemano

    viernes, 30 de diciembre de 2011 1:08

Todas las respuestas

  • el tema es que con creystal no necesitas xml, podrias usar dataset tipados y cargarlos con una query directo de la db, sin nodos ni nada raro, directo sql una consulta en un dataset tipado y listo generas el reporte en crystal

     

     Crystal Reports Usar DataSet Tipado con dos DataTable

     

     

    Informes Crystal Reports

    Creación de Reportes con Crystal Reports en Visual Studio 2005/2008

    como veras es directo no envias parametros asignas un origen de datos al reporte

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    viernes, 30 de diciembre de 2011 3:12
  • Gracias Leandro por su pronta respuesta, el motivo del uso del XML  es montar un Web Service el cual reciba los XML de los clientes, enviarlos al SAT, este nos devuelve el XML con un Timbre Fiscal Digital, se almacena en nuestra base de datos con todos los datos del cliente y pues ya que tengo todos los datos en el XML generar el pdf

     

    lo que me gustaría hacer sería algo como esto...

     

                SqlCommand conXMLS = new SqlCommand(query, conexionSQL());                      
                SqlDataAdapter adapter = new SqlDataAdapter();
                adapter.SelectCommand = new SqlCommand(query, conexionSQL());
                DataTable tab = new DataTable();
                adapter.Fill(tab);
    
                
                //leemos el xml
                string archivo = (string)tab.Rows[0]["xmls"];
                //variables datos nodos
                string uuid = '"';
                string fechacreado = "";
                string RFC = "";
                string noCertificado_expide = "";
                string certificado_xml = "";
                string sello = "";
    
                XmlDocument docXML = new XmlDocument();
    
                docXML.LoadXml(archivo);
    
                XmlNodeList listaelementos = docXML.GetElementsByTagName("cfdi:Comporbante");
                    for(int i = 0; i> listaelementos.Count; i++)
                    {
                        fechacreado = listaelementos[i].Attributes["uuid"].Value;
                        
                    }
                ParameterFields uuids = new ParameterFields();
                ParameterField uuid = new ParameterField();
                ParameterDiscreteValue myDiscreteValue = new ParameterDiscreteValue();
                uuid.ParameterFieldName = "uuid";<br/><br/>
    

    lo estaba haciendo de esta forma pero me quede en el envió al reporte por qué no supe como enviarlo

     

    para hacer el reporte... le di nuevo elemento informe y agregue el parámetro @uuid pero no supe como enviárselo jeje

     

    una vez más gracias por su apoyo

    viernes, 30 de diciembre de 2011 16:21
  • Yo comparto la opinión de Leandro. XML es una forma de intercambio de datos costosa en ancho de banda y uso de memoria. Lo que yo haría sería construir un dataset tipado y llenarlo con los datos del XML, pero si insistes en hacerlo mediante XML lo puedes hacer también.

    La forma que yo conozco (a lo mejor algún otro miembro puede aportar otra forma) es crar el reporte sobre un fichero XML y luego sobreescribir tu XML en ese fichero. Supongo que se podrá hacer algo parecido mediante código (por ejemplo, como se hace con el método SetDataSource cuando tienes un datatable o un dataset).

    Espero que eso te sirva de algo.

    Saludos,

     

    Y.


    Si la respuesta te ha servido, márcala como útil.
    martes, 3 de enero de 2012 19:27
  • gracia por su respuesta ya comence a hacerlo, pero cualquier otro metodo como el que comenta el compañero Ecarri es bienvenido,

     

    estoy confundido con lo del dataset tipiado? como lo creo por codigo o es un elemento?

     

    ahora mismo estoy leyendo respecto al tema dataset tipiado por que ya leo el XML y envio prametros al infrome de Crystal pero no se como cargar las imagnes de forma dinamica como los parametros enviados, gracias por su ayuda

     

    anexo la forma en que lo estoy haciendo gracias de antemano

     

    XmlNodeList Comprobante = docXML.GetElementsByTagName("cfdi:Comprobante");
                for (int i = 0; i < Comprobante.Count; i++)
                {
                    uuid= Comprobante[i].Attributes["uuid"].Value;
                    fecha= Comprobante[i].Attributes["fecha"].Value;
                }
    
     CrystalDecisions.CrystalReports.Engine.ReportDocument CrReport = new CrystalDecisions.CrystalReports.Engine.ReportDocument();
                CrReport.Load("C:/EDGAR/Desarrollo/impresionFormatos/impresionFormas/impresionFormas/crCFDI.rpt");
    
                parametroCFDS.ParameterFieldName = "uuid";
                crDiscrete.Value = uuid;
                CrReport.ParameterFields[0].CurrentValues.Add(crDiscrete);
    
                parametroCFDS.ParameterFieldName = "fecha";
                crDiscrete.Value = fechacreado;
                CrReport.ParameterFields[1].CurrentValues.Add(crDiscrete);
    
    crystalReportViewer1.ReportSource = CrReport;


    martes, 3 de enero de 2012 20:07
  • Un dataset es simplemente una definición de un conjunto de tablas de datos y sus relaciones.

    Hay varias formas de crearlos:

    a) Si el dataset es para accesar una base de datos, Visual Studio te permite leer la estructura de esa base de datos y construye los datasets que quieras de forma más o menos automática.

    b) También se pueden crear de forma manual en el editor de datasets de visual studio.

    En tu caso, como los datos los tienes en un XML, posiblemente tendrás que hacerlo por la opción "b" a menos que tengas un provider odbc u oledb para xml que lea tu fichero.

    Lo que debes hacer es lo siguiente:

    1) En tu proyecto, haces Agregar ->Elemento nuevo -> Conjunto de Datos

    2) Al abrirse el editor de dataset, hacer clic en el enlace que dice "cuadro de herramientas".

    3) Para cada colección de datos en tu XML, agregas una Tabla (no confundir con TableAdapter, que es distinto)

    4) Agregas las columnas a la tabla, modifica las propiedades para especificar el tipo de datos.

    5) Guardas los cambios.

    El siguiente paso es pasar el contenido del xml al dataset. Hay varios artículos que hablan de cómo hacerlo, y depende en buena medida de si tu xml contiene metadata o no. Yo pensaría que no contiene metadata, por lo debes usar el método ReadXml pasándole IgnoreSchema en el parámetro XmlReadMode.

    Aquí tienes más información:

    http://msdn.microsoft.com/es-es/library/fx29c3yd(v=vs.80).aspx

    http://support.microsoft.com/kb/311566


    Si la respuesta te ha servido, márcala como útil.
    • Propuesto como respuesta Yván Ecarri miércoles, 4 de enero de 2012 8:12
    miércoles, 4 de enero de 2012 8:12
  • grandiosa tu aportacion compañero Ecarri ya logre hacer lo que necesitaba, solo que me encontre con un pequeño detalle...

     

    ejemplo tengo un esquema de xml que tiene nodos definidos y atributos que estan definidos pero algunos son opcionales, cuando no existen como hago referencia a ellos me marca un error

     

    trate de hacer lo siguiente pero sigo igual

    domfiscal[i].Attributes["localidad"].Value = null;
                try
                {
                }          
                catch
                {
                    colonia = domfiscal[i].Attributes["colonia"].Value + ", " + domfiscal[i].Attributes["localidad"].Value + ", C.P." + domfiscal[i].Attributes["codigoPostal"].Value;
                }

     

    gracias de antemono y disculpen las molestias causadas

     

    viernes, 6 de enero de 2012 16:35
  • No puedes asignar null directamente a un campo de un datatable. Usa dbnull.value

     

    Por otra parte, no sé si entendí bien lo que quieres hacer pero el Try no debe estar vacío. Debes meter en el try aquellas instrucciones que pueden fallar, por ejemplo, así:

     

                try
                {
    
                     domfiscal[i].Attributes["localidad"].Value = DbNull.Value; 
                }           
                catch
                {
                    colonia = domfiscal[i].Attributes["colonia"].Value + ", " + domfiscal[i].Attributes["localidad"].Value + ", C.P." + domfiscal[i].Attributes["codigoPostal"].Value; 
                }
    


     

    Pore favor, si te son útiles las respuestas, márcalas como respuesta aceptada y puntúalas positivamente.


    Si la respuesta te ha servido, márcala como útil.
    • Propuesto como respuesta Yván Ecarri lunes, 9 de enero de 2012 8:11
    lunes, 9 de enero de 2012 8:11
  • l

     

    o que queria saber era si un atributo estaba dentro de un nodo, por que al momento de hacer referencia a el y no

     XmlNodeList tfd = xmlDoc.GetElementsByTagName("tfd:TimbreFiscalDigital");
                for (int a = 0; a < dset.Tables["TimbreFiscalDigital"].Columns.Count; a++)
                {
                    atributo = tfd[0].Attributes[a].Name;
    
                    switch (atributo)
                    {
                        case "UUID":
                            uuid = tfd[0].Attributes[atributo].Value;
                            break;
     
                        case "total":
                            total = tfd[0].Attributes[atributo].Value;
                            break;
                     }
                   }


    de esa forma hago referencia solo a los atributos que existen y he solucionado el error
    ahora el problema que tengo es la carga de una imagen lo hago de la siguiente forma pero no funciona no marca errores pero no las muestra

    en mi data set tengo una columna de tipo Byte[] y la pongo en mi reporte

    y este es el codigo

    dtable.Columns.Add("imagen", System.Type.GetType("System.SByte[]"));
    
    
    drow["imagen"] = ConversionImagen("C:/logos/logoPD.jpg");
    
    

    no se que pase por que si me carga los datos de la tabla pero el campo imagen solo lleva
    System.Byte[]

    lunes, 9 de enero de 2012 19:07
  • Este tema es candidato para moverlo al foro de Ado.Net :-)

     

    ¿A qué te refieres cuando dices "no se que pase por que si me carga los datos de la tabla pero el campo imagen solo lleva 

    System.Byte[]" ?


    La forma como estás creando la columna y asignando la imagen es la correcta (asumiendo que ConversionImage devuelve un byte array).

    Es normal que la columna muestre el texto "System.Byte[]" porque eso es lo que retorna el ToString() del objeto, pero eso no significa que los datos  no estén allí.

    Mira este video. Lo que te interesa está a partir de 4:25: http://www.youtube.com/watch?v=-GAz7AH6-vA

    Saludos,


    Y.

    Si la respuesta te ha servido, márcala como útil.
    martes, 10 de enero de 2012 7:52