none
Forma Optima Obtener Cabecera y Detalle de Pedido por ID_Pedido en NCAPAS RRS feed

  • 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



    martes, 14 de abril de 2020 7:05

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.

    martes, 14 de abril de 2020 13:08
    Moderador