Foros del Web » Programación para mayores de 30 ;) » .NET »

[Aporte] Sistema de Ventas en C# y SQL Server

Estas en el tema de [Aporte] Sistema de Ventas en C# y SQL Server en el foro de .NET en Foros del Web. Que tal, colegas. Quería contarles acerca de un proyecto en el que estuve trabajando estos últimos días. Se trata de un Sistema de Ventas desarrollado ...
  #1 (permalink)  
Antiguo 18/06/2015, 13:45
 
Fecha de Ingreso: marzo-2015
Ubicación: Buenos Aires
Mensajes: 3
Antigüedad: 9 años
Puntos: 0
Exclamación [Aporte] Sistema de Ventas en C# y SQL Server

Que tal, colegas. Quería contarles acerca de un proyecto en el que estuve trabajando estos últimos días. Se trata de un Sistema de Ventas desarrollado en C#.NET y SQL Server para gestionar la actividad de un negocio, generar reportes y controlar distintas áreas.

Se me ocurrió la idea de crear un videotutorial en YouTube contando cómo lo hice paso a paso, ya que no ví mucho de esto, y todo lo que hay está a la venta. Cualquier consulta o duda me la pueden transmitir!

Ah, el sistema terminado está online para descargar de forma libre y gratuita junto con el código fuente para que lo puedan chequear y crear uno acorde a sus propias necesidades.


Gráficas de los Reportes


Alta de Registros

Repositorio para descargar en GitHub:
https://github.com/hernandemczuk

Si no quieren GitHub, en mi blog tengo los archivos disponibles también:
http://hernanmartin.me/proyecto-sistema-de-gestion-para-una-empresa/

Aquí tienen los videos de cómo lo hice:
https://www.youtube.com/playlist?list=PL0ENtl4yA9gON4hQKIfLOhdEphoHncLOX

Saludos a todos y espero su feedback!

Última edición por hernandemczuk; 18/06/2015 a las 13:46 Razón: Desalineado
  #2 (permalink)  
Antiguo 18/06/2015, 14:45
 
Fecha de Ingreso: agosto-2010
Mensajes: 126
Antigüedad: 13 años, 8 meses
Puntos: 9
Respuesta: [Aporte] Sistema de Ventas en C# y SQL Server

Ante nada, felicidades, muy pocos comparten su código, aún no lo probé el sistema, pero debe de funcionar...
Estoy viendo tu código de la clase DEmpleados, DCategorias y DProductos (los demás no los vi aún) pero debo hacerte algunas observaciones, en estas clases tienes métodos como Insertar, Eliminar, Editar, Mostrar y Buscar, a única diferencia entre tus métodos son los procedimientos almacenados por que accedes a través de ellos a las diferentes tablas.

Entoces, te recomiendo para una próxima versión de tu sistema, puedas crearte una clase genérica que te permita Insertar, Eliminar, Editar, Mostrar y Buscar. Cuando necesites Insertar un empleado, categoría o producto..utilizas el método Insertar de tu clase genérica. Así no vas a repetir tu código.

Es recomendable que las validaciones las hagas en el procedimiento almacenado por ejemplo: Respuesta = "Ya existe un producto con ese Nombre"; este mensaje debería venir de la BD. Supongamos que ya lo tienes instalado tu sistema, y al cliente no le gusta ese mensaje, lo que vas hacer es ir al código modificar el mensaje, volver a compilar y instalar (tardas mucho tiempo), si la BD te manda ese mensaje pues es solo vas al procedimiento almacenado cambias el mensaje y ejecutas nuevamente y listo..

Bueno, saludos
Espero que no lo tomes a mal mis observaciones.
  #3 (permalink)  
Antiguo 19/06/2015, 00:37
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: [Aporte] Sistema de Ventas en C# y SQL Server

Un aporte interesante, aunque me gustaría comentar varios puntos...

Capa de datos:
- En Dconexion tienes la cadena de connexión hard-coded. Lo más correcto sería obtenerla del app.config. Además te recuerdo que los usuarios que aparezcan en la cadena de conexión han de tener la menor cantidad de privilegios posibles y, opcionalmente, puedes encriptar la cadena de conexión.
- Tendrías que separar las entidades en POCO's e implementar el acceso a BBDD mediante repositorios. Mi recomendación además sería que usaras toda la potencia que te pueden dar los ORM como NHibernate o Entity Framework. Por otro lado, veo que no estás haciendo el Dispose de las connexiones ni de los commands (SqlConnection y SqlCommand).
- Otro tema aparte es que tendrías que evitar tener lógica de aplicación/negocio en la BBDD. Tendrías que mirar de pasar, en la medida de lo posible, los storeds a métodos de tu aplicación.

Capa de Negocio:
- Tienes un error bastante importante y es que en la capa de datos en caso de excepción la lanzas hacia la capa de arriba, pero en la capa superior (la de Negocio) no las estás tratando.
- Los métodos insertar tienen una gran cantidad de parámetros con los que luego montas la entidad. Sería bastante más limpio recibir la entidad (de ahí la importancia de usar POCOs para usarlos como DTO's entre capas de la aplicación).
- En cambio con el eliminar el método obtiene un Id pero luego montas una entidad "dummy" para pasarla a la capa de datos y de ahí solo volver a obtener el Id. No sería mejor pasar directamente el Id?

Capa de Presentación:
- No la he podido revisar a fondo

Notas generales:
- No veo ningún summary ni ningún tipo de documentación del código
- No hay tests de ningún tipo.
- Tendrías que usar tu propia implementación de la Excepción (extender la clase base)
- Personalmente, por trazabilidad, guardaría un registro de los errores en un log.
- No usas interfaces por ningún lado y tampoco contenedores de inyección de dependencias. Usando ambas cosas podrías hacer la aplicación más extensible y poder cambiar modulos "en caliente", etc.

Como me parece un "ejercicio educativo" interesante y dará bastante valor añadido al hilo, voy a mirar de crear una versión "mejorada" (según mi punto de vista, claro) y la subiré aquí mismo (bueno, el enlace al github).
__________________
Aviso: No se resuelven dudas por MP!
  #4 (permalink)  
Antiguo 23/06/2015, 20:57
 
Fecha de Ingreso: marzo-2015
Ubicación: Buenos Aires
Mensajes: 3
Antigüedad: 9 años
Puntos: 0
Respuesta: [Aporte] Sistema de Ventas en C# y SQL Server

Gracias por las observaciones. Les cuento que trabajo principalmente (por no decir solamente) como admin de bases de datos y recién ahora estoy volviendo a tocar la parte de desarrollo que hace mucho tiempo no veía y había dejado atrás.

Voy a tratar de implementar cada uno de los puntos que recomendaron, si bien muchos tendré que investigar al respecto.

Gracias y saludos!

Última edición por hernandemczuk; 23/06/2015 a las 21:06
  #5 (permalink)  
Antiguo 23/06/2015, 21:24
 
Fecha de Ingreso: marzo-2015
Ubicación: Buenos Aires
Mensajes: 3
Antigüedad: 9 años
Puntos: 0
Respuesta: [Aporte] Sistema de Ventas en C# y SQL Server

Cita:
Iniciado por uagrm Ver Mensaje
Ante nada, felicidades, muy pocos comparten su código, aún no lo probé el sistema, pero debe de funcionar...
Estoy viendo tu código de la clase DEmpleados, DCategorias y DProductos (los demás no los vi aún) pero debo hacerte algunas observaciones, en estas clases tienes métodos como Insertar, Eliminar, Editar, Mostrar y Buscar, a única diferencia entre tus métodos son los procedimientos almacenados por que accedes a través de ellos a las diferentes tablas.

Entoces, te recomiendo para una próxima versión de tu sistema, puedas crearte una clase genérica que te permita Insertar, Eliminar, Editar, Mostrar y Buscar. Cuando necesites Insertar un empleado, categoría o producto..utilizas el método Insertar de tu clase genérica. Así no vas a repetir tu código.

Es recomendable que las validaciones las hagas en el procedimiento almacenado por ejemplo: Respuesta = "Ya existe un producto con ese Nombre"; este mensaje debería venir de la BD. Supongamos que ya lo tienes instalado tu sistema, y al cliente no le gusta ese mensaje, lo que vas hacer es ir al código modificar el mensaje, volver a compilar y instalar (tardas mucho tiempo), si la BD te manda ese mensaje pues es solo vas al procedimiento almacenado cambias el mensaje y ejecutas nuevamente y listo..

Bueno, saludos
Espero que no lo tomes a mal mis observaciones.
Que tal, gracias por el feedback. Al contrario, estas observaciones estaba buscando!. Esa validación está también en la base de datos mediante constraints, sucede que para no tener que esperar una respuesta de la bd, cree otra validación en la capa presentación para que responda más rápido hacia el usuario.

Encontré varios comentarios acerca de la validaciones y muchos concuerdan en utilizar esta "doble verificación".

En cuanto a la clase genérica, me interesa mucho la idea, aunque me resulta un poco confuso como implementarlo. Investigaré más al respecto.

Gracias nuevamente
  #6 (permalink)  
Antiguo 07/08/2015, 14:17
 
Fecha de Ingreso: agosto-2010
Mensajes: 126
Antigüedad: 13 años, 8 meses
Puntos: 9
Respuesta: [Aporte] Sistema de Ventas en C# y SQL Server

La idea es tener métodos (insertar, actualizar, buscar..etc) que luego podas reutilizar en las clases que sea necesaria.

class ADO
Código PHP:
Ver original
  1. /*Este método permite registrar, funciona para todos los Insert*/
  2.         public int Create(string stored, ArrayList sqlParametros)
  3.         {
  4.             SqlCommand commmand = new SqlCommand();
  5.             SqlTransaction transaccion;
  6.             Conectar();
  7.             transaccion = conexion.BeginTransaction();
  8.             commmand.Connection = conexion;
  9.             commmand.Transaction = transaccion;
  10.             commmand.CommandType = CommandType.StoredProcedure;
  11.             commmand.CommandText = stored;
  12.             SqlCommandBuilder.DeriveParameters(commmand);
  13.             for (int i = 1; i <= commmand.Parameters.Count - 1; i++)
  14.             {
  15.                 commmand.Parameters[i].Value = sqlParametros[i - 1];
  16.             }
  17.  
  18.             string filasaceptadas = commmand.ExecuteScalar().ToString();
  19.  
  20.             if (Convert.ToInt32(filasaceptadas) != 0)
  21.             {
  22.                 transaccion.Commit();
  23.             }
  24.             else
  25.             {
  26.                 transaccion.Rollback();
  27.             }
  28.  
  29.             Desconcestar();
  30.             return Convert.ToInt32(filasaceptadas);
  31.         }


Código PHP:
Ver original
  1. /*Insertar de tu class DCategorias*/
  2.         public static int Insertar(String parNombre_Categoria, String parDescripcion)
  3.         {
  4.             int resultado = 0;
  5.             ArrayList array = new ArrayList();
  6.             array.Add(parNombre_Categoria);
  7.             array.Add(String parDescripcion);
  8.             resultado = ado.Create("Produccion.InsertarCategoria", array);
  9.  
  10.             return resultado;
  11.         }

Código PHP:
Ver original
  1. /*Insertar de tu class NEmpleados*/
  2.         public static int Insertar(String parNombre_Empleado, String parApellido_Empleado,
  3.             String parDireccion, String parCiudad, String parRegion, String parPais, String parTelefono)
  4.         {
  5.             int resultado = 0;
  6.             ArrayList array = new ArrayList();
  7.             array.Add(parNombre_Empleado);
  8.             array.Add(parApellido_Empleado);
  9.             array.Add(parDireccion);
  10.             array.Add(parCiudad);
  11.             array.Add(parRegion);
  12.             array.Add(parPais);
  13.             array.Add(parTelefono);
  14.             resultado = ado.Create("RecursosHumanos.InsertarEmpleado", array);
  15.  
  16.             return resultado;
  17.         }

Etiquetas: c#, csharp, sistema
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 2 personas




La zona horaria es GMT -6. Ahora son las 00:15.