none
Incremento de un Textbox en VB 2005 con Sql Server 2005

    Pregunta

  • Tengo un problema con la codificación de mi programa y espero me puedan ayudar.

    Estoy trabajando con visual basic 2005 y en un Form tengo varios txtbox que se conectan a una base de datos en sql server 2005.

    El problema es que cuando yo le doy clic al boton me guarda todos los datos que yo quiero en los campos muy bien pero yo necesito que en el campo "PARTNUM" de la tabla "PARTIDAS" me autoincremente en uno el numero de partida a partir del el valor maximo de partidas que tenga la orden de compra seleccionada. Por ejemplo supongamos que el usuario selecciona la orden de compra 82 y dicha orden tiene 2 partidas (eso quiere decir que el numero maximo que tomara es 2) y posteriormente el usuario llenara los demas textbox, al momento de que el usuario de clic en el boton agregar, en la BD se guardara la partida con los datos que escribio en los txtbox pero con el numero de partida 3 (calculado con el valor maximo (2) +1 =3).

    Mi codigo es el siguiente:     

    Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click
            Dim cn As New SqlConnection(servlng)
            cn.Open()
            Dim cm As New SqlCommand("SELECT IDREQ AS REQ, DEPTO AS DEPTO, IDCOMPRA AS IDOC, CANTIDAD AS CANT, TIPO AS TIPO, DESCRIP AS DESC, PREUNI AS PREUNI, SUBTOTAL AS SUBTOT, IVAPER AS IVA, TOTAL AS TOTAL, PROVREAL AS PROV, ESTATUS, MONEDA AS MON FROM PARTIDAS WHERE IDCOMPRA= " & Val(cmbOC.Text), cn)
    
            Dim depto, tipo, desc, prov, mon As String
            Dim idoc, cant, preuni, subtot, iva, total, req As Integer
            'Dim part As Double
    
            depto = txtDepto.Text
            idoc = cmbOC.Text
            tipo = cmbTipo.Text
            cant = txtCan.Text
            desc = rtbDescr.Text
            preuni = txtPreUni.Text
            subtot = txtsubtot.Text
            iva = cmbIVA.Text
            total = txtTot.Text
            prov = txtprov.Text
            mon = cmbMon.Text
            req = txtReq.Text
    
            'Dim part As String
            'part = "SELECT MAX(PARTNUM) FROM PARTIDAS WHERE IDCOMPRA= '" & Val(cmbOC.Text) & "'"
            '  txtPart.Text = part
    
            Dim sql As String
            Sql = "SELECT MAX(PARTNUM) FROM PARTIDAS WHERE IDCOMPRA= '" & Val(cmbOC.Text) & "'"
            Dim parnum As String = sql
            Dim partCmd As New SqlCommand(parnum, cn)
            parnum = partCmd.ExecuteScalar
            parnum = parnum + 1
    
            With cm
                .Connection = cn
                .CommandType = CommandType.Text
                .CommandText = "INSERT INTO PARTIDAS (IDCOMPRA, PROVREAL, ESTATUS, IDREQ, DEPTO, CANTIDAD, TIPO, PREUNI, SUBTOTAL, DESCRIP, IVAPER, TOTAL, MONEDA) VALUES (@IDCOMPRA, @PROVREAL, @ESTATUS, @IDREQ, @DEPTO, @CANTIDAD,@TIPO, @PREUNI, @SUBTOTAL, @DESCRIP, @IVAPER, @TOTAL, @MONEDA)"
                .Parameters.Add("@IDCOMPRA", SqlDbType.Int)
                .Parameters("@IDCOMPRA").Value = idoc
                .Parameters.Add("@PROVREAL", SqlDbType.Text, 100)
                .Parameters("@PROVREAL").Value = prov
                .Parameters.Add("@ESTATUS", SqlDbType.Int, 1)
                .Parameters("@ESTATUS").Value = 1
                .Parameters.Add("IDREQ", SqlDbType.Int, req)
                .Parameters("IDREQ").Value = req
                .Parameters.Add("DEPTO", SqlDbType.Text, 16)
                .Parameters("DEPTO").Value = depto
                .Parameters.Add("@DESCRIP", SqlDbType.Text, 500)
                .Parameters("@DESCRIP").Value = desc
                .Parameters.Add("@CANTIDAD", SqlDbType.NVarChar, cant)
                .Parameters("@CANTIDAD").Value = cant
                .Parameters.Add("@TIPO", SqlDbType.VarChar, 15)
                .Parameters("@TIPO").Value = tipo
                .Parameters.Add("@PREUNI", SqlDbType.NVarChar, preuni)
                .Parameters("@PREUNI").Value = preuni
                .Parameters.Add("@SUBTOTAL", SqlDbType.NVarChar, subtot)
                .Parameters("@SUBTOTAL").Value = subtot
                .Parameters.Add("@IVAPER", SqlDbType.Float, iva)
                .Parameters("@IVAPER").Value = iva
                .Parameters.Add("@TOTAL", SqlDbType.Float)
                .Parameters("@TOTAL").Value = total
                .Parameters.Add("@MONEDA", SqlDbType.Text, 10)
                .Parameters("@MONEDA").Value = mon
                .Parameters.Add("@PARTNUM", SqlDbType.Text, parnum)
                .Parameters("@PARTNUM").Value = parnum
                .ExecuteNonQuery()
            End With
            MsgBox("Partida Registrada con éxito", MsgBoxStyle.Information, "Mensaje del Sistema")
            cn.Close()
        End Sub

    Necesito saber cual es mi error o si ustedes me pueden ayudar a resolver el problema pasandome un codigo. Me urge resolverlo porque es para mi trabajo.

    miércoles, 17 de agosto de 2016 20:52

Respuestas

  • Monserrat Núñez,

    Como recomendación inicial: debes de guardar orden en la codificación. Sobre el problema que presentas, fíjate que en la lista de columnas que vas a insertar no nombras a la columna [PARTNUM], es evidente que no se escribirá ningún valor sobre dicha columna, la codificación debería tener la siguiente forma:

    Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click
        Using cn As New SqlConnection(servlng)
                cn.Open()
    
                'Obtener la secuencia siguiente
                Dim ConsultaSQL As String = "SELECT ISNULL(MAX(PARTNUM), 0) + 1 FROM PARTIDAS WHERE IDCOMPRA=@IDCOMPRA"
    
                Dim cmd As New SqlCommand(ConsultaSQL, cn)
                cmd.Parameters.AddWithValue("@IDCOMPRA", Val(cmbOC.Text))
    
                Dim UltimoNumero As Integer = Convert.ToInt32(cmd.ExecuteScalar)
    
                'Insertar datos
                cmd.CommandText = "INSERT INTO PARTIDAS (IDCOMPRA, PROVREAL, <...>, PARTNUM, <...>) VALUES (@IDCOMPRA, @PROVREAL, <...>, @PARTNUM, <...>)"
    
                cmd.Parameters.Clear
    
                cmd.Parameters.AddWithValue("@IDCOMPRA", cmbOC.Text)
                cmd.Parameters.AddWithValue("@PROVREAL", txtprov.Text)
                '...
                cmd.Parameters.AddWithValue("@PARTNUM", UltimoNumero)
    
                cmd.ExecuteNonQuery
        End Using
    End Sub


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    jueves, 18 de agosto de 2016 18:37

Todas las respuestas

  • Monserrat Núñez,

    ¿Por qué la columna [PARTNUM] es de tipo text? ¿No debería ser un tipo numérico como por ejemplo int, smallint, etc.?

    Dim Sql As String
    Sql = "SELECT ISNULL(MAX(CAST(PARTNUM AS int)), 0) FROM PARTIDAS WHERE IDCOMPRA=@IDCOMPRA"
    
    Dim partCmd As New SqlCommand(Sql, cn)
    
    partCmd.ParametersAddWithValue("@IDCOMPRA", Val(cmbOC.Text))
    
    Dim NumeroSiguiente As Integer = Convert.ToInt32(partCmd.ExecuteScalar) + 1



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    jueves, 18 de agosto de 2016 5:22
  • Lo intente como text, integer, nvarchar, float y seguia teniendo el mismo error asi que opte por dejarlo en text.

     Ya intente con tu codigo y sigue sin sumarme el numero de partida. Me registra todos los campos muy bien pero el campo "PARTNUM" me marca como NULL yo tome la orden de compra 81 para prueba pero solo tiene la partida 1 de la orden de compra original pero a las nuevas partidas no les asigna el numero consecutivo.

    esta es la imagen de la tabla actual "PARTIDAS"

    jueves, 18 de agosto de 2016 14:30
  • Monserrat Núñez,

    Como recomendación inicial: debes de guardar orden en la codificación. Sobre el problema que presentas, fíjate que en la lista de columnas que vas a insertar no nombras a la columna [PARTNUM], es evidente que no se escribirá ningún valor sobre dicha columna, la codificación debería tener la siguiente forma:

    Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click
        Using cn As New SqlConnection(servlng)
                cn.Open()
    
                'Obtener la secuencia siguiente
                Dim ConsultaSQL As String = "SELECT ISNULL(MAX(PARTNUM), 0) + 1 FROM PARTIDAS WHERE IDCOMPRA=@IDCOMPRA"
    
                Dim cmd As New SqlCommand(ConsultaSQL, cn)
                cmd.Parameters.AddWithValue("@IDCOMPRA", Val(cmbOC.Text))
    
                Dim UltimoNumero As Integer = Convert.ToInt32(cmd.ExecuteScalar)
    
                'Insertar datos
                cmd.CommandText = "INSERT INTO PARTIDAS (IDCOMPRA, PROVREAL, <...>, PARTNUM, <...>) VALUES (@IDCOMPRA, @PROVREAL, <...>, @PARTNUM, <...>)"
    
                cmd.Parameters.Clear
    
                cmd.Parameters.AddWithValue("@IDCOMPRA", cmbOC.Text)
                cmd.Parameters.AddWithValue("@PROVREAL", txtprov.Text)
                '...
                cmd.Parameters.AddWithValue("@PARTNUM", UltimoNumero)
    
                cmd.ExecuteNonQuery
        End Using
    End Sub


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    jueves, 18 de agosto de 2016 18:37