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 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
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. "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 & "')"
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.
|