none
error: illegal variable name/number

    Pregunta

  • tengo el siguiente codigo pero me explota en la linea del comando.ExecuteNonQuery() con el error illegal variable name/number ya e verificado que las variables esten bien declaradas y esten igual escrita que la base de datos y tabn e verificado otros detalles por las cuales se presenta ese error pero todo esta bien si me pueden ayudar se los agradezco
    Public Sub actualizar_existencias(codigo As String, nuevaCant As Integer, tipo As String)
       Try
         conecta.Open()
         comando.Connection = conecta
    
         If tipo = "DETAL" Then
            comando.CommandType = CommandType.Text
            comando.CommandText = "UPDATE ARTICULO SET EXISTDETAL_ART=" & nuevaCant & " WHERE COD_ART='" & codigo & "' AND STATUS_ART='A'"
            
         ElseIf tipo = "MAYOR" Then
            comando.CommandType = CommandType.Text
            comando.CommandText = "UPDATE ARTICULO SET EXISTMAYOR_ART=" & nuevaCant & " WHERE COD_ART='" & codigo & "' AND STATUS_ART='A'"
         
         end if
         comando.ExecuteNonQuery()
    
         MsgBox("ACTUALIZACION OK")
    
       Catch ex As Exception
         MsgBox(ex.Message, MsgBoxStyle.Critical, "ERROR")
       Finally
    
         conecta.Close()
       End Try

    jueves, 9 de marzo de 2017 23:59

Respuestas

  • Hola delap95,

    ¿Cuántos tipos estás utilizando, solo 2 (DETAL y MAYOR)?

    Si te fijas bien, si el tipo no es ni 'DETAL' ni 'MAYOR' no asigna una consulta a la propiedad CommandText, pero igual ejecutará el cmd.ExecuteNonQuery ya que se encuentra fuera de las condiciones.

    ¿Porqué declaras los objetos fuera del método, deberías hacerlo directamente en el método ? Además deberías parametrizar la consulta usando la propiedad Parameters.

    Podrías hacer :

    Public Sub actualizar_existencias(codigo As String, nuevaCant As Integer, tipo As String)
        Try
            Using con As New SqlConnection("MiCadenaConexion")
    
                con.Open()
    
                'Almacenará el campo que será modificado
                Dim campo As String = String.Empty
    
                If tipo.Equals("DETAL") Then
                    campo = "EXISTDETAL_ART"
                ElseIf tipo.Equals("MAYOR") Then
                    campo = "EXISTMAYOR_ART"
                End If
    
                'Si el tipo es otro la variable seguirá siendo vacío
                If campo = String.Empty Then
                    MessageBox.Show("El tipo no es ni DETAL ni MAYOR ...")
                    Exit Sub 'Salimos
                End If
    
                Dim query = String.Format("UPDATE ARTICULO SET {0} = @cant WHERE COD_ART = @cod AND STATUS_ART='A'",
                                            campo)
    
                Dim cmd As New SqlCommand(query, con)
                cmd.Parameters.AddWithValue("@cant", nuevaCant)
                cmd.Parameters.AddWithValue("@cod", codigo)
    
                cmd.ExecuteNonQuery()
                MsgBox("ACTUALIZACION OK")
    
            End Using
    
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical, "ERROR")
        End Try
    End Sub

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    viernes, 10 de marzo de 2017 0:27

Todas las respuestas

  • Hola delap95,

    ¿Cuántos tipos estás utilizando, solo 2 (DETAL y MAYOR)?

    Si te fijas bien, si el tipo no es ni 'DETAL' ni 'MAYOR' no asigna una consulta a la propiedad CommandText, pero igual ejecutará el cmd.ExecuteNonQuery ya que se encuentra fuera de las condiciones.

    ¿Porqué declaras los objetos fuera del método, deberías hacerlo directamente en el método ? Además deberías parametrizar la consulta usando la propiedad Parameters.

    Podrías hacer :

    Public Sub actualizar_existencias(codigo As String, nuevaCant As Integer, tipo As String)
        Try
            Using con As New SqlConnection("MiCadenaConexion")
    
                con.Open()
    
                'Almacenará el campo que será modificado
                Dim campo As String = String.Empty
    
                If tipo.Equals("DETAL") Then
                    campo = "EXISTDETAL_ART"
                ElseIf tipo.Equals("MAYOR") Then
                    campo = "EXISTMAYOR_ART"
                End If
    
                'Si el tipo es otro la variable seguirá siendo vacío
                If campo = String.Empty Then
                    MessageBox.Show("El tipo no es ni DETAL ni MAYOR ...")
                    Exit Sub 'Salimos
                End If
    
                Dim query = String.Format("UPDATE ARTICULO SET {0} = @cant WHERE COD_ART = @cod AND STATUS_ART='A'",
                                            campo)
    
                Dim cmd As New SqlCommand(query, con)
                cmd.Parameters.AddWithValue("@cant", nuevaCant)
                cmd.Parameters.AddWithValue("@cod", codigo)
    
                cmd.ExecuteNonQuery()
                MsgBox("ACTUALIZACION OK")
    
            End Using
    
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical, "ERROR")
        End Try
    End Sub

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    viernes, 10 de marzo de 2017 0:27
  • hola Joel C. Naupa Crispín,

    gracias por resonder y por la corrección ahora si me corre,  los objetos los tenia fuera porque los uso en otros métodos tambien. sin embargo tengo otro problemita ahora ese metodo de actualizar_existencias lo uso en un FOR EACH que me recorre un datagridview pero si en ese datagrid hay varios articulos ejemplo: caja de lapiz, cantidad 3, caja de lapicero, cantidad 5 y en mi DB hay 10 cajas de lapiz y 15 caja de lapiceros me deberia actualizar a caja de lapiz 7 y caja de lapiceros 10 pero me guarda en ambas el mismo valor es decir, caja de lapiz cantidad 7, caja de lapicero 7 

    este es e codigo del botton que hace la actualizacion:

    Private Sub btnGuardarFact_Click(sender As Object, e As EventArgs) Handles btnGuardarFact.Click If Not TypeOf cmbCodigo.SelectedValue Is DataRowView Then Dim fila As DataRowView = DirectCast(cmbCodigo.SelectedItem, DataRowView) If txtRIF.Text = "" Or txtCliente.Text = "" Or dateFecha.Value > Date.Now Or cmbTipoCompra.Text = "Seleccionar..." Or txtPorcenDescuento.Text = "" Or txtPorcenIVA.Text = "" Then MsgBox("Rellene Todos Los Campos y/ó Fecha De Factura Mayor A La Actual", MsgBoxStyle.Information, "INFORMACION") Else guardar_factVenta() guardar_detVenta() ' ACTUALIZA EN LA BD LA CANTIDAD REAL DE ARTICULOS DISPONIBLES' Dim cantidad As New Integer Dim filadgw As DataGridViewRow For Each filadgw In dgwLista.Rows If cmbTipoCompra.Text = "DETAL" Then cantidad = fila.Item("EXISTDETAL_ART") - filadgw.Cells("Cantidad").Value actualizar_existencias(filadgw.Cells("Codigo").Value, cantidad, cmbTipoCompra.Text) ElseIf cmbTipoCompra.Text = "MAYOR" Then cantidad = fila.Item("EXISTMAYOR_ART") - filadgw.Cells("Cantidad").Value actualizar_existencias(filadgw.Cells("Codigo").Value, cantidad, cmbTipoCompra.Text) End If Next MsgBox("Actualizacion Realizada con Exito", MsgBoxStyle.Information, "INFORMACION") limpiar() txtNroFactura.Text += 1 End If End If

    end sub


    sábado, 11 de marzo de 2017 3:56