jueves, 27 de noviembre de 2008

Como crear Reportes Dinámicos con Crystal Reports y C# en WebForms usando DataSets y DataTables

Hace tiempo me tope con la necesidad de generar reportes en ASP.NET e imprimirlos. Investigando un poco, me tope con el detalle que no es tan fácil realizarlo como sería en un ambiente de escritorio. De hecho, se complicaba un poco más ya que debía de utilizar DataSets dinámicos, es decir, generados durante el uso de la aplicación, no desde un principio.

Decidí utilizar Crystal Reports, ya que se encuentra implementado dentro de Visual Studio 2005, incluyendo opciones como exportación a diferentes formatos como Excel y PDF.

Investigando un poco, me encontré con un código proporcionado por Fernando Berenguer Doménech en el cuál explicaba el método para realizarlo. Basándome en este gran apoyo, pude dar con la solución que a continuación expongo:

Principalmente agregó al proyecto un reporte Crystal Reports desde el Explorador de Soluciones. Yo le deje el nombre de CrystalReport.rpt

Más adelante le daremos formato al reporte. Por mientras lo dejaremos tal cuál como se agrego. Posteriormente insertamos a nuestro formulario un CrystalReportViewer, al cuál yo le puse de nombre crv1; este control será por el cuál mostraremos nuestro reporte o archivo .rpt


Es importante mencionar que ya contamos con el DataSet que queremos imprimir. Recordando que dentro de este contamos con diferentes DataTables identificados por un índice o nombre.

public static DataSet ds1 = new DataSet();

Durante el desarrollo de la aplicación lleno mi DataSet con una consulta SQL.

Ahora veremos el código que utilicé para enviar a imprimir un DataSet generado dinámico.

/*Yo lo puse dentro del evento Page_Load*/
protected void Page_Load(object sender, EventArgs e)
{
/*Construimos un DataSet y un DataTable para ser enviados como origen de datos a Crystal Reports. El DataTable lo indentificaremos con un nombre especifico*/

DataSet myDS = new DataSet();

DataTable myDT = new DataTable("dataset");


/*Mezclamos el DataTable que acabamos de crear con el DataTable que proviene de nuestro DataSet donde esta el resultado de una consulta SQL. Para esto utilizamos el método Merge*/


myDT.Merge(ds1.Tables[0]);

/*Agregamos el nuevo DataTable al DataSet que será el origen de datos de Crystal Reports
*/
myDS.Tables.Add(myDT);


/*Ahora creamos un archivo XML que contendrá nuestro DataSet. En teoría, este será escrito temporalmente en este archivo, que a su vez se convertirá en el origen de datos en el Reporte de Crystal Reports. Cabe mencionar que es muy importante que se tengan los permisos necesarios en la carpeta*/
myDS.WriteXml(@"C:\Inetpub\wwwroot\proyecto\xml\report.xml");

/*Ahora cargamos el archivo .rpt De igual manera hay que considerar los permisos necesarios*/

CrystalDecisions.CrystalReports.Engine.ReportDocument myrpt;

myrpt = new CrystalDecisions.CrystalReports.Engine.ReportDocument();

myrpt.Load(@"C:\Inetpub\wwwroot\proyecto\rpts\CrystalReport.rpt");


/*Establecemos como Origen de Datos el DataSet que llenamos */

myrpt.Database.Tables["preview"].SetDataSource(myDS);


/*Llenamos el CrystalReportViewer con la información*/
crv1.ReportSource = myrpt; crv1.DataBind();
}

Ahora… aun no funciona como debería ser. Es turno de trabajar con el reporte CrystalReport.rpt y prepararlo para que muestre la información como debería de ser. En este archivo tendremos que configurar en el Explorador de Campos el origen con un DataSet creado en un archivo xml.

Aquí es muy importante considerar que en el DataSet, el DataTable y los campos deben de llamarse igual que a los del resultado de la consulta SQL. A continuación creamos el archivo report.xml


Nótese el nombre del campo después de “NewDataSet”, ”preview” es como se llama nuestro DataTable.

Una vez tengamos creada esta “Base de Datos Temporal”, nos ubicaremos en el CrystalReport.rpt y utilizaremos el Explorador de Campos para dar de alta nuestro DataSet del XML.


Sobre la opción Campos de Base de Datos, daremos clic derecho y elegiremos Asistente de Base de Datos. En la ventana nueva, abriremos la carpeta Datos del Proyecto y Objetos .NET; será entonces donde podremos elegir en Ruta del Archivo el XML que creamos anteriormente.


Ya que tengamos cargado el DataSet, lo pasaremos por completo a la lista de Tablas Seleccionadas. De esta manera habremos determinado como Origen de Datos nuestro DataSet, con un DataTable llamado “preview” y con sus campos; los cuáles podremos pasar manualmente a nuestro CrystalReport .rpt



A estos campos podremos darle el formato que deseemos, la ubicación en el reporte, etc. Si todo salió bien, al momento en que probamos nuestra aplicación, el DataSet en el XML será llenado y el reporte lo podrá visualizar desglosando el listado de registros.

Cualquier duda ya saben donde encontrarme.

lunes, 20 de octubre de 2008

PHP y Postgres

Es relativamente fácil utilizar la base de datos Postgres en PHP. Si anteriormente habías conectado PHP con MySQL, es practicamente lo mismo.

1.- Modificamos el PHP.ini para agregar la extensión de pgsql. En ambiente Windows basta con teclear en menú ejecutar php.ini para abrirlo y modificarlo. En linux deberas de localizarlo en la carpeta de Apache.

2.- Dentro de este archivo, en el caso de windows bastara con descomentar la siguiente línea:

extension=php_pgsql.dll

3.- En ambiente Linux son varias líneas que se pueden descomentar y modificar; cada una de ellas tiene comentado su descripción, por ejemplo:

pgsql.allow_persistent = On
pgsql.auto_reset_persistent = Off
pgsql.max_persistent = -1
pgsql.max_links = -1
pgsql.ignore_notice = 0
pgsql.log_notice = 0

4- Todo esto con el fin de preparar la conexión. Es importante reiniciar el servidor Apache una vez guardados los campos.

5.- Para establecer una conexión PHP - Postgres, crearemos un archivo al que llamaremos conec.php e incluiremos las siguientes lineas:

/*Utilizamos una función para establecer la conexión*/
function Conectarse()
{
/*Mediante una condicion determinamos si se establecio o no la conexion.
Usamoa la pg_connect donde colocamos los parámetros:
dbname=Nombre de la Base de Datos
port=Puerto de Conexion a la Base de Datos
user=Nombre de Usuario para conectarse
password=Password para conectarse*/
if (!($conexion = pg_connect("dbname=gyc port=5432 user=usuario password=password")))
{
/*Si la conexion no es exitosa se mostrara el siguiente mensaje y salimos*/
echo "No pudo conectarse al servidor";
exit();
}
/*No importa si se establecio o no la conexion, esta sera devuelta por la funcion*/
return $conexion;
}

/*Ahora mandamos a llamar la funcion*/
Conectarse();

6.- Este archivo lo podemos guardar en alguna parte de nuestro proyecto y usar su ruta absoluta, pero en el caso de este ejemplo, lo colocaremos en la misma carpeta donde estara el archivo en donde usaremos la Base de Datos. Este archivo se llamara ejemplosql.php




7.- En ejemplosql.php incluiremos el siguiente código:

/*Incluimos el archivo de conexión*/
include("conec.php");

/*Guardamos en una variable el valor retornado de la función de conexión*/
$con=Conectarse();

/*Guardamos en una variable la sentencia SQL, en este caso del tipo SELECT*/
$sql_select_1 = "select nombre, edad from alumnos where id_alumno = '10'";

/*Realizamos la conexión y ejecutamos la consulta SQL mediante la función
pg_Exec con los parámetros de conexión a la Base de Datos ($con) y la sentencia SQL ($sql_select_1)*/
$query_select_1 = pg_Exec($con, $sql_select_1);

/*Si todo salio bien, obtendremos un objeto con los datos obtenidos de la consulta SQL,
mediante la funcion pg_fetch_object. Solo para los casos de SELECT*/
$query_result_1 = pg_fetch_object($query_equipos);

/*Una vez obtenido los datos, los podemos todavia extraer de forma mas particular,
mediante los nombres de los campos y guardandolos en variables*/
$nombre = $query_result_1->nombre;
$edad =$query_result_1->edad;

/*Imprimos las variables, comprobando el resultado.*/
echo "El nombre es: ".$nombre;
echo "Y su edad es: $edad años";

8.- Hasta este punto, hemos logrado realizar una conexión PHP - Postgres. Si obtuvimos algun error, podremos buscarlo por medio del numero de línea, así mismo si el error esta en la sentencia SQL.

9.- La clase de sentencia SELECT que utilizamos es para obtener datos específicos en una sola fila. Si deseamos recuperar información en un resultado SELECT de mas de una línea:

/*Incluimos el archivo de conexión*/
include("conec.php");

/*Guardamos en una variable el valor retornado de la función de conexión*/
$con=Conectarse();

/*Guardamos en una variable la sentencia SQL, en este caso del tipo SELECT*/
$sql_select_2 = "select nombre, edad, grado from alumnos where edad < '18'";

/*Realizamos la conexión y ejecutamos la consulta SQL mediante la función
pg_Exec con los parámetros de conexión a la Base de Datos ($con) y la sentencia SQL ($sql_select_2)*/
$query_select_2 = pg_Exec($con, $sql_select_2);

/*Obtenemos el número de filas del resultado con la función pg_num_rows*/
$no_filas = pg_num_rows($query_select_2);

/*Mediante un ciclo for, leemos cada una de las filas*/
for ($i=0;$i<$no_filas;$i++)
{

/*Guardamos en un vector cada una de las filas durante el ciclo con la función
pg_fetch_array con los parametros del objecto SQL y el numero de fila durante el ciclo*/
$array_local = pg_fetch_array($query_ausencias_local,$i);

/*Creado el vector, y durante el ciclo, podemos leer cada una de las filas mediante sus posiciones*/
echo "Su nombre es: $array_local[0], tiene $array_local[1] años y esta en el $array_local[2] grado";
}

10.- Para el caso de sentencias SQL como update, delete e insert, se utiliza como se muestra a continuacion:

$sql_update = "update alumnos set nombre = 'Mauricio', edad = '24', grado = '8'";
pg_Exec($con, $sql_update);

jueves, 18 de septiembre de 2008

Windows vs Linux en 3 Rounds

Round 1
Round 2

Round 3

Linux vs Windows - Round 3 | Linux Adictos from Esty on Vimeo.

Como será el siguiente...?

Fuente: http://www.vivalinux.com.ar/articulos/mortal-kombat-linux-vs-windows.html

jueves, 11 de septiembre de 2008

Las Chicas de mis sueños... chicas Geek

Anteriormente habia platicado de lo genial que sería tener una novia Geek, sin embargo nunca imagine que hubiera tantas, por lo que el sueño se puede hacer realidad (que cursi!!!). Me encuentro con una lista de chavas Geek, conocedoras de Linux, incluso muchas de ellas desarrolladoras, con amplios conocimientos en aspectos tecnológico... y sobre todo muy guapas.

Celeste Lyn Paul: Diseñadora de interacción, investigadora y contribuidora del desarrollo de open source. También lidera el KDE Usability Project, mentor de OpenUsability Season of Usability y está involucrada en el desarrollo de Kubuntu. (Ya tiene novio T_T)





Erinn Clark: Una desarrolladora de Debian que también fue co-fundadora y lidera actualmente el proyecto Debian Women. Un proyecto muy interesante, pero al que solo pueden entrar mujeres.





Valerie Henson: Val (así le dice todo el mundo) es una hacker (UNA HACKER!!!!) del Kernel de Linux especializada en el desarrollo de filesystems. Actualmente trabaja para Red Hat.



Pia Waugh: Esta australiana está completamente dedicada al software libre. Es actualmente la presidenta de la organización Software Freedom Day y vicepresidente de Linux Australia. Al parecer tiene un gusto por las artes marciales... si sabe pelear y desarrollar en Linux... mis respetos la verdad.





Eva Brucherseifer: Ingeniera eléctrica de Alemania que está detrás de los proyectos KDE-Women, KDE-Edu y KDE-Solaris.



Y ellas son solo una pequeñisima muestra de la cantidad de mujeres profesionales dedicadas al mundo Linux, con exito en sus carreras y desarrollo profesional. Me parece genial que las mujeres esten entrando y fuerte en esta área en la que se creia solo para hombres.

Despues de escribir esto, me quedo enamorado de mas de una de la lista de arriba... tal vez tener una novia Geek no sea despues de todo un sueño gaujiro.

Chicas Geek, no dejen de visitar ¿que clase de novio les gustaria tener?.

sábado, 6 de septiembre de 2008

REC

Despues de tanto tiempo de no escribir en este Blog, regreso para recomendarles una película un tanto antigua, pero que no deja de estar buena. Del género de Horror, REC es una producción española co-dirigida por Jaume Balagueró y Paco Plaza. Fue estrenada en Noviembre del 2007 en España, pero llego a México este mes de Septiembre.



Lo interesante de esta película, es que esta hecha bajo el formato de un falso documental, muy al estilo de Cloverfield. Todo los hechos son narrados desde cámara al hombro, dando una sensación presencial de los hechos, aparte de marearte y llevarte uno que otro susto.




Una reportera y su camarografo llevan a cabo una investigación con los bomberos de la ciudad, los cuales acompañan a uno de sus tantos llamados de emergencia, sin imaginarse el horror que se desataría.



Lo interesante de la película, es que a pesar de manejar un tema un tanto ya usado, la forma en que se desarrolla te lleva a estar imaginando lo que realmente esta pasando, el por que de los hechos, y lo peor de todo... como sobrevivir. Esa sensación de huir con la cámara le da un toque de horror y hasta de sorpresa que no permite que te muevas de tu asiento por saber que pasará, hasta que ella misma hace que saltes del susto. Una de las mejores producciones españolas a mi parecer, ganadora de varios premios, como mejor actriz, mejor director, y mejores efectos especiales. REC es sin duda una película altamente recomendable para aquellos que gusten del cine de horror. Actualmente se esta construyendo el argumento de la 2a Parte, y en Hollywood ya preparan su versión, donde los hechos suceden en Los Angeles. Aquí les dejo el trailer de la película para que lo chequen.


viernes, 18 de abril de 2008

Niño Matemático predice el fin del mundo el 13 de Abril del 2036

Aunque falta mucho para que la dichosa fecha nos alcance, es interesante saber el potencial matemático de Nico Marquardt, un chavito de 13 años que corrigió los cálculos de la NASA acerca de un asteroide que pasará muy cerca de la tierra en unos años.

Segun la NASA, aproximadamente en el 2036, asteroide Apophis (Dios Egipcio de la Destrucción) pasará cerca de la tierra, casi a unos 32500 km, un distancia menor a la que hay entre nuestro planeta y la luna. Eso ocasionaría que a su paso impactará contra una enorme cantidad de satélites artificiales orbitandonos. Esto podría ocasionar el desvió de su trayectoria.


Ilustración del dios Apophis...

Si bien nos va, lo alejarían de nosotros. Si mal nos va, lo mandarían directamente a la tierra. Pero supongamos que el asteroide Apophis pasará sin hacernos daño. Siete años después, cuando le de la vuelta al sol, regresaría muy cerca de nosotros. La NASA calculó 2 entre 100,000 la probalidad de que nos impactará.

Pues el chaval, Nico Marquardt, desde el observatorio Instituto de Astrofísica de Postdam, calculó que en realidad las posibilidades son de 2 entre 1000, cien veces menor que la NASA. Esto significaría que en el 2029 el Apophis pasará muy cerca de la tierra, y 7 años despues podría impactarnos de lleno, matando millones de personas, lanzando un Tsunami devastador y cubriendo la tierra de una gruesa capa de polvo que no dejaría pasar la luz del sol en años... el resto ya se lo imaginan.

La NASA acepto su error, y reconoció los resultados de Nico como correctos. Esperemos que para ese tiempo Nico Marquardt pueda, con sus calculos matemáticos, encontrar una manera de salvarnos... si no tendremos que revivir a Bruce Willis para que vaya al asteroide y lo haga explotar otra vez.