Usuario
Forma Optima Obtener Cabecera y Detalle de Pedido por ID_Pedido en NCAPAS

Pregunta
-
Buenas noches, estoy desarrollando una aplicación winform en VB.NET Y MYSQL de gestión pedidos en una arquitectura NCAPAS y mi duda son las siguientes:
Tengo las siguientes entidades de negocio:
Public Class PedidoEntity Public Property IdPedido As Long Public Property Usuario As UsuarioEntity Public Property Cliente As ClienteEntity Public Property Local As LocalEntity Public Property Modalidad As ModalidadPedidoEntity Public Property Moneda As MonedaEntity Public Property Fecha As Date Public Property PorcentajeDescuento As Double Public Property TotalDescuento As Double Public Property PorcentajeIGV As Double Public Property ImporteIGV As Double Public Property SubTotal As Double Public Property Total As Double Public Property MontoCobrado As Double Public Property SaldoPedido As Double Public Property Estado As String 'FACTURADO, ELIMINADO Public Property Observacion As String Public Property DetallePedido As List(Of DetallePedidoEntity) '===========Propiedades de solo lectura========================= Public ReadOnly Property RazonSocial As String Get Return Cliente.RazonSocial End Get End Property '=============================================================== End Class
Public Class DetallePedidoEntity Public Property Pedido As PedidoEntity Public Property Producto As ProductoEntity Public Property Impuesto As ImpuestoEntity Public Property PorcentajeDescuento As Double Public Property TotalDescuento As Double Public Property PrecioUnitario As Double Public Property Cantidad As Double Public Property Total As Double Public ReadOnly Property IdProducto As Integer Get Return Producto.IdProducto End Get End Property Public ReadOnly Property CodigoBarra As String Get Return Producto.CodigoBarra End Get End Property Public ReadOnly Property Descripcion As String Get Return Producto.Descripcion End Get End Property End Class
Mis dudas son las siguiente:
1)La entidad DetallePedido la relaciono con la entidad de negocio Pedido, esta bien eso?? he visto algunos ejemplos en la web que para estos casos de Cabecera-Detalle en el detalle solo se relaciona con el ID_PEDIDO. Pero yo por un tema de relación entre clases, relaciono el Pedido en la clase DetallePedido. Esta bien esto? las dos formas son validas?.
2)Hay casos en donde se necesita obtener el pedido y sus respectivos detalles,ya que a veces un pedido se necesita modificar.
Como la entidad de negocio Pedido, tiene un list de detalle de pedido, solo he creado un método en la clase PedidoDAL para obtener el pedido y sus detalles que lo asocio al list. Tal como el siguiente extracto de código?
Public Shared Function GetById(IdPedido As Long) As PedidoEntity Dim pedido As PedidoEntity Dim DetallePedido As New List(Of DetallePedidoEntity) Dim cnx As New MySqlConnection(ConfigurationManager.ConnectionStrings("default").ToString()) Dim cmd As New MySqlCommand("proc_obtener_pedido_por_id", cnx) cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.AddWithValue("@p_id_pedido", IdPedido) pedido = Nothing '==================Obtenemos los datos de cabecera del pedido================================== cnx.Open() Dim reader As MySqlDataReader = cmd.ExecuteReader() If reader.Read() Then Dim cliente As New ClienteEntity With { .IdCliente = Convert.ToInt32(reader("id_cliente")) } Dim local As New LocalEntity local.IdLocal = Convert.ToInt16(reader("id_local")) Dim usuario As New UsuarioEntity With { .IdUsuario = Convert.ToInt32(reader("id_usuario")) } Dim modalidad As New ModalidadPedidoEntity With { .IdModalidad = Convert.ToInt16(reader("id_modalidad")) } Dim moneda As New MonedaEntity With { .IdMoneda = Convert.ToInt16(reader("id_moneda")) } pedido = New PedidoEntity With { .IdPedido = Convert.ToInt64(reader("id_pedido")), .Cliente = cliente, .Local = local, .Usuario = usuario, .Modalidad = modalidad, .Moneda = moneda, .Fecha = reader("fecha"), .PorcentajeDescuento = Convert.ToDouble(reader("porcentaje_descuento")), .TotalDescuento = Convert.ToDouble(reader("total_descuento")), .PorcentajeIGV = Convert.ToDouble(reader("porcentaje_igv")), .ImporteIGV = Convert.ToDouble(reader("importe_igv")), .SubTotal = Convert.ToDouble(reader("subtotal")), .Total = Convert.ToDouble(reader("total")), .MontoCobrado = Convert.ToDouble(reader("monto_cobrado")), .SaldoPedido = Convert.ToDouble(reader("saldo_pedido")), .Estado = Convert.ToString(reader("estado")), .Observacion = Convert.ToString(reader("observacion")) } End If '========================================================================================================== cnx.Close() cnx.Open() '==================================Obtenemos el detalle del pedido========================================== cmd.Parameters.Clear() cmd.CommandText = "proc_obtener_detalle_pedido_por_id" cmd.Parameters.AddWithValue("@p_id_pedido", IdPedido) 'Dim readerDe As MySqlDataReader reader = cmd.ExecuteReader() While reader.Read() Dim producto As New ProductoEntity With { .IdProducto = Convert.ToInt32(reader("id_producto")), .CodigoBarra = Convert.ToString(reader("codigo_barra")), .Descripcion = Convert.ToString(reader("descripcion")) } Dim detalle As New DetallePedidoEntity With { .Producto = producto, .PrecioUnitario = Convert.ToDouble(reader("precio_unitario")), .Cantidad = Convert.ToDouble(reader("cantidad")), .Total = Convert.ToDouble(reader("total")) } DetallePedido.Add(detalle) End While cnx.Close() '============================================================================================================== 'Asigno la lista de detalle de pedido ala propiedad del objeto pedido pedido.DetallePedido = DetallePedido Return pedido End Function
Esta manera de obtener un pedido con sus detalles es la correcta??, es decir en un solo método de PedidoDAL puedo obtener tanto datos del pedido y ya que este tiene una propiedad que contiene el detalle puedo obtenerlo en el mismo metodo y uego obviamente llamoa este metodo en la capade logica de negocio? Es correcta esta forma, ya que también hubiese podido crear un método que me obtenga los detalles en la clase DetallePedidoDAL y llamarla por separado.
Un caso parecido sucede en la entidad Producto, esta tiene una propiedad List de ListaPrecios que hace referencia a una entidad que se llama ListaPreciosEntity, es decir un producto tiene un listado de precios, y cuando deseo obtener el producto y sus listas de precios aplico la misma lógica que para cabecera y detalle. Sin embargo mi duda va por el lado de concepto de POO. Ya que una factura o Pedido esta compuesto por un detalle, sin el detalle la factura no existiria
En cambio en el caso de producto, un producto puede tener lista de precio, pero si no tiene lista de precios, el producto sigue existiendo como tal. Es ahi mi duda como plasmar en vb.net esos conceptos para obtener las entidades y su respectivo List
- Editado Ernesto Guerra Fuentes martes, 14 de abril de 2020 7:32
Todas las respuestas
-
Hola
Gracias por levantar tu consulta en los foros de MSDN. Estamos analizando su pregunta y vamos a darle seguimiento para buscar la mejor repuesta pertinente al caso.
Gracias por usar los foros de MSDN.
Oscar Navarro____
Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.
Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.
Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.