error al insertar en la base de datos

Iniciado por andaluz, 25 Mayo 2012, 16:53 PM

0 Miembros y 1 Visitante están viendo este tema.

andaluz

Hola a todos, tengo un error al insertar en la base de datos, el cual me dice "Error no especificado" y la verdad es que no consigo encontrar el fallo, os pongo el código para ver si me pueden ayudar
Código (vbnet) [Seleccionar]

Private Sub btn_Insertar_Ventas_Clientes_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Insertar_Ventas_Clientes.Click
       Dim id_marc, id_emp, id_cli As Integer

       ' compruebo que ninguno de los datos de venta a cliente esta vacio
       If cbb_Venta_Client_Insertar.Text = "" Or cbb_Nomb_Emp_Vent_Insertar.Text = "" Or
           cbb_Apel_Emp_Vent_Insertar.Text = "" Or cbb_Marca_Artic_Vent_Insertar.Text = "" Or
           cbb_Articulo_Artic_Vent_Insertar.Text = "" Or cbb_Nomb_Client_Vent_Insertar.Text = "" Or
           cbb_Apel_Client_Vent_Insertar.Text = "" Then
           MessageBox.Show("Alguno/s de los datos del articulo esta vacio, rellenelo", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error)
           Exit Sub
       End If

       ' consulta para asignar el Id_Marca eligiendo el nombre del proveedor a la tabla modelos
       Dim dtadapterMarca As OleDbDataAdapter = New OleDbDataAdapter("SELECT Id_Marca FROM Marcas WHERE Marcas.Marca='" & cbb_Marca_Artic_Vent_Insertar.Text & "'", conexion_access)
       Dim dtsMarca As New DataSet
       dtadapterMarca.Fill(dtsMarca, "Marcas")
       For Each Fila As DataRow In dtsMarca.Tables("Marcas").Rows
           id_marc = Fila("Id_Marca")
       Next
       
       ' consulta para asignar el Id_empleado eligiendo el empleado
       'Dim id_emp As Integer
       Dim dtadapterEmpleado As OleDbDataAdapter = New OleDbDataAdapter("SELECT Empleados.Id_Empleado FROM Empleados WHERE Empleados.Nombre='" & cbb_Nomb_Emp_Compra.Text & "' AND Empleados.Apellidos='" & cbb_Apel_Emp_Vent_Insertar.Text & "'", conexion_access)
       Dim dtsEmpleado As New DataSet

       dtadapterEmpleado.Fill(dtsEmpleado, "Empleados")
       For Each Fila As DataRow In dtsEmpleado.Tables("Empleados").Rows
           id_emp = Fila("Id_Empleado")
       Next
       
       ' consulta para asignar el Id_cliente eligiendo el nombre del cliente a la tabla ventas
       Dim dtadapterCliente As OleDbDataAdapter = New OleDbDataAdapter("SELECT Id_Cliente FROM Clientes WHERE Clientes.Nombre='" & cbb_Nomb_Client_Vent_Insertar.Text & "' AND Clientes.Apellidos='" & cbb_Apel_Client_Vent_Insertar.Text & "'", conexion_access)
       Dim dtsCliente As New DataSet
       dtadapterCliente.Fill(dtsCliente, "Clientes")
       For Each Fila As DataRow In dtsCliente.Tables("Clientes").Rows
           id_cli = Fila("Id_Cliente")
       Next

       ' inserto los datos en la tabla ventas
       Dim CadenaSql As String = "INSERT INTO Ventas (Fecha_Venta, Pagado, Id_Stock, Id_Empleado, Id_Cliente) VALUES ('" & CDate(cbb_Venta_Client_Insertar.Text) & "'," & chk_Pagado_Venta_Insertar.Checked & "," & "(SELECT TOP 1 Stock.Id_Stock FROM Stock WHERE Stock.Id_Articulo IN (SELECT Articulos.Id_Articulos FROM Articulos WHERE Articulos.Descripcion='" & cbb_Articulo_Artic_Vent_Insertar.Text & "' AND Stock.Vendido=False))," & "(SELECT Empleados.Id_Empleado FROM Empleados WHERE Empleados.Nombre='" & cbb_Nomb_Emp_Vent_Insertar.Text & "' AND Empleados.Apellidos='" & cbb_Apel_Emp_Vent_Insertar.Text & "')," & "(SELECT Clientes.Id_Cliente FROM Clientes WHERE Clientes.Nombre='" & cbb_Nomb_Client_Vent_Insertar.Text & "' AND Clientes.Apellidos='" & cbb_Apel_Client_Vent_Insertar.Text & "'))"
     
       MsgBox(IdStock)
       MsgBox(CadenaSql)
       Dim Comando As New OleDb.OleDbCommand(CadenaSql, conexion_access)
       Comando.Connection.Open()
       Comando.ExecuteNonQuery()
       If Mensaje = "" Then
           MessageBox.Show("La venta se ha insertado correctamente.", "Informacion", MessageBoxButtons.OK, MessageBoxIcon.Information)
       Else
           MessageBox.Show("La venta se ha insertado correctamente. Debe dispensar al cliente el artículo con número de serie: " & Mensaje, "Informacion", MessageBoxButtons.OK, MessageBoxIcon.Information)
       End If

        ' ME GUSTARÍA SABER SI TENGO QUE REDIMENSIONAR LA MATRIZ
       ' redimensionamos el tamaño de la matriz
       'ReDim Preserve S_Ventas(S_Ventas.Length)

       ' para refrescar la tabla me tengo que crear 2 variables
       Dim ta_venta As New ArcoclimaDataSetTableAdapters.VentasTableAdapter
       Dim tabla_venta As New ArcoclimaDataSet.VentasDataTable

       ' refrescamos los valores de la tabla
       tabla_venta = ta_venta.GetData
       ArticulosDataGridView.DataSource = tabla_venta

       Me.Validate()
       Me.VentasBindingSource.EndEdit()
       Me.TableAdapterManager.UpdateAll(Me.ArcoclimaDataSet)

       Comando.Connection.Close()

       ' Limpio el contenido de los TextBox que he insertado en la tabla de empleados
       Limpiar_TextBox(cbb_Marca_Artic_Vent_Insertar.Text, cbb_Articulo_Artic_Vent_Insertar.Text,
                       cbb_Nomb_Emp_Vent_Insertar.Text, cbb_Apel_Emp_Vent_Insertar.Text,
                       cbb_Nomb_Client_Vent_Insertar.Text, cbb_Apel_Client_Vent_Insertar.Text)
       Exit Sub
   End Sub


El Id me lo devuelve correcto, pero no se si el error esta en la consulta o en el código, espero que me puedan ayudar,

Saludos

HdM

Buenas.

El problema creo que lo tienes en la consulta del INSERT. Dentro del VALUES, estás poniendo los valores a grabar, mediante subconsultas. Deberías poner esos valores directamente, sin consultas. De hecho, eso que haces es algo que no entiendo, ya que algunos de esos valores ya los has obtenido previamente y están asignados a las variables id_emp, id_cli.

Aparentemente estás utilizando variables, dataadapters y datasets sin obtener beneficio de ello, al contrario.  :-\

Otra cosa que no entiendo (igual me precipito) es el hecho de que tengas en diferentes combos los nombres y apellidos de clientes/empleados. ¿Por qué no meterlos en un mismo combo?

Una recurso que te vendría (creo) muy bien, sería el uso de la propiedad "itemdata" de los combos (si usas VB6, sabrás de qué hablo). Con ello conseguirías, al  momento de cargar los nombres y apellidos, poder también cargar los respectivos id, de modo que luego no tendrías que utilizar dataadapters y datasets adicionales para saber esos valores.

El problema es que esa propiedad no está presente en .NET, pero podrias implementarla de esta manera: http://support.microsoft.com/kb/311340

Bueno, espero que esta  miniparrafada te sirva de ayuda  :D.

Saludos.

- Nice to see you again -

andaluz

#2
que utilidad tiene itendata??

es que no la verdad es que no la conozco y como se utiliza???

HdM

Buenas.

Pero, ¿le has echado por lo menos un vistazo al enlace?  :huh: Ahí podrás ver (al final del mismo) cómo se crea una clase auxiliar que podrías utilizar para guardar tanto los id como nombre+apellido de clientes/empleados y cargarlos en los items de tus combos. Luego, según te interese, es cuestión de recuperar el valor de una u otra propiedad de la clase auxiliar.

Saludos.

- Nice to see you again -

andaluz

Este es otro error, os comento lo que quiero realizar y a continuación os pongo la consulta que he realizado para ello:
     - quiero que en el combo1 tengo el nombre de los clientes y quiero conseguir es el Id_Venta.
      codigo que yo he realizado:
         
Código
          "SELECT Ventas.Id_Ventas FROM Ventas WHERE Ventas.Id_Cliente IN (SELECT Clientes.Id_Cliente FROM Clientes WHERE Clientes.Nombre='" & cbb_Cod_Venta_Instalacion_ins.Text & "')"

                  El ultimo combo es el nombre del cliente

Las tablas son las siguientes:
Clientes                       Insatlaciones                    Ventas
Id_Cliente                        Id_Instalacion                   Id_Ventas
Nombre                            Descripcion                       Fecha_Venta
Apellidos                           ......                                 ..........
DNI                                  Id_Venta                          Id_Stock
.......                                 Id_Empleado                    Id_Empleado
                                                                               Id_Cliente

andaluz

el error que me da al ejecutar la aplicación me la da en esa consulta y dice lo siguiente:
      No se puede agregar o cambiar el registro porque se necesita un registro relacionado en la tabla 'Clientes'

HdM

Buenas.

Código (vbnet) [Seleccionar]
"SELECT Ventas.Id_Ventas FROM Ventas WHERE Ventas.Id_Cliente IN (SELECT Clientes.Id_Cliente FROM Clientes WHERE Clientes.Nombre='" & cbb_Cod_Venta_Instalacion_ins.Text & "')"

CitarNo se puede agregar o cambiar el registro porque se necesita un registro relacionado en la tabla 'Clientes'

¿Seguro que ese aviso te lo da con esa consulta? Tiene más pinta de dártelo al intentar insertar/actualizar una venta, con un Id_Cliente que no existe aún en la tabla Clientes (relaciones entre tablas, integridad referencial...)

Saludos.




- Nice to see you again -