none
Autogenerar codigo de ID

    Pregunta

  • Hola amigos nuevamente por aqui, quisera que me ayuden con el siguiente caso, tengo este codigo:

    en una clase DAO:

        Public Function GenerarCodigo() As Integer
            cn.Open()
            cmd = New SqlCommand("AutogenerarCodigo", cn)
            Dim param As New SqlParameter("@id_prod", SqlDbType.char, 9)
            param.Direction = ParameterDirection.Output
            With cmd
                .CommandType = CommandType.StoredProcedure
                .Parameters.Add(param)
                .ExecuteNonQuery()
                cn.Close()
                Return .Parameters("@id_prod").Value
            End With
        End Function

    en un boton NUEVO:

     Private Sub btn_Nuevo_Click(sender As Object, e As EventArgs) Handles btn_Nuevo.Click
            Habilitar()
            dgv_Producto.DataSource = productoDAO.ConsultaProducto()
            txt_id_prod.Text = Format(productoDAO.GenerarCodigo, "000")
            Limpiar()
        End Sub

    en el Load del Form:

            txt_id_prod.Text = Format(productoDAO.GenerarCodigo, "000")

    y un Procedimiento almacenado en SQL:

    create procedure AutogenerarCodigo (@id_prod char(9) output)
    as
    if (select COUNT(*) from Producto)=0
    set @id_prod='1'
    else
    set
    @id_prod=(select max(id_prod) from Producto)+1

    DELETE FROM Producto
    select * from Producto

    todo esto me permite autogenerar un Id para cada dato que ingreso, la duda es como hacer para que no solo guarde números si no pre-determinarlo algo como "Prd000" y se vaya auto-incrementando, cambie el codigo "000" por "PRD000" y me bota el error:

    Espero me puedan ayudar, gracias. 


    Juan Fernando

    domingo, 9 de octubre de 2016 6:42

Respuestas

  • cambie el codigo "000" por "PRD000" y me bota el error: [Conversion failed]

    El problema está aquí:

    (select max(id_prod) from Producto)+1

    Si el id_prod contiene un varchar (PRD000), el select max de ese valor te devolverá un varchar. Y cuando intentas sumarle 1 (que es un int) a ese varchar, se aplican las reglas de prioridad de tipos de sql server, que dicen que el int tiene prioridad respecto al varchar. Por lo tanto, intenta convertir el varchae en int (y no al revés), y claro, da un error de conversión porque al tener letras no se puede convertir en numérico.

    Para resolverlo tendrás que trabajar bastante más. Si quieres dejar el procedimiento tal como lo tienes, tendrás que cortar el texto separando el PRD del valor numérico que hay detrás, sumarle 1 al valor numérico, y luego volverlo a concatenar con el prefijo que antes separaste. Otra alternativa es pasar por separado el prefijo al procedimiento y pedirle que te devuelva el siguiente valor con ese prefijo (que podrías filtrar con un LIKE en la select).

    En todo caso, si el programa va a ser multiusuario, ten presente que tal como lo tienes podría ocurrir que dos usuarios reciban el mismo código, ya que no hay nada que reserve el código una vez que se ha generado y antes de grabar el registro.

    • Marcado como respuesta Juan_fernando domingo, 9 de octubre de 2016 10:57
    domingo, 9 de octubre de 2016 7:28