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
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.
que utilidad tiene itendata??
es que no la verdad es que no la conozco y como se utiliza???
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.
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
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'
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 & "')"
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.