marcozou
Usuario (México)
Que tal.Ahora voy a platicar de una dificultad técnica que me encontré cuando tuve que generar un reporte a través de C# y Crystal Reports.La problemática consistió en que para generar el reporte en CR (para VS 2010), tenía que hacer la conexión a través del asistente del mismo CR, resulta que en tiempo de ejecucion en la pc de desarrollo, trabaja sin problemas, solo le especificaba el usuario y contraseña a través de código, y, wuala, trabajaba suavemente. Sin embargo cuando lo probé en una pc cualquiera, al llegar a la parte del reporte, me solicitaba credenciales para acceder al servidor de bd (Sql Server Express 2008), no pudiendo conectarse ni siquiera con SA.El asunto aqui es que, por alguna razón que mi pequeño cerebro no dedujo, no se efectuaba la conexión, es entonces que me dediqué a investigar en la maravillosa fuente de información que es la Internet, cómo resolverlo, sin llegar a una solución, pero si a varias estrategias para llegar a la solución.Aqui la planteo.Antecedentes, -Uso clases para la conexión a datos, en cada una de las tablas de la BD.-Utilizo clases con sus métodos para las consultas e inserciones.-Crystal reports no usaba estas clases para la conexión a datos (si ya se, soy un buey), utilizaba el asistente.Acciones.-Quité la conexión de crystal reports a través del asistente, y usé un reporte en blanco.-Agregué campos de texto al reporte, para los datos dinámicos, en total fueron 8 para un reporte y 11 para otro, además de los encabezados.-Eché mano de una nueva consulta sql, con los datos requeridos, para generar un dataset en tiempo de ejecución y mandarlos, también en tiempo de ejecución al reporte, y esto fue lo más divertido, en seguida lo detallo.Primero que nada tengo un reporte en blanco de CR al cual le agregué las etiquetas a pata y en donde deben ir los datos les puse nombres del tipo "txtdato1, "txtdato2", hasta que cubrí esa parte. Posteriormente, en VS el crear el reporte sólo lo declaras, se tiene que instanciar de alguna forma, o desde alguna forma.Entonces, al cargar la forma desde donde se llama el reporte en el evento Load, se genera el dataset que se enviará al reporte, (cabe destacar que esto lo hago para un reporte del tipo encabezado, no lleva un detalle, ya se presentará la problemática, pero por ahora solo tengo esto)private void visor_reporte_Load(object sender, EventArgs e) { orden imprimiendo = new orden(); ---> Se instancia la clase donde hago la consulta DataSet ds = imprimiendo.imprimir(this.Nuo); ->Se ejecuta el metodo de la consulta DataTable resultado = ds.Tables[0]; --->Se asigna el dataset devuelto a una tabla. impresion imp = new impresion(); --->Se instancia el reporte lo llame impresion, ingenioso!! CrystalDecisions.CrystalReports.Engine.TextObject txt1; --->Se debe declarar un objeto de texto de CrystalDecisions.CrystalReports.Engine.TextObject txt2; --->reporte, medio raro, pero asi debe ser, por CrystalDecisions.CrystalReports.Engine.TextObject txt3; ----> cada dato del reporte CrystalDecisions.CrystalReports.Engine.TextObject txt4; CrystalDecisions.CrystalReports.Engine.TextObject txt5; CrystalDecisions.CrystalReports.Engine.TextObject txt6; CrystalDecisions.CrystalReports.Engine.TextObject txt7; CrystalDecisions.CrystalReports.Engine.TextObject txt8; CrystalDecisions.CrystalReports.Engine.TextObject txt9; CrystalDecisions.CrystalReports.Engine.TextObject txt10; CrystalDecisions.CrystalReports.Engine.TextObject txt11;---->Se debe de asignar el elemento del reporte al elemento de texto de reporte, pero no sin antes hacer una conversion o "cast" para que pueda aparecer la propiedad text y entonces asignar el resultado del dataset asignado en la tabla "table". txt1=(CrystalDecisions.CrystalReports.Engine.TextObject)imp.ReportDefinition.ReportObjects["txtor"]; txt2 = (CrystalDecisions.CrystalReports.Engine.TextObject)imp.ReportDefinition.ReportObjects["txtfc"]; txt3 = (CrystalDecisions.CrystalReports.Engine.TextObject)imp.ReportDefinition.ReportObjects["txtfa"]; txt4 = (CrystalDecisions.CrystalReports.Engine.TextObject)imp.ReportDefinition.ReportObjects["txtre"]; txt5 = (CrystalDecisions.CrystalReports.Engine.TextObject)imp.ReportDefinition.ReportObjects["txtte"]; txt6 = (CrystalDecisions.CrystalReports.Engine.TextObject)imp.ReportDefinition.ReportObjects["txtpo"]; txt7 = (CrystalDecisions.CrystalReports.Engine.TextObject)imp.ReportDefinition.ReportObjects["txtpr"]; txt8 = (CrystalDecisions.CrystalReports.Engine.TextObject)imp.ReportDefinition.ReportObjects["txtfac"]; txt9 = (CrystalDecisions.CrystalReports.Engine.TextObject)imp.ReportDefinition.ReportObjects["txtli"]; txt10 = (CrystalDecisions.CrystalReports.Engine.TextObject)imp.ReportDefinition.ReportObjects["txtes"]; txt11 = (CrystalDecisions.CrystalReports.Engine.TextObject)imp.ReportDefinition.ReportObjects["txtne"];-----> Aqui ya se asigna a la propiedad texto el contenido requerido de la tabla devuelta por la consulta en el método llamado arriba. txt1.Text = resultado.Rows[0][0].ToString(); txt2.Text = resultado.Rows[0][1].ToString(); txt3.Text = resultado.Rows[0][2].ToString(); txt4.Text = resultado.Rows[0][3].ToString(); txt5.Text = resultado.Rows[0][4].ToString(); txt6.Text = resultado.Rows[0][5].ToString(); txt7.Text = resultado.Rows[0][6].ToString(); txt8.Text = resultado.Rows[0][7].ToString(); txt9.Text = resultado.Rows[0][8].ToString(); txt10.Text = resultado.Rows[0][9].ToString(); txt11.Text = resultado.Rows[0][10].ToString(); impresion.ReportSource = imp; ---> Este "impresion" es el control donde se muestra el reporte en la ---> forma, no es la clase del reporte, es un "crystalreportviewer" }Es así como me funcionó el reporte sin necesidad de autenticación por parte de CR, debido a que sólo le paso los datos a través de asignacion directa de un datatable a los elementos del reporte.Esto hizo más eficiente el tiempo de carga y mostrado del reportito.Espero le sirva a alguien más.Nos vemos.

Cuna para Camila Hola. Hace 9 meses nos enteramos con mucha felicidad que seríamos padres por primera vez. A partir de entonces comencé con un pequeño proyecto, pero muy importante para mí: la construcción de una cuna para mi futura hija. De tal forma que comencé con una ardúa investigación en Internet para encontrarme con algún diseño con medidas, forma de ensambe y casi casi ya hecha, pero, ¡oh decepción! Nada de eso en el ciberespacio, solo planos, para los cuales tenía que hacer un pago para obtenerlos. Así pues, después de revisar modelos en mueblerías y tiendas departamentales, comencé a esbozar un diseño muy sencillo, pero funcional, de pronto también me encontré con las medidas básicas para fabricarla, desde ancho, largo, medidas minimas de los barandales, medida del espacio entre barandales, etc. La intención del presente es documentar el desarrollo, y sobretodo tratar, concretamente, de establecer las medidas usadas asi como la forma de ensamble y el material utilizado. Comencemos Material: - La madera utilizada: pino, tanto en tablas como para las hojas de triplay. - Tablas: 2 de 10 cm, 1 de 20 cm, 1 de 30 cm, el largo de éstas es de 2.20 cm. - Triplay: 1 de 6 mm, la medida es 122 cm x 244 cm. - Varias pijas negras, 1" y 1 1/2" - Pegamento del 850 o blanco. - Clavos sin cabeza de 1". - Sierra circular (facilita los cortes) - Router o fresadora de madera (facilita los ensambles) - Taladro. - Lijadora. - 1 perro golden retriever llamado Kikus, se hace más fácil todo.... - Lija del 80, 120, 150 y 240. El boceto de la cuna hecho a mano. Sólo la estructura principal. La estructura está diseñada para un colchón de 1.2 m x 0.6 m, por esa razón el ancho de la cuna es de 64 cm, para librar los 2 cm de ancho que tienen las tablas laterales. Los barandales fueron armados para que sean: 1 de 60 cm de alto, para un lado, y 2 de 30 cm de alto, para conformar la altura de 60 cm además de poder hacer accesible la cuna, de forma que pueda depositar ahi a mi primorsillo. Hasta este momento lucía así: La forma como hice los ensambles de los travesaños es de macho-hembra, le rebajé a la tabla horizontal de forma que entrara en el canto de las tablas verticales. Algo como la siguiente ilustración (a mano, no tomé foto) Además para el ensamble del panel de triplay, ranuré el canto interno de las tablas que conforman el marco. La ranura es de un 1/4 ", para una medida de triplay de 6mm. Tanto el ranurado como los desvastes para el "macho" y la "hembra", los realicé con un router o fresadora. Ya que ranuré los travesaños y los postes, introduje la tabla cortada de la hoja de triplay, las medidas son las del espacio entre las tablas, pero le adicioné 1 cm para que se ensamblara con el ranurado, en mi caso la tabla quedo de 46 cm x 62 cm. Despues realicé el primer lijado de toda esta estructura inicial. Ahi está conmigo, mi principal aspiradora de polvo de madera. Continuando, ahora era el turno de los barandales, los cuales son 3, 1 para un costado, y dos para el otro, el primero es fijoy la altura es de 60 cm, de los 2 restantes uno es fijo con una altura de 30 cm, y el otro va colocado con bisagras al otro, de esta forma nos da la altura de 60 cm (más la altura del centro de la bisagra, nada significativo) y nos permite el acceso a la cuna para depositar al tesorito sin problema alguno. Las tablas para estos fueron 6 de 5 cm de ancho por 1.2 m de largo, los cuales son las tablas exteriores o travesaños, y luego los barrotes, el ancho de estas es de 3 cm, y el espesor es de 1 cm. El largo para los barrotes del barandal grande es de 52 cm, debido a que 1 cm de cada lado esta rebajado para entrar en el travesaño de su lado, el cual tiene una ranuración de 1 cm de profundidad por 3 cm de largo, de la misma forma para los barandales pequeños, el largo quedo de 22 cm. Realicé la ranuración de los travesaños, cada 6.5 cm comenzando por un extremo, haciendo la ranura de 3 cm. Es importante marcar ambos travesaños al mismo tiempo, de esta forma los barrotitos quedarán derechos, para ensamblar estos, apliqué pegamento para posteriormente clavarlos entre sí con clavos de 1/2" sin cabeza. Y va quedando mas o menos así... Para pulirla lo estoy haciendo con una lija del 80, eso le quita muchas imperfecciones a la madera, para luego proceder con una de 120, esto la deja muy suave y lista para el entintado. En la lijada me estoy llevando el mayor tiempo, o al menos así lo parece, definitivamente debí haber pulido primero la tabla de la cual saqué los barrotes, porque de uno por uno y ya ensamblados, es más laborioso. Ya que la he lijado, sinceramente pude haberlo hecho mejor, pero ya con el tiempo corriendo, puesto que mi niña está creciendo rapidamente y su moisés está quedando chico y ella ya se quiere estirar. Para entintarla use un tono ciprés de la marca Sayer Lack, la cual apliqué con una camiseta de algodón vieja, en dos manos, la dejé asentar "orearse" 24 horas, y apliqué ahora un barniz sellador de la misma marca, con brocha de pelo negro o estándar, esta vez sólo apliqué una mano en la mayoría, pero en las partes mas visibles, dos, después que se secó, la asenté con lija del 320, le saque las imperfecciones, con un lijado muy tenue, posteriormente le quite el polvo con un trapo húmedo y pase al barnizado con laca brillante, esta vez aplicada con brocha de pelo fino, misma marca. El resultado ha sido este. En realidad, definitivamente el proceso de hechura se puede mejorar, al igual que el acabado, sin embargo creo que con el conocimiento empirico acerca de la madera y su tratado, ha sido un buen esfuerzo con mucho amor y cariño para mi nena. Espero esto sirva a alguien más. Saludos