miércoles, 31 de octubre de 2007

REPORTEADOR DINAMICON CON TREEVIEW Y LISVIEW EN C#

Esta es la forma de trabajar de un reporteador dinamico las caracteristicas principales son:

Primera version:

- Cuatro parametros de rango (valores que permiten determinar que registros necesito),utilizo
un textbox
- Un listView (cuadro de lista) para visualizar los datos
-CheckBox Cuadros que permiten seleccionar al usuario los tipos de datos (tengo un maximo de 15 posibles campos)
- Botones para (Exporta(En varios formatos), generar la consulta, limpar la pantalla y cancelar o salir)

Segunda version:
- Cuatro parametros de rango (valores que permiten determinar que registros necesito),utilizo
un textbox
- Un Treeview (cuadro de lista) para visualizar los datos
-CheckBox Cuadros que permiten seleccionar al usuario los tipos de datos (tengo un maximo de 15 posibles campos)
- Botones para (Exporta(En varios formatos), generar la consulta, limpar la pantalla y cancelar o salir)

si observan las versiones no varian mucho, solo se cambia el listview por treview, esto fue idea del lider de proyecto (Rodrigo) esto con el fin de hacer una herramienta Olap, en pocas palabras algo parecido a lo que hacen las consultas en access, si tienes alguna referencia esta aparece en la linea inferior con un signo de "+" para poder visualizar los datos de la tabla a la que se le hace referencia (Algo muy bueno por supuesto), por lo que me explico rodrigo, es una especie de cubo de informacion el cual llena el treeview para poder visualizar los datos en forma de arbol.

El codigo:

El codigo es algo complejo la verdad, todos los metodos dentro del codigo del formulario esta parametrisados,

el constructor:
la mayoria estamos acostumbrados a ver costructores de formularios sin parametrisar, y en algunos casos solo un constructor, el reporteador tiene tres constructores los cuales estan para metrisados de la siguiente manera

- Para soportar de una a tres tablas
- Parametros para las columnas y las medidas de las columnas (en caso del listview)
- Parametro donde se almacena los campos de la tabla, estos ya debidamente formateados a como se desa que aparesca en la propiedad text de los checkbox, ya que este parametro se ira directamente a una funcion la cual e llamado formatoCBX donde se formatearan todos los chekbox del formulario

Variables Globales:

Dentro de la clase del formulario he creado varias variables globales, esto con el fin de que sean vistas en todo el codigo del form, acontinuacion las presento:


string campos = ""; //Variable para los campos
string tablaPrincipal = ""; //Variable para la tabla principal
string tablaSecundaria = ""; //Variable para la tabla secundaria
string tablaTercera = ""; //Variable para una tercera tabla
string condicion = ""; //Variable parala condicion de la consulta
bool entroDos = false, entroTres = false, entroCuatro = false; //Varianble booleana para saber si entro a alguna caja de texto
AdMySQL miAdMySql = new AdMySQL(); //Instanciamos la clase de conexion
reportes Generador = new reportes();
String[] parametrosBD = { "bdeldisloque", "localhost", "ElDisloque", "sdel08disloke" }; //Parametros para loa base de datos
Validar miValidar = new Validar(); //Instancia la clase validar
General miGeneral = new General(); //Instancia la clase general
string primerValor = "", segundoValor = "", tercerValor = "";
string camposFiscales = ""; //Variable para la tabla de clientes en caso de tener datos fiscales
string[] columnasDefault ={ }; // Variable tipo array para las columnas
public string nombreArchivo = ""; //Determina el nombre que tendra el archivo exportado
int[] medidasDefault = { }; //Medidad de las columnas por default
DataSet Reporte; // dataset para exportar el reporte

Formato a los checkbox:

es muy complicado hacer una funcion donde utilizemos el gran famoso switch esto para generar en la propiedad text, por ello he realizado una esta funcion la cual recibe como parametro un control (form, grupbox, panel etc.) esto con el fin de hacer mas rapido el proceso una vez que mandamos el componente o control declaramos una variable de tipo checkbox, despues creamos un ciclo forech en el cual contaremos los checkbox que se encuentran en el componente, una vez que se tienen los controles, se procede a verificar que existan, si existen se asigna a la propiedad text el valor del campo, para ello he creado un DataSet en el cual se formatea a los campos y se verifia que exista la tabla.

Genera consulta:

como lo mensione anteriormente, el form tiene que soportar varias tablas, ya que este es totalmente dinamico, entonces como genero una consulta, acotinuacion se presenta la forma,
como ya tenemos el nombre de los campos en la propiedad text de los checkbox y el nombre de la tabla en la variable tabla principal solo concatenamos (unimos) para realizar la consulta Ejemplo:
if(checkBox.checked ==true) //Presunta si el checkbox esta seleccionado
{ cadena = tablaPricipal + "." + checkbox.text;}

donde cadena es una variable tipo string que nos permitira unir los campos que se desean visualizar

una vez que ya tenemos los campos y las tablas tendremos que revisar si existen alguna condicion, para ello tenemos la variable global condicion en la cual contenemos las condiciones o criterios con los qe se realizara la consulta, para llenar esta variable nos vamos a las propiedades de los componentes ejemplo textbox y en los eventos buscamos el evento leave y le damos doble click una vez dentro del codigo del evento leave escribimos el siguiente codigo:

condicion = condicion + Generador.where(textxbox.text);

Donde generador es nuestra clase que alimentara al reporte (Vea Clase generadora "abajo"), y where es un metodo publico de esta clase.

NOTA: si se tienen dos campos en un grupbox y se desea ahorrar trabajo para no hacerlo textbox por textbox entonces buscamos en los eventos el grupbox el evento leave y realizamosel mismo proceso anterior, ahoramos mucho trabajo y lineas de codigo,

Una vez que sea ha generado la consulta o guardado en una variable DataSet se procede visualizarla en la lista, para ello se he creado un metodo que agrega las filas del data set al listview para ello en la funcion cargarlista tengo dos parametros, uno para obtener el dataset o registros encontrados, y otro para saber la cantidad de columnas que contiene la lista, este ultimo con el fin de que el sistema no trueno o marque errores, para ello dentro del metodo, tengo un switch en el cual pregunto el numero de columnas y en base a ello agrego las filas a la cantidad de columnas o mejor dicho las opciones y subopciones necesarias en la lista, es decir si mi numero de columnas es tres solo insertare los registros en tres columas nada mas en caso de ser quince entonces agregare quince columnas del dataset

En caso del treeview existe algo parecido, con la diferencia que aqui solo concateno las columnas que y las mando en una sola cadena al componente, aun asi existe la funcion para determinar la cantidad de columnas que ha seleccionado el usuario, esto para saber cuatos valores hay que unir para que se visualizen

Clase Generadora:

Este formulario no se crea por arte de magia, para ello tenemos una clase en la cual se agregaran las funciones para consultar a la base de datos, los criterios o condiciones de la consulta, el formateo de los campos (como queremos que aparescan en los checkbox) y algunas otras funciones mas, es decir esta clase alimentara a todos los componentes del form, es algo complicado de explicar puesto que esta clase contendra informacion de toda las tabla que queremos anexar al reporte, una funciones con varios parametros para abrir la ventana de reportes, y nuestro gran exito, el codigo de exportacion a distintos formatos.

Conclusion:

Esta aplicacion es muy util en caso de generar reportes, es muy practica y aun estoy pensando en la forma de hacerla mas robusta, esto con el fin que soporte mas tablas, mas columnas y por que no que interactura dos o mas bases de datos al mismo tiempo, pero eso es mas adelante, por ahora en el grupo estamos contentos con el logro optenido por esta aplicacion y esperamos generar nueva soluciones, por funcionalidad se ha tomado la desicion de usar el reportador con treeview, siendo sincero a mi me gustaron los dos pero tambien con el treeview se pueden hacer maravillas, les recomiendo utilizarlo, ya que esta primera vez que lo utilize me agrado su funcionalidad

Nuevo reto:

- Aplicacion de pedidos para una empresa (algo compleja pero exelente)
-Erramienta Case ( para generar codigo mas rapido, en varios lenguajes, para varias bases de datos)


Nos vemos la proxima con otra anecdota de tecnologia, dudas busquenme en el msn champi_30@hotmail.com,
jhodrickgg@gmail.com

No hay comentarios: