Maldivas

Como punto de partida os contare que actualmente mi equipo y yo, estamos desarrollando un sistema ERP para la empresa en la que trabajamos, lo hemos bautizado como “Maldivas”, voy a describiros algunos de los procesos más interesantes que estamos implementando. Tratare de explicar el funcionamiento de aquellas partes que os parezcan más interesantes.

La arquitectura del sistema está basada en n-capas, utilizando como base el patrón Entity Data Model, “muy similar al EDM que Microsoft acaba de presentar”, que pena que llevemos dos años de desarrollo y nos lo hayamos tenido que currar todo.

                La capa de presentación está basada principalmente en librerías de controles personalizadas que utilizan controles de terceros de la marca “devexpress”, para los interesados www.devexpress.com y por supuesto de algún control propio de .net, todos los formularios maestros heredan de un formulario base que realiza todas las llamadas de forma genérica a la capa de negocios.

La capa de negocios está basada en librerías de clases que principalmente interaccionan con la capa de datos y la de presentación, además de  incorporar las reglas de negocio. Estas capas las hemos diseñado utilizando generics, por anticiparos algo realizamos llamadas de este tipo.

Manager<Clientes> manager = new Manager<Clientes>();

manager.GetAll();  me devolvería una colección de entidades de tipo cliente.

manager.Get(‘000001′) me devolvería una entidad de tipo cliente

manager.Get(Filters) me devolvería una colección de clientes filtrados por una o varias condiciones.

manager.Data.Nombre = “prueba”;  Guardaria en la entidad el nombre de un cliente

manager.SaveChanges();  Salvaria los cambios en la base de datos.

Estas funciones generan en tiempo de ejecución sentencias sql de tipo:

SELECT [Nombre],[Apellidos]… FROM dbo.Interlocutores WHERE Tipo = ‘1′ // Clientes

o

UPDATE dbo.Interlocutores SET [Nombre] = “prueba” WHERE [Codigo]= ‘000001′ AND [Nombre]  = @valorAnterior

En algunos casos podemos optimizarlas generando directamente los procedimientos almacenados para realizar la operación y cacheamos muchos de los datos que reutilizamos.

De esta forma minimizamos el código utilizado para trabajar con múltiples entidades, dedicare un post entero a mostraros esta arquitectura, ahora mismo estoy migrando parte para adaptar el EDM de Microsoft.

Posteriormente añadiremos otra capa basada en ws, para aprovechar reglas de negocios y funciones de la capa de acceso a datos que serán utilizadas en el sistema de comercio electrónico y los dispositivos móviles.

                Como la aplicación no va orientada al público en general, es muy específica para el sector en el que trabajamos, decidimos centrarnos únicamente en Sql Server y aprovechar al máximo su potencial, utilizamos procedimientos almacenados de forma masiva y muchas de las características propias sql como particionamiento de tablas, funciones, triggers, sinónimos y otros aspectos propios de la base de datos, creando una dependencia total con el Software de Base de datos.

Sé que hoy en día y con las arquitecturas existentes, así como las maneras diferentes que existen de abordar un problema, muchos no estarán de acuerdo con esta arquitectura, alguna persona me ha preguntado, ¿Como no lo hicisteis todo en aspx utilizando ws ? o ¿ Como no utilizáis Entreprise Library para crear un acceso más independiente de la base de datos ?  o ¿ Por qué no habéis desarrollado toda la parte de la capa cliente en WPF en lugar de Windows Forms ? , etc.

Tratare de explicar porque hemos tomado estas decisiones, además de los errores y aciertos que hemos cometido a lo largo del proceso de desarrollo, aspectos relacionados con el trabajo en equipo, diseño, adopción de herramientas, y otros que os darán una perspectiva amplia de los proyectos con los que trabajamos. Dedicare también algún post a hablar de las herramientas que utilizamos en el desarrollo (TFS, Team Suit, Team for Database Professional, CodeRush, Refactor, Resharper, Pruebas Unitarias, fxCop, Herramientas de generación de código propias utilizando Codedoom, etc),  y un poco sobre algún aspecto de la metodología de trabajo utilizada en este proyecto “Scrum”.

Me gustaría mucho oír vuestras opiniones y críticas al respecto.

Siempre me ha gustado “fisgar” las aplicaciones de los demás, de ellas he sacado la mayoría de las funcionalidades que implemento en los programas que desarrollo. Como una imagen vale más que mil palabras os dejo algunos formularios del programa que iré desgranando en los sucesivos post, espero que os gusten.

 

 

 

 

 

10 comentarios en “Maldivas”

  1. Colega que excelente aporte el tuyo…
    Pues mira que yo también estoy en medio de un desarrollo de un ERP, pero tipo freelance, estoy yo solo y he decidido trabajar n-capas, vs2005, y mysql5, y también me decidí por winforms, por varias razones, como por ejemplo el diseño de la interfaz de usuario es mas lento que el de winforms, muchas veces algo simple en winforms puede ser muy aparatoso en aspnet… El proyecto no esta tan bien estructurado en cuanto a análisis y diseño de tiempos y recursos, mas bien cada cosa que me pide el usuario la voy realizando… Yo se que esta mal hecho pero un desarollo “uno solo” es muy complicado hacer todo…

    Esperamos mas detalle del proceso de tu proyecto… y hablanos un poco de como te ha ido con esos controles de terceros… por que tienen buena pinta…
    Sabes que me parece interesante el manejo de la seguridad, es muy detallado y por medio del treeview se le facilitan mucho las cosas al admin, pero hacerlo es un poco maluco, yo lo hago igual al tuyo manejo una tabla de permisos que tienen su nodo padre y su identificador nodo, y hay una tabla que se relaciona con los permisos y con los usuarios y esta tabla tiene permisosXusuario…

    Un saludo…

  2. Juan, felicidades por tu entrada. La interfaz me ha encantado, y tus explicaciones generales son muy claras.

    Seguro que nos vendrá muy bien a todos dar un repaso teórico-práctico y debatir a través de nuestras impertinentes preguntas o comentarios.

    Ya que nadie ha preguntado nada, aquí va el primer comentario o pregunta (sencilla) al respecto. Sé que un proyecto está repleto de toma de decisiones, así que te pregunto acerca de alguna.:

    Dices lo siguiente: “La capa de presentación está basada principalmente en librerías de controles personalizadas que utilizan controles de terceros de la marca “devexpress”, …”.

    Luego comentas también: “…todos los formularios maestros heredan de un formulario base que realiza todas las llamadas de forma genérica a la capa de negocios.”

    Mis preguntas son las siguientes:

    Cuando dices que la capa de presentación se basa en librerías de controles personalizadas, ¿te refieres a que utilizais “a saco” los controles devexpress o a que creais vuestros propios controles heredando de los controles de devexpress?. ¿Habéis utilizado controles estándar Windows o solo los de devexpress y los que vosotros os hayais creado?. ¿Porqué os decantásteis por los controles de devexpress principalmente?.

    ¿Habéis tenido algún problema con los controles en la herencia del formulario base del cuál heredan los formularios maestros?. ¿Existen controles estándar dentro del formulario base?.

    Espero que se me entienda.

    Felicidades por tu exposición. Espero ansiosamente las siguientes. :-))))

  3. Colega un excelente aporte….
    Pues mira que yo también estoy en medio del desarrollo de un ERP diciendo también por winforms, ya que me parece que el manejo de la interfaz en aspnet es mas trabajoso por mas ajax q exista…
    Mi proyecto esta bajo vs2005, con mysql y n-capas…
    Lo que mas me ha aburrido ha sido el manejo de la seguridad, el cual creo que manejamos de manera similar por medio de treeview y tres tablas, una permisos que indica el nodopadre de cada uno y el identificador nodo de cada uno, una tabla usuarios y una tabla permisosXusuario…
    Lo otro que también me ha aburrido ha sido el manejo por la filosofía capas de los reportes… Ya que por cada reporte debo hacer un report document y con un solo reportviewer puedo visualizar el resto pero manejar por capas estos documentos ha sido lo menos intuitivo que haya visto, quisiera conocer tu metedología en cuanto ha seguridad y en cuando a reportes…
    Un saludo y esperamos mas detalles de tu proyecto y tips que no falten ;)…

  4. Gracias a todos por vuestro comentarios.
    Jorge, Por adelantarte algo la mayoría de los controles que utilizamos son de devexpress, pero encapsulados en XtraUsersControls que es similar al UserControl de windows con la particularidad de que soportan skins y otras funcionalidades del framework de devexpress.

    Debido a que algunos no soportan muy bien la herencia visual y otros introducen gran cantidad de código en el Initialize Component, y que tienen varias funciones y propiedades que hemos implementado aumentando en algunos casos la funcionalidad de algunos, optamos por encapsularlos.

    Desde luego hemos tenido muchos problemas ya que son poco intuitivos, a veces utilizamos controles estándar como el treeview debido al que el XtraTreeView de devexpress es bastante diferente, pero la mayor parte son de devexpress. Te puedo decir que disponen de una librería amplísima, de hecho no utilizamos ni la cuarta parte de los controles que dispone.

    La elección de los controles vino fundamentalmente por la necesidad de incorporar un Gestor de Informes, no quería utilizar Cristal Reports. El generador de informes de Xtra es uno de los mejores que he visto, está en c# con lo que el código de cada informe es c# que puedes manipular de forma similar a como lo haces en un formulario windows y el Grid es magnífico para mí el mejor con diferencia de todos los que conozco, los demás vinieron poco a poco, pero si aprendes a utilizarlos son muy buenos.

    Creo que el tema de los controles merece él solito un Post aparte, tratare de darte más información ahí.

    sac087, efectivamente la seguridad la resolvemos a través de un treeView, con la particularidad de que es interactivo, es decir podemos añadir, borrar, mover, copiar nodos y realizar otras operaciones en tiempo de ejecución, hemos implementado soporte de grupos de usuarios y lo hemos reducido a una sola tabla, eso si es necesario implementar algunas procedimientos recursivos en Sql Server, pero ha resultado interesante.

    Nuestro sistema de reports está aislado en un proyecto independiente, con su propia capa de negocios y datos, soportamos XtraReports y Reporting Services, y es bastante compleja ya que guardamos los informes serializados en la base de datos, soportamos herencia visual, traducción en varios idiomas en tiempo de ejecución, gestión de informes anidados, etc.

    La aplicación lo hace todo de forma automática crea informe, copia, edita de forma visual, una vez implementada no tenemos más que manejarla como si de un usuario mas se tratase, la única parte complicada es conformar las fuentes de datos a través de de consultas sql, que internamente se transforman en dataset y que son utilizados por el generador de devexpress o reporting services para generar los informes. Lo tratare mas en detalle a lo largo de los Post.

  5. Juan. Muchísimas gracias. Muy claro todo.

    Estaré atento a las próximas entradas.

    Creo que es interesantísimo abordar entradas de este tipo, teórico-prácticas que darán mucho que hablar, porque como muy bien sabes, no existe una única forma de hacer las cosas, así que… ¡a disfrutar de tus entradas y de los comentarios que surjan!. 🙂

  6. En mi casa, y utilizando parte del poco tiempo de ocio que tengo, estoy “escribiendo” y definiendo la arquitectura (la que será base del desarrollo) de un programa de gestion ERP que iré enriqueciendo poco a poco (hasta que tenga algo presentable). En ella intentaré utilizar todos los conociemientos de programación que tengo bajo las premisas de “hacerlo todo bien desde el principio”, “intentando hacer los componentes genéricos pensando mucho ahora para tener que escibir poco luego” y “hacerlo luego las pantallas lo más en producción en cadena posible (automatizando)”. Seguiré con mucha atención tus post.
    De momento creo que esto a lo mejor te será útil.

    http://blogs.sqlxml.org/vinodkumar/archive/2008/10/29/patterns-amp-practices-app-arch-guide-2-0-beta-1.aspx

    Un saludo y mucha suerte.

  7. Excelente post, sobretodo me pare interesante la metodologia usada.
    Adicionalmente me parecen muy bien definidas e intuitivas las interfaces de usuario.
    Te felicito por la entrada.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *