none
cosecutivo correcto para generacion de documentos RRS feed

  • Pregunta

  • Buen día, pues sucede que estoy realizando un programa que requiere numeración consecutiva, tal ves esto ya se haya respondido de varias formas, y recomendaciones, que he podido leer en el foro pero planteo lo siguiente:

    Hay un formulario llamado cotización, el cual toma datos de una base (MySQL), estos datos son. Cliente, email, nombre contacto, producto entre otros.

    Al  momento de abrir el formulario en el load se genera el numero de la cotización, mediante el llamado de una clase:

    Private Sub Cotizacion_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            
            'se muestra el numero de la cotizacion
            comando = numerador.consecutivo
            Label17.Text = numerador.label1.Text
            Label17.ForeColor = Color.Green
    
        End Sub


    Ahora este es el método de la clase:

    Public Function consecutivo() As MySqlCommand
            Dim fecha As String
            Dim usuario As String
            fecha = resultado.fecha
            Dim comando As New MySqlCommand
    
            Dim cod_coti As Integer = 0
            conn = objetoconexion.abrir
    
            Try
                comando = New MySqlCommand("INSERT INTO cotizacion (fecha,cod_user) VALUES (@fecha,@cod_user); SELECT LAST_INSERT_ID()", conn)
                comando.Parameters.AddWithValue("@fecha", fecha)
                comando.Parameters.AddWithValue("@cod_user", usuario)
                cod_coti = Convert.ToInt32(comando.ExecuteScalar())
    
                'se muestra el numero de la cotizacion
                label1.Text = cod_coti
                label1.ForeColor = Color.Green
            Catch ex As Exception
                MsgBox(ex.Message, MsgBoxStyle.Critical)
            Finally
                conn.Close()
                tabla = Nothing
            End Try
            Return comando
        End Function

    Al hacer la insercion capturo el  ultimo id insertado y lo muestro en un objeto label, el cual es mostrado en el load. Este ultimo id lo utilizo para relacionar los items introducidos del formulario cotizacion en una tabla llamada items, con el objeto de relacionar  varios items con un numero de cotizacion, es decir al buscar por ejemplo la cotizacion No. 5  ( cod_coti(5)), que seria el consecutivo, relaciono cuantos items se guardaron con ese numero de cotizacion. Esta insercion de items la hago con un boton, llamando a una funcion:

    Public Sub insertar()
            Dim fecha As String
            fecha = resultado.fecha
            Dim comando As New MySqlCommand
            Dim item As Integer = 0
            conn = objetoconexion.abrir
            Try
    
                '/////////////////////////se introduce los productos con su item y producto/////////////////////////////////////////////
                comando = New MySqlCommand("INSERT INTO items (cod_coti,cod_pro,producto,clase,presentacion,cantidad,precio,ficha_tecn,observaciones,cliente) VALUES (@cod_coti,@cod_pro,@producto,@clase,@presentacion,@cantidad,@precio,@ficha_tecn,@observaciones,@cliente); SELECT LAST_INSERT_ID()", conn)
                comando.Parameters.AddWithValue("@cod_coti", Label17.Text)
                comando.Parameters.AddWithValue("@cod_pro", Producto.SelectedValue)
                comando.Parameters.AddWithValue("@producto", Producto.Text)
                comando.Parameters.AddWithValue("@clase", clase.Text)
                comando.Parameters.AddWithValue("@presentacion", presenta.Text)
                comando.Parameters.AddWithValue("@cantidad", cantidad.Text)
                comando.Parameters.AddWithValue("@precio", precio.Text)
                comando.Parameters.AddWithValue("@ficha_tecn", ficha.Text)
                comando.Parameters.AddWithValue("@observaciones", observa.Text)
                comando.Parameters.AddWithValue("@cliente", Nomcliente.Text)
                item = Convert.ToInt32(comando.ExecuteScalar())
                'comando.ExecuteNonQuery()
    
                '////////////////////////////se introduce los productos con su item y producto/////////////////////////////////////////////////////
    
                ListView1.Refresh()
                ListView1.Items.Add(item)
                ListView1.Items(pos).SubItems.Add(Producto.SelectedValue)
                ListView1.Items(pos).SubItems.Add(Producto.Text)
                ListView1.Items(pos).SubItems.Add(clase.Text)
                ListView1.Items(pos).SubItems.Add(presenta.Text)
                ListView1.Items(pos).SubItems.Add(cantidad.Text)
                ListView1.Items(pos).SubItems.Add(precio.Text)
                ListView1.Items(pos).SubItems.Add(ficha.Text)
                ListView1.Items(pos).SubItems.Add(observa.Text)
                ListView1.Items(pos).SubItems.Add(Nomcliente.Text)
                ListView1.Items(pos).SubItems.Add(contactocli.Text)
                ListView1.Items(pos).SubItems.Add(telcli.Text)
                ListView1.Items(pos).SubItems.Add(TextBox1.Text)
                pos = pos + 1
    
                resultado.MakeReport("Se ha insertado : " & Producto.Text & " --- " & fecha)
    
                '//////////////////se introducen acciones del usuario////////////////////////////////
                Dim sesions As New MySqlConnection
                Dim sesion As New verificacion
                sesions = sesion.sesion()
    
                MsgBox("Datos insertados con exito", MsgBoxStyle.Information, "VERIFICACION")
                cantidad.Text = ""
                precio.Text = ""
                ficha.Text = ""
                observa.Text = ""
    
            Catch ex As Exception
                MsgBox(ex.Message, MsgBoxStyle.Critical)
                conn.Close()
            End Try
        End Sub

    Cada vez que se introduce un ítem lo voy mostrando en un listview.

    Ahora el consecutivo de la cotización en la BD es un campo AI, y me encuentro con esto, si el usuario abre el formulario se crea un numero de cotización, pero si este decide no hacer la cotización, el numero queda creado y sin ninguna asignacion de items, quedando huecos en la tabla cotización.

    Habra otra forma de generar esta numeracion sin que se pierdan los numeros py que se  pueda manejarse en un sistema multiusuario?

    Gracias y saludos

    gilmo_26

    • Cambiado Enrique M. Montejo jueves, 21 de junio de 2012 18:06 acceso a datos (De:Lenguaje VB.NET)
    martes, 12 de junio de 2012 14:17

Todas las respuestas

  • Ahora el consecutivo de la cotización en la BD es un campo AI, y me encuentro con esto, si el usuario abre el formulario se crea un numero de cotización, pero si este decide no hacer la cotización, el numero queda creado y sin ninguna asignacion de items, quedando huecos en la tabla cotización.

    que es un campo AI ?

    porque no usas autonumerico en el campo del codigo para que el id incremental se genere automatico cuando insertas

    valida la respuesta marcada en esta otra pregunta

    http://social.msdn.microsoft.com/Forums/es/vcses/thread/35ceb063-9908-4f69-9988-3cbcfdaa25b6

    asi obtendrias el id generado

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    martes, 12 de junio de 2012 15:38
  • Hola Leandro, gracias por responder, pues AI en autoIncrementable, lo que pregunto es si es valido como estoy generando los consecutivos del documento, ya que al cargar el formulario del miosmo se crea el consecutivo pero si se decide no llenar este formualrio, el numero si se genera pero no se utiliza.

    Gracias

    gilmo_26

    martes, 12 de junio de 2012 16:28
  • Hola, yo lo que hago es tomar ese tipo de números en el momento en el que se va a grabar el registro en la base de datos. Con esto también controlas la posibilidad de que dos usuarios en red graben registros diferentes con el mismo código.

    En tu caso se trataría de llamar a numerador.consecutivo en el proceso de insertar. No se si en tu caso es necesario por algún motivo grabar ese registro en la tabla cotizacion  antes de insertar. Si fuera así tendrías que controlar, como dices, el caso de salir cancelando de esta manera:

    1. Borar el registro creado en cotización.
    2. Al buscar el siguiente código, si no quieres que te puedan quedar códigos sin usar, tendrás que buscar no el último sino el primero que esté libre.



    Saludos, Javier J

    martes, 12 de junio de 2012 16:46