[ Foro de C# ]

Duda de concepto en POO

07-Sep-2014 18:07
Jose Valdes Sirvent
3 Respuestas

Hola señores..
Como algunos sabréis, estoy realizando un proyecto pequeño de software de control de compras en una empresa..
Este software tiene que ser capaz de guardar información de facturas de compra en una base de datos, y, obviamente poder editar, consultar, y borrar cualquier dato de ésta..

Esa parte ya la tengo finalizada. Pero ahora me encuentro con la segunda fase del programa: la de las estadísticas.

El cliente quiere que el programa tenga una sección de estadísticas que me de información relacionada con los datos recogidos en la base de datos, como por ejemplo:
- Listado anual de numero de ventas, y beneficios de cada producto, cada mes.
- Precio medio de cada producto entre fechas elegidas.
- Precio medio de cada producto con cada proveedor..
- Etc.

No tengo ningún problema en realizar las select adecuadas para hacer las consultas a la Base de datos, pero me surge una duda de concepto en mi programa..

Puesto que el cliente quiere todos los datos en tablas.. y mi conocimiento sobre Winforms es escaso, supongo que la forma más adecuada es el DataGridView, que te dibuja la tabla tal cual te la devolvería la select..
Pero.. habría alguna alternativa mejor? Sobretodo teniendo en cuenta que a veces no quiero, precisamente, que la tabla se me muestre de esa forma que me devolvería la select, si no que la quiero de forma personalizada (Ej: una columna por cada mes, y un producto cada fila..)

Y segundo, pero no menos importante.. no tengo claro a priori cómo plantear el programa a nivel de objetos..

Mi programa tiene un montón de clases de tipo formulario, clases tipo "factura", "proveedor", "lineaDeFactura".. que algunas heredan unas de otras y tal, y una clase BaseDeDatos con funciones del tipo "GetProveedor(string cif), o GetProducto(string codigo)". Todos los formularios comparten la misma instancia de BaseDeDatos, y le piden datos a este, de forma que los formularios no tienen absolutamente nada de lógica de base de datos en ellos, más que "cuando el usuario pulse el botón "Mostrar factura", pidele la factura a la clase BaseDeDatos, y muestrala".
El caso es que en este apartado de estadísticas no tengo claro cómo hacerlo.

Opción 1:
1- crear varios métodos en la clase BDD que realicen TODO el trabajo, y devuelvan ya un objeto DataTable.
---contras:  El problema que me encuentro con esta solución (que a priori debería ser la buena, no?), es que los métodos se me pueden llegar a hacer realmente grandes.. además de ser métodos nada reutilizables (a pesar de que siempre se puede refactorizar algunas cosas en métodos más pequeños). Tendrían que tener la select (aunque alguna select se puede componer dinámicamente, o reutilizar), la búsqueda en sí, el while que recorre los datos.. la lógica de "dar el formato que yo quiero a la tabla.."
---pros:  Si obviamos el tema de que se va a caer en la repetición de código, y en los métodos largos.. Es muy cómodo usar un solo DataGridView, que llenas con el DataTable que recibas de cada método según el caso...

Opción 2:
Crearme una clase DataGridViewPersonalizado, y varias clases hijas que hereden de ella, con toda la lógica dentro de ellas mismas.. De forma que al crear una instancia de éstas, ya vengan "rellenas", porque ya ellas mismas traen toda la lógica.. Pero no me gusta que haya lógica de base de datos fuera de la clase base de datos.. me parece incorrecto.

Opción 3:
Una mezcla de las dos anteriores soluciones.. No se lo que puede salir de ahí.. Que cada clase tenga su propia "select" ya definida, y se la envie a la BDD, y la BDD devuelva los datos, y que la lógica del formateo de la tabla, esté de nuevo, en la clase DataGridPersonalizado..

En fin.. alguna sugerencia??

Muchísimas gracias como siempre por adelantado..! un saludo!!


08-Sep-2014 00:13
Luis Torres (+12)

Disculpa que me meta en el tema, pero ¿cuántas tablas te salieron en la parte de implementación de la base de datos?; de cada tabla, ¿cuántos campos?

Saludos.


09-Sep-2014 14:02
Nacho Cabanes (+31)

En cuanto a la primera pregunta, si quieres usar un DataGrid por simplicidad del código en C#, tu SELECT será el que deberá absorber los detalles que haya que ocultar al cliente. Recuerda que puedes usar "AS" para crear "alias" y que puedes hacer operaciones con varios campos, cosas como

 
SELECT precio * cantidad AS importeTotal FROM pedidos WHERE ...
 



En cuanto a la segunda pregunta... ¿seguro que quieres mostrar las estadísticas en un DataGrid, con su cuadrícula y su formato rígido? ¿No sería mejor crear un "informe", que te muestre los datos como si fuera una hoja de papel, y que se pueda imprimir con facilidad? Si quieres que algo quede colocado en columnas, lo puedes escribir con letra de paso fijo, pero el resto de la información podrá quedar de forma mucho más vistosa. Incluso podrías incluir gráficos como parte del informe...

Cuando encuentres una biblioteca de "reports" o de PDF que te guste, puedes crearte una clase "Estadistica" básica que ofrezca los servicios básicos (escribir texto, dibujar diagrama de barras, etc) y de la que hereden (o que usen) las demás estadísticas concretas, para rellenar con datos más específicos.



09-Sep-2014 14:09
Jose Valdes Sirvent

Sí Nacho. Lo de los alias ya lo tenía dominado (ya se encargó de ello el señor Garramone :P ), pero el cliente quiere tablas feas, así que él manda.. Yo ya tenía el programa hecho con gráficas dinámicas que cambiaban toda la información solo con pulsar un botón, y según los criterios de búsqueda marcados y todo.. Pero él dice que no, que quiere analizar los números..
Al final lo he hecho con ListView y la verdad es que no se ha quedado mal. No obstante, le he dejado las gráficas.. Ya te lo enseñaré si te veo por ahí algún día :P

Un saludo Nacho, y como siempre, muchísimas gracias!!

PD: Me ha encantado la idea de la clase Estadística, de hecho no lo tengo hecho así pero lo estudiaré!!!






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)