none
Hacer una clase RRS feed

  • Pregunta

  • Quiero crear una clase  póliza que tenga una estructura maestro detalle como sigue

    Maestro:    Campo                 ejemplo

                      Folio                    00001

                      Tipo                        dia

                      Concepto              Venta 

                      Fecha                  25/11/2020

                       

                  Detalle

              Folio     Tipo          Cuenta             Nombre_cuenta    Debe   Haber

             0001       dia           102                  Bancos                116         0

             0002       dia            201                  IVA Cobrado                     16

             0003       dia            401                  Ventas                            100  

    En el caso del detalle estoy manejando 3 registros, pero pueden ser 10. No se si exista una estructura que pueda declarar en una clase para poder asignar los valores del detalle en ella, como tipo factura.

    martes, 17 de noviembre de 2020 20:54

Respuestas

  • Bien, pues entonces si quieres que la clase Poliza contenga una lista de movimientos, basta con que añadas una nueva propiedad dentro de Poliza como te indico a continuación. La clase movimiento está bien como está, no hace falta que cambies nada:

    Public Class Poliza
         Public folio As String
         Public tipo As String
         Public fecha As Date
         Public concepto As String
    
         Public Property Movimientos As List(Of Movimiento)
    
         Sub New(folio As String, tipo As String, fecha As Date, concepto As String, movimientos As List(Of Movimiento)
             Me.folio = folio
             Me.tipo = tipo
             Me.fecha = fecha
             Me.concepto = concepto
             Me.Movimientos = movimientos
         End Sub
    End Class
    

    Algunas observaciones:

    • Te he declarado la lista de movimientos como un List, pero también podría ser otro tipo de colección tal como un array. o incluso un IEnumerable si lo vas a inicializar externamente.
    • Te he puesto los movimientos en el constructor, pero esto no es obligatorio. Si no los vas a inicializar en el momento de construir la clase, sino que quieres pasarlos más tarde, también es perfectamente válido.
    • Estás declarando campos públicos. Las "buenas prácticas" de programación recomiendan que lo que sea público no sea un campo sino una propiedad. No es que no funcione con campos, es simplemente una cuestión de mantenibilidad y normas de estilo.

    • Marcado como respuesta hector barajas martes, 24 de noviembre de 2020 22:01
    martes, 24 de noviembre de 2020 18:53

Todas las respuestas

  • Para esto se suelen usar dos clases. Si no deseas tenerlas por separado, puedes anidar una dentro de la otra (o por lo menos, se pueden anidar en las versiones moernas de C#, no sé si en versiones recientes de VB han añadido esta opción al igual que se hizo en C# -- si no fuera así, entonces tendrás que declarar las dos clases por separado, sin anidarlas).

    La clase Factura contendría los datos principales así como una colección de la clase que sirve para contener una línea de detalle, por ejemplo, List(Of Detalle).


    miércoles, 18 de noviembre de 2020 7:21
  • Hola

    Alguna actualización sobre tu consulta?

    Saludos

    --------------------------------------------------------------------------------

    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.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN sientase en la libertad de contactar  MSDNFSF@microsoft.com. 

     

    miércoles, 18 de noviembre de 2020 17:08
    Moderador
  • Podrías darme un ejemplo para entenderte mejor
    lunes, 23 de noviembre de 2020 23:50
  • Podrías darme un ejemplo para entenderte mejor

    Te doy la vuelta al asunto: Pon tú el ejemplo de cómo tienes las clases Factura y Detalle, y a partir de ahí las reorganizamos para que queden debidamente conectadas.

    martes, 24 de noviembre de 2020 12:43
  • Esta seria la clase poliza

    Public Class Poliza

        Public folio As String
        Public tipo As String
        Public fecha As Date
        Public concepto As String

        Sub New(folio As String, tipo As String, fecha As Date, concepto As String)
            Me.folio = folio
            Me.tipo = tipo
            Me.fecha = fecha
            Me.concepto = concepto

        End Sub

    End Class

    Esta seria la clase movimiento

    Public Class movimiento
        Private folio As String
        Private tipo As String
        Private cuenta As String
        Private subcuenta As String
        Private auxiliar As String
        Private nombre As String
        Private debe As Double
        Private haber As Double
        'Crea una nueva clase movimiento asignando valores
        Sub New(folio As String, tipo As String, cuenta As String, subcuenta As String, auxiliar As String, nombre As String, debe As Double, haber As Double)
            Me.folio = folio
            Me.tipo = tipo
            Me.cuenta = cuenta
            Me.subcuenta = subcuenta
            Me.auxiliar = auxiliar
            Me.nombre = nombre
            Me.debe = debe
            Me.haber = haber

        End Sub

     

    End Class

    martes, 24 de noviembre de 2020 18:23
  • Bien, pues entonces si quieres que la clase Poliza contenga una lista de movimientos, basta con que añadas una nueva propiedad dentro de Poliza como te indico a continuación. La clase movimiento está bien como está, no hace falta que cambies nada:

    Public Class Poliza
         Public folio As String
         Public tipo As String
         Public fecha As Date
         Public concepto As String
    
         Public Property Movimientos As List(Of Movimiento)
    
         Sub New(folio As String, tipo As String, fecha As Date, concepto As String, movimientos As List(Of Movimiento)
             Me.folio = folio
             Me.tipo = tipo
             Me.fecha = fecha
             Me.concepto = concepto
             Me.Movimientos = movimientos
         End Sub
    End Class
    

    Algunas observaciones:

    • Te he declarado la lista de movimientos como un List, pero también podría ser otro tipo de colección tal como un array. o incluso un IEnumerable si lo vas a inicializar externamente.
    • Te he puesto los movimientos en el constructor, pero esto no es obligatorio. Si no los vas a inicializar en el momento de construir la clase, sino que quieres pasarlos más tarde, también es perfectamente válido.
    • Estás declarando campos públicos. Las "buenas prácticas" de programación recomiendan que lo que sea público no sea un campo sino una propiedad. No es que no funcione con campos, es simplemente una cuestión de mantenibilidad y normas de estilo.

    • Marcado como respuesta hector barajas martes, 24 de noviembre de 2020 22:01
    martes, 24 de noviembre de 2020 18:53
  • Te agradezco mucho tus respuestas. Solo una pregunta mas. como puedo crear la lista en un modulo con los registros
    martes, 24 de noviembre de 2020 19:56
  • Es decir como puedo rellenar la lista de registros de detalle en un modulo ya sea de formulario u otro
    martes, 24 de noviembre de 2020 20:12
  • No entiendo nada. ¿A qué te refieres? Es una clase normal y corriente, solo hace falta instanciarla con New y asignar los valores a las propiedades, igual que cualquier otra clase. ¿Cómo rellenas las clases normalmente? Pon un ejemplo y lo "arreglamos" para que use esta clase.
    martes, 24 de noviembre de 2020 21:11
  • Tienes razon ya logre crear la lista te agradezco tu apoyo
    martes, 24 de noviembre de 2020 22:01