Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: andaluz en 25 Mayo 2012, 16:53 pm



Título: error al insertar en la base de datos
Publicado por: andaluz en 25 Mayo 2012, 16:53 pm
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
  1. Private Sub btn_Insertar_Ventas_Clientes_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Insertar_Ventas_Clientes.Click
  2.        Dim id_marc, id_emp, id_cli As Integer
  3.  
  4.        ' compruebo que ninguno de los datos de venta a cliente esta vacio
  5.        If cbb_Venta_Client_Insertar.Text = "" Or cbb_Nomb_Emp_Vent_Insertar.Text = "" Or
  6.            cbb_Apel_Emp_Vent_Insertar.Text = "" Or cbb_Marca_Artic_Vent_Insertar.Text = "" Or
  7.            cbb_Articulo_Artic_Vent_Insertar.Text = "" Or cbb_Nomb_Client_Vent_Insertar.Text = "" Or
  8.            cbb_Apel_Client_Vent_Insertar.Text = "" Then
  9.            MessageBox.Show("Alguno/s de los datos del articulo esta vacio, rellenelo", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error)
  10.            Exit Sub
  11.        End If
  12.  
  13.        ' consulta para asignar el Id_Marca eligiendo el nombre del proveedor a la tabla modelos
  14.        Dim dtadapterMarca As OleDbDataAdapter = New OleDbDataAdapter("SELECT Id_Marca FROM Marcas WHERE Marcas.Marca='" & cbb_Marca_Artic_Vent_Insertar.Text & "'", conexion_access)
  15.        Dim dtsMarca As New DataSet
  16.        dtadapterMarca.Fill(dtsMarca, "Marcas")
  17.        For Each Fila As DataRow In dtsMarca.Tables("Marcas").Rows
  18.            id_marc = Fila("Id_Marca")
  19.        Next
  20.  
  21.        ' consulta para asignar el Id_empleado eligiendo el empleado
  22.        'Dim id_emp As Integer
  23.        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)
  24.        Dim dtsEmpleado As New DataSet
  25.  
  26.        dtadapterEmpleado.Fill(dtsEmpleado, "Empleados")
  27.        For Each Fila As DataRow In dtsEmpleado.Tables("Empleados").Rows
  28.            id_emp = Fila("Id_Empleado")
  29.        Next
  30.  
  31.        ' consulta para asignar el Id_cliente eligiendo el nombre del cliente a la tabla ventas
  32.        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)
  33.        Dim dtsCliente As New DataSet
  34.        dtadapterCliente.Fill(dtsCliente, "Clientes")
  35.        For Each Fila As DataRow In dtsCliente.Tables("Clientes").Rows
  36.            id_cli = Fila("Id_Cliente")
  37.        Next
  38.  
  39.        ' inserto los datos en la tabla ventas
  40.        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 & "'))"
  41.  
  42.        MsgBox(IdStock)
  43.        MsgBox(CadenaSql)
  44.        Dim Comando As New OleDb.OleDbCommand(CadenaSql, conexion_access)
  45.        Comando.Connection.Open()
  46.        Comando.ExecuteNonQuery()
  47.        If Mensaje = "" Then
  48.            MessageBox.Show("La venta se ha insertado correctamente.", "Informacion", MessageBoxButtons.OK, MessageBoxIcon.Information)
  49.        Else
  50.            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)
  51.        End If
  52.  
  53.         ' ME GUSTARÍA SABER SI TENGO QUE REDIMENSIONAR LA MATRIZ
  54.        ' redimensionamos el tamaño de la matriz
  55.        'ReDim Preserve S_Ventas(S_Ventas.Length)
  56.  
  57.        ' para refrescar la tabla me tengo que crear 2 variables
  58.        Dim ta_venta As New ArcoclimaDataSetTableAdapters.VentasTableAdapter
  59.        Dim tabla_venta As New ArcoclimaDataSet.VentasDataTable
  60.  
  61.        ' refrescamos los valores de la tabla
  62.        tabla_venta = ta_venta.GetData
  63.        ArticulosDataGridView.DataSource = tabla_venta
  64.  
  65.        Me.Validate()
  66.        Me.VentasBindingSource.EndEdit()
  67.        Me.TableAdapterManager.UpdateAll(Me.ArcoclimaDataSet)
  68.  
  69.        Comando.Connection.Close()
  70.  
  71.        ' Limpio el contenido de los TextBox que he insertado en la tabla de empleados
  72.        Limpiar_TextBox(cbb_Marca_Artic_Vent_Insertar.Text, cbb_Articulo_Artic_Vent_Insertar.Text,
  73.                        cbb_Nomb_Emp_Vent_Insertar.Text, cbb_Apel_Emp_Vent_Insertar.Text,
  74.                        cbb_Nomb_Client_Vent_Insertar.Text, cbb_Apel_Client_Vent_Insertar.Text)
  75.        Exit Sub
  76.    End Sub
  77.  

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


Título: Re: error al insertar en la base de datos
Publicado por: HdM en 25 Mayo 2012, 20:50 pm
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 (http://support.microsoft.com/kb/311340)

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

Saludos.


Título: Re: error al insertar en la base de datos
Publicado por: andaluz en 25 Mayo 2012, 21:12 pm
que utilidad tiene itendata??

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


Título: Re: error al insertar en la base de datos
Publicado por: HdM en 25 Mayo 2012, 23:42 pm
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.


Título: Re: error al insertar en la base de datos
Publicado por: andaluz en 26 Mayo 2012, 11:00 am
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


Título: Re: error al insertar en la base de datos
Publicado por: andaluz en 26 Mayo 2012, 11:17 am
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'


Título: Re: error al insertar en la base de datos
Publicado por: HdM en 26 Mayo 2012, 16:09 pm
Buenas.

Código
  1. "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 & "')"

Citar
  No 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.