none
almacenamiento informacion temporal vb.net RRS feed

  • Pregunta

  • Buenas tardes a todos.... tengo una duda puntual....  estoy haciendo un sistema para una Pizzeria... el usuario puede seleccionar una o varias pizzas (y por supuesto, una o varias pizzas del mismo tipo), bebidas y postres .... mi pregunta es: Como hago para almacenar temporalmente lo que el usuario seleccione, y luego volcarlo en una tabla de mi bd (MySql), hasta el momento que se apruebe el pedido (imprimir recibo).... Estoy trabajando con Vb.net 2013 y NetFramework 4.5 bajo Windows 7...

    Gracias por sus consejos.

    lunes, 29 de septiembre de 2014 0:47

Respuestas

  • Hola:

    Esta clase la tengo definida en un Modulo...

    1. La clase debes de crearla por separado, un modulo es una cosa y una clase otra muy diferente...

    2. Si tienes propiedades autoimplementadas y publicas no necesitas sobrecargar el constructor de la clase que las contiene:

    Public Class ProductoComprado
            'Si la clase se llama Producto se sobreentiende que todo lo que envuelve forma parte de la entidad Producto, así que no es necesario poner 'producto' después del nombre de la propiedad...
    
            Public Property Tipo As String
            Public Property Codigo As Integer
            Public Property Nombre As String
            Public Property Cantidad As Integer
            Public Property PrecioUnitario As Decimal
    
    End Class

    3. El error que recibes es porque no esta inicializada la instancia de la clase ProductoComprado, cuando haces:

    ''Establecer Producto como Nothing es decirle que es igual a Nulo a nada...
    Dim Producto As ProductoComprado = Nothing
    '
    'Lo correcto seria definirle un tipo, en este caso
    Dim Producto As New ProductoComprado

    Cuando la instancia de la clase es del tipo ProductoComprado entonces podrás utilizar sus propiedades,tal cual como lo deseas hacer,pregunta ¿leíste el articulo que te sugerí?

    Por ultimo si alguno de mis respuestas han resuelto tus dudas por favor marcalas como tal y votalas como útiles si te ayudo a resolver tu problema.


    Saludos desde Monterrey, Nuevo León, México!!!



    • Editado JoséLuisGarcía jueves, 2 de octubre de 2014 18:32 ED
    • Marcado como respuesta wichortiz viernes, 3 de octubre de 2014 0:44
    jueves, 2 de octubre de 2014 3:27
  • Muchisimas Gracias Luis Escobar.... tu ayuda ha sido fundamental para resolver mis dudas... muchas gracias por tu paciencia... esto fue lo que hice y me resulto perfectamente....

    En Primer lugar, cree esta clase que contiene el Producto

    Public Class ProductoComprado
    
        Private m_cantidad As Integer
        Private m_tipo As String
        Private m_codigo As Integer
        Private m_nombre As String
        Private m_preciounitario As Decimal
        Private m_total As Decimal
    
        Public Sub New()
            ' Constructor por defecto. Es necesario para
            ' poder añadir nuevos registros en blanco.
        End Sub
    
        Public Sub New(ByVal cantidad As Integer, ByVal tipo As String, ByVal codigo As Integer, ByVal nombre As String,
                       ByVal precioUnitario As Decimal, ByVal total As Decimal)
    
            m_cantidad = cantidad
            m_tipo = tipo
            m_codigo = codigo
            m_nombre = nombre
            m_preciounitario = precioUnitario
            m_total = total
    
        End Sub
    
        Public Property Cantidad As Integer
            Get
                Return m_cantidad
            End Get
            Set(ByVal value As Integer)
                m_cantidad = value
            End Set
        End Property
        Public Property Tipo As String
            Get
                Return m_tipo
            End Get
            Set(ByVal value As String)
                m_tipo = value
            End Set
        End Property
    
        Public Property Codigo As Integer
            Get
                Return m_codigo
            End Get
            Set(ByVal value As Integer)
                m_codigo = value
            End Set
        End Property
    
        Public Property Nombre As String
            Get
                Return m_nombre
            End Get
            Set(ByVal value As String)
                m_nombre = value
            End Set
        End Property
    
        Public Property PrecioUnitario As Decimal
            Get
                Return m_preciounitario
            End Get
            Set(ByVal value As Decimal)
                m_preciounitario = value
            End Set
        End Property
    
        Public Property total As Decimal
            Get
                Return m_total
            End Get
            Set(ByVal value As Decimal)
                m_total = value
            End Set
        End Property
    
    End Class
    

    Luego, (basado en varios lugares que consulte, incluyendo lo que tu me recomendaste)... cree esta Clase que es una lista

    Imports System.ComponentModel
    Public Class ListaProductosComprados
    
        ' La clase admitirá el enlace de datos
        Inherits BindingList(Of ProductoComprado)
    
        Protected Overrides Sub OnAddingNew(ByVal e As AddingNewEventArgs)
    
            ' Creamos un nuevo Producto
            '
            e.NewObject = New ProductoComprado()
    
        End Sub
    
    End Class

    Y por ultimo... en el form hago el enlace a esta clase

    ' Construimos una lista de ProductosComprados
    
        Public LstProd As ListaProductosComprados = New ListaProductosComprados()
    
    Private Sub Frm_Pedidos_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
           
            'Enlazo el DataGridView de Compra con la Clase 
            Me.DGV_PedidoPizzas.DataSource = LstProd
    
    end Sub

    Con eso, ya mantengo la informacion en mi Clase y puedo llenar automaticamente mi DataGridView...

    De nuevo agradezco tu ayuda y tambien de Collado... son muy amables por la labor brindada...

    Con esto doy por cerrado el hilo...

    • Marcado como respuesta wichortiz viernes, 3 de octubre de 2014 0:44
    viernes, 3 de octubre de 2014 0:44

Todas las respuestas

  • Hola:

     En realidad no necesitas almacenar nada en ningún lado, cuando el usuario decida confirmar el pedido en ese momento es cuando recoges los datos de los controles respectivos, de preferencia usa clases para que te sea mas fácil trabajar.


    Saludos desde Monterrey, Nuevo León, México!!!

    lunes, 29 de septiembre de 2014 1:41
  • Muchas Gracias Joseph y Luis por sus respuestas.... le comento: Los productos disponibles los tengo en controles tipo Boton, que se crean en tiempo de ejecucion segun los que esten disponibles en existencia.... La idea de almacenar el pedido del cliente en un DataGridView no esta mal, me parece muy atinada; pero me salta la duda es cuanto al uso de la memoria, que piensan sobre eso ???..... y la otra idea (de Luis Escobar), tambien me llama mucho la atencion (sobre el uso de clases), ya lo he intentado para almacenar el pedido de Pizzas, pero me falta el de Sodas, Postres, Ingredientes Extras..... y de nuevo la pregunta... como queda el uso de la memoria ???.... y tendria que crear una clase por cada factor ??' (me refiero una para las Pizzas, otra clase para la Bebidas, otra para los postres... etc.).... gracias de nuevo por su ayuda.

    PD.- Necesito ir almacenando lo que el usuario a "pinchado", porque los productos (por la cantidad que son), los presento en pantallas separadas (una para Pizza, otra para Bebidas, otra para Postres, otra para Ingredientes Extras... etc.).... y llevo un Label que siempre se muestra y que indica lo que se esta pidiendo.... espero darme a entender...

    lunes, 29 de septiembre de 2014 15:03
  • Hola:

     y tendria que crear una clase por cada factor ??

     Si cada producto tiene características diferentes entonces si debes de crear una clase por cada producto diferente, el echo de que trabajes tu aplicación en clases te ayudara en muchas cosas lo primero es que comenzaras a trabajar con objetos, lo segundo es que podrás enviar un objeto con todas sus propiedades a otra clase sin problemas...

     Si dices que tomas los productos de diferentes formularios entonces piensa en que deberias de ir concentrando la informacion recopilada en un control que sea visible y para eso creo que el DataGridView funcionaria muy bien, pero al momento de enviar la informacion a la base de datos usar una clase sin lugar a dudas te facilitara la vida.


    Saludos desde Monterrey, Nuevo León, México!!!

    lunes, 29 de septiembre de 2014 20:04
  • Hola Luis... te presento la pantalla y te explico....

    Los botones de la Izq. es de donde el usuario determina que es lo que el cliente esta solicitando (Pizzas, Bebidas, Postres, etc.).... en la parte del centro de este formulario, hay un Panel que es el que contiene cada uno de los formularios (en el caso de la pantalla, esta marcado con un cuadrado rojo).... si el usuario selecciona "Bebidas", esta pantalla va a desaparecer y en su lugar aparecera una similar pero con las bebidas disponibles..... tambien, en la parte derecha (cuadro verde), estan los ingredientes extras que puede pedir el cliente..... y por ultimo, encerrado con un circulo amarillo (parte de abajo), esta la informacion para el usuario de lo que el cliente va pidiendo.....

    Como ves, no tengo espacio para poner un DataGrid...  y como el la informacion se esta presentado en texto... no me parece que sea relevante crearlo.......  yo lo que quiero, es almacenar esta informacion mientras el usuario no ha presionado el boton de guardar o imprimir orden..... Lo de las clases me parecen bien... pero no se si crearlas en local o Global... y como repercutira eso con el manejo de la memoria.... 

    Gracias de nuevo por tu ayuda y espero haberme explicado bien.... 

    martes, 30 de septiembre de 2014 1:06
  • Hola:

     Tener visible que productos el usuario va seleccionando desde mi punto de vista es crucial (que pasaría si el cliente le pide actualizar un ingrediente), en cuanto al uso de la memoria no te preocupes los equipos de hoy en día están diseñados para tener muchísima memoria y una aplicación de escritorio dudo mucho que provoque una sobrecarga en esta, lo insisto usa clases para que crees instancias de cada uno de ellas, lo que no veo claro es que si únicamente necesitas mantener los datos en memoria para posteriormente imprimirlos o necesitaras también almacenarlos en una Bd?...


    Saludos desde Monterrey, Nuevo León, México!!!

    martes, 30 de septiembre de 2014 20:22
  • Hola Luis.... tambien los necesito almacenar en mi BD (MySql)... pero hasta estar "cerrado" el pedido, ya cuando se va a imprimir el recibo, es por eso que quiero almacenar lo que esta pidiendo en alguna parte.... voy a hacer espacio en el formulario de Pedidos para colocar el DataGridView, ya que me has convencido de la utilidad de este... ademas, la informacion que deseo de cada item, practicamente es del mismo tipo (codigoPizza es del mismo tipo que CodigoBebida, CodigoPostre, etc...),.... pero entonces me surge una duda... para que voy a necesitar las clases, si la informacion ya la tengo disponible en mi DataGridView ???.... lo veo un poco redundante tenerla en ambos lados..... que crees ???

    Gracias de nuevo por tu ayuda....

    martes, 30 de septiembre de 2014 23:21
  • Hola:

      Lo de las clases lo comente antes de saber que todos los productos tenían las mimas características (cosa que dudo porque una pizza lleva especias y una bebida no), si dices que todos los productos que vas a manejar son similares entonces yo crearía una sola clase llamada Producto a la cual le crearía las propiedades generales y la usaría solo cuando el usuario confirme la transacción, mediante un ciclo foreach recorrería las filas del DGV mapeando el valor de los Cells a la respectiva propiedad, después, esta instancia de la clase la cargaría a una lista genérica del mismo tipo y seria esta la que enviaría a mi método de inserción...


    Saludos desde Monterrey, Nuevo León, México!!!

    miércoles, 1 de octubre de 2014 20:07
  • De nuevo muchas gracias Luis por tu respuesta..... te cuento: La Pizza, la Bebida, los postres, etc... ya los he creado anteriormente (cada uno en un formulario diferente)... en esta parte a la que nos estamos refiriendo, es estrictamente la "Venta" al cliente.. aqui yo creo botones (que representan las pizzas), en tiempo de ejecucion (dependiendo cuales tenga almacenadas en mi BD)... y la informacion "base" de cada producto es la misma (CodPizza es Int4, CodBebida es Int4. CodPostre es Int4, etc....)... por eso te digo que los productos son similares... he ahi el porque tu idea es adecuada... (una sola Clase).... lo demas te lo comprendo perfectamente 

    llamada Producto a la cual le crearía las propiedades generales y la usaría solo cuando el usuario confirme la transacción, mediante un ciclo foreach recorrería las filas del DGV mapeando el valor de los Cells a la respectiva propiedad,

    lo que todavia no comprendo (y te pido disculpas si soy muy "topado" y no veo lo que me tratas de explicar)... es: "Si ya tengo esa informacion en los DG de cada producto... porque los paso a una clase y luego, esta misma informacion, la paso al metodo de insercion"....

    Gracias nuevamente por tu ayuda..

    miércoles, 1 de octubre de 2014 21:41
  • Ok, de entrada para llenar una DataGridView dispones de dos opciones una es usando el Add.Row para agregar un nuevo renglón y luego enviar los valores ese ese renglón, hablo de algo como esto:

    dgvProductos.Rows.Add("Pizza Grande", "$100", "15 pulgadas");

    La otra es usando el DataSource del control DataGridView:

    dgvProductos.DataSource = _listProductos; //Lista que contiene la variedad de productos seleccionados por el usuario

     Cualquier método que utilices para llenar tu DGV sera independiente de como es que envíes los datos a la Bd, porque deberás de enviar los valores que el DGV contiene, si usas el DataSource del DGV podrás enlazarlo a una lista de la clase Producto, haciendo con esto la tarea mas fácil ya que cuando quieras guardar los datos en la BD únicamente envías esta lista al método que debes de crear para insertar valores a tu Bd:

    Para que tengas un mayor contexto de lo que hablo, lee este articulo detenidamente:

    Llenar DataGridView con datos de TextBox’s usando Datasource o el método Add()


    Saludos desde Monterrey, Nuevo León, México!!!

    miércoles, 1 de octubre de 2014 22:28
  • Gracias de Nuevo Luis.. especialmente por el tiempo dedicado...

    Estoy haciendo las cosas como tu dices (Creo)... pero tengo un par de errores que me gustaria me dijeras a que se puede deber...

    Asi tengo creada mi Clase:

    Public Class ProductoComprado
            'En esta Clase, voy a guardar los productos que el usuario vaya seleccionando
    
            Public Property tipoproducto As String
            Public Property codproducto As Integer
            Public Property nomproducto As String
            Public Property cantidadproducto As Integer
            Public Property preciounit As Decimal
            Public Sub New(TipoProducto As String, CodProducto As Integer, NomProducto As String, CantidadProducto As Integer, PrecioUnit As Decimal)
    
                _tipoproducto = TipoProducto
                _codproducto = CodProducto
                _nomproducto = NomProducto
                _cantidadproducto = CantidadProducto
                _preciounit = PrecioUnit
    
            End Sub
    
        End Class

    Esta clase la tengo definida en un Modulo...

    Luego en el Formulario (que es la imagen que puse en un post anterior)... tengo esto:

    Public Pedido_Productos As List(Of ProductoComprado)

    y en el evento Click del boton, del formulario que contiene las diferentes productos, tengo esto:

    Dim Producto As ProductoComprado = Nothing
    
                            With Producto
                                .tipoproducto = "Pizza"
                                .codproducto = CodPizz
                                .nomproducto = NombreTemporal + " " + TamañoTemporal
                                .cantidadproducto = CInt(CantidadRecibida)
                                .preciounit = PrecioTemporal
    
                                FrmPedidos.Pedido_Productos.Add(Producto)
    
                            End With

    El problema es que al ejecutarse, en el punto dentro del With, me da el error: "Referencia a un objeto establecida como una instancia de objeto..."

    Que podra ser ???

    Gracias mil.


    • Editado wichortiz jueves, 2 de octubre de 2014 2:32
    jueves, 2 de octubre de 2014 2:23
  • Hola:

    Esta clase la tengo definida en un Modulo...

    1. La clase debes de crearla por separado, un modulo es una cosa y una clase otra muy diferente...

    2. Si tienes propiedades autoimplementadas y publicas no necesitas sobrecargar el constructor de la clase que las contiene:

    Public Class ProductoComprado
            'Si la clase se llama Producto se sobreentiende que todo lo que envuelve forma parte de la entidad Producto, así que no es necesario poner 'producto' después del nombre de la propiedad...
    
            Public Property Tipo As String
            Public Property Codigo As Integer
            Public Property Nombre As String
            Public Property Cantidad As Integer
            Public Property PrecioUnitario As Decimal
    
    End Class

    3. El error que recibes es porque no esta inicializada la instancia de la clase ProductoComprado, cuando haces:

    ''Establecer Producto como Nothing es decirle que es igual a Nulo a nada...
    Dim Producto As ProductoComprado = Nothing
    '
    'Lo correcto seria definirle un tipo, en este caso
    Dim Producto As New ProductoComprado

    Cuando la instancia de la clase es del tipo ProductoComprado entonces podrás utilizar sus propiedades,tal cual como lo deseas hacer,pregunta ¿leíste el articulo que te sugerí?

    Por ultimo si alguno de mis respuestas han resuelto tus dudas por favor marcalas como tal y votalas como útiles si te ayudo a resolver tu problema.


    Saludos desde Monterrey, Nuevo León, México!!!



    • Editado JoséLuisGarcía jueves, 2 de octubre de 2014 18:32 ED
    • Marcado como respuesta wichortiz viernes, 3 de octubre de 2014 0:44
    jueves, 2 de octubre de 2014 3:27
  • Muchisimas Gracias Luis Escobar.... tu ayuda ha sido fundamental para resolver mis dudas... muchas gracias por tu paciencia... esto fue lo que hice y me resulto perfectamente....

    En Primer lugar, cree esta clase que contiene el Producto

    Public Class ProductoComprado
    
        Private m_cantidad As Integer
        Private m_tipo As String
        Private m_codigo As Integer
        Private m_nombre As String
        Private m_preciounitario As Decimal
        Private m_total As Decimal
    
        Public Sub New()
            ' Constructor por defecto. Es necesario para
            ' poder añadir nuevos registros en blanco.
        End Sub
    
        Public Sub New(ByVal cantidad As Integer, ByVal tipo As String, ByVal codigo As Integer, ByVal nombre As String,
                       ByVal precioUnitario As Decimal, ByVal total As Decimal)
    
            m_cantidad = cantidad
            m_tipo = tipo
            m_codigo = codigo
            m_nombre = nombre
            m_preciounitario = precioUnitario
            m_total = total
    
        End Sub
    
        Public Property Cantidad As Integer
            Get
                Return m_cantidad
            End Get
            Set(ByVal value As Integer)
                m_cantidad = value
            End Set
        End Property
        Public Property Tipo As String
            Get
                Return m_tipo
            End Get
            Set(ByVal value As String)
                m_tipo = value
            End Set
        End Property
    
        Public Property Codigo As Integer
            Get
                Return m_codigo
            End Get
            Set(ByVal value As Integer)
                m_codigo = value
            End Set
        End Property
    
        Public Property Nombre As String
            Get
                Return m_nombre
            End Get
            Set(ByVal value As String)
                m_nombre = value
            End Set
        End Property
    
        Public Property PrecioUnitario As Decimal
            Get
                Return m_preciounitario
            End Get
            Set(ByVal value As Decimal)
                m_preciounitario = value
            End Set
        End Property
    
        Public Property total As Decimal
            Get
                Return m_total
            End Get
            Set(ByVal value As Decimal)
                m_total = value
            End Set
        End Property
    
    End Class
    

    Luego, (basado en varios lugares que consulte, incluyendo lo que tu me recomendaste)... cree esta Clase que es una lista

    Imports System.ComponentModel
    Public Class ListaProductosComprados
    
        ' La clase admitirá el enlace de datos
        Inherits BindingList(Of ProductoComprado)
    
        Protected Overrides Sub OnAddingNew(ByVal e As AddingNewEventArgs)
    
            ' Creamos un nuevo Producto
            '
            e.NewObject = New ProductoComprado()
    
        End Sub
    
    End Class

    Y por ultimo... en el form hago el enlace a esta clase

    ' Construimos una lista de ProductosComprados
    
        Public LstProd As ListaProductosComprados = New ListaProductosComprados()
    
    Private Sub Frm_Pedidos_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
           
            'Enlazo el DataGridView de Compra con la Clase 
            Me.DGV_PedidoPizzas.DataSource = LstProd
    
    end Sub

    Con eso, ya mantengo la informacion en mi Clase y puedo llenar automaticamente mi DataGridView...

    De nuevo agradezco tu ayuda y tambien de Collado... son muy amables por la labor brindada...

    Con esto doy por cerrado el hilo...

    • Marcado como respuesta wichortiz viernes, 3 de octubre de 2014 0:44
    viernes, 3 de octubre de 2014 0:44