none
Error al insertar una venta, conflicto en base de datos - Visual Studio 2010 - SqlServer 2008 RRS feed

  • Pregunta

  • Saludos a todos. Por favor a ver si me orientan, ya revise todo parece que esta bien pero el error persiste. Les agradezco de antemano.

    Estoy queriendo guardar una venta, pero me sale el siguiente error:

    --------------------------------------------------------------------------------------------------------------------------------

    Estos son las tablas en mi Base de Datos. Como ven cada tabla tiene su campo a relacionar con los mismos tipos de datos:

    Y esta es la relación:

    domingo, 6 de diciembre de 2015 20:03

Respuestas

  • Hola Miguel OsPaCh,

    La descripción del error que menciona el mensaje es mas que claro. La relación que existe entre las tablas [Cliente] y [Venta] define reglas que cuidan la coherencia de los datos y una de las reglas es que la columna [RucDni] de la tabla [Venta] no puede tener valores que no existan en la tabla [Clientes].

    Bajo la explicación anterior, ¿te has percatado que el valor que intentas ingresar para la columna [RucDni]  de la tabla [Venta] existe en la tabla [Cliente]? . Se entiende que en el formulario de ventas tienes algún objeto como un ComboBox que te permite seleccionar sobre valores existentes, si lo dejas en un campo abierto queda claro que el usuario podría registrar valores no validados y por tal motivo - y con justa razón - obtienes el error.

    • Marcado como respuesta Miguel_Antonio domingo, 6 de diciembre de 2015 20:38
    domingo, 6 de diciembre de 2015 20:11
  • Hola Willams Morales

    Creo que en ves de utilizar el COUNT(*) debería hacerse con el IF EXISTS? Por ahi dicen que es mejor.

    ¿Tú que dices?.

    Depende, si la cantidad de registros es reducida entonces la cantidad de lecturas no presentará gran diferencia, pero en caso tengas una cantidad de registros con 4 o 5 ceros a la derecha entonces la cantidad de lecturas si presenta diferencias a favor de EXISTS. Aunque, en pruebas que hice una vez, si la columna está indexada no había diferencia en las lecturas, de todas formas parece que la segunda opción que muestro a continuación es mas performante:

    SELECT COUNT(*) FROM Cliente WHERE (RucDni = '12345678');
    SELECT CASE WHEN EXISTS(SELECT 1 FROM Cliente WHERE (Cliente = '12345678')) THEN 1 ELSE 0 END;


    domingo, 6 de diciembre de 2015 21:37

Todas las respuestas

  • Hola Miguel OsPaCh,

    La descripción del error que menciona el mensaje es mas que claro. La relación que existe entre las tablas [Cliente] y [Venta] define reglas que cuidan la coherencia de los datos y una de las reglas es que la columna [RucDni] de la tabla [Venta] no puede tener valores que no existan en la tabla [Clientes].

    Bajo la explicación anterior, ¿te has percatado que el valor que intentas ingresar para la columna [RucDni]  de la tabla [Venta] existe en la tabla [Cliente]? . Se entiende que en el formulario de ventas tienes algún objeto como un ComboBox que te permite seleccionar sobre valores existentes, si lo dejas en un campo abierto queda claro que el usuario podría registrar valores no validados y por tal motivo - y con justa razón - obtienes el error.

    • Marcado como respuesta Miguel_Antonio domingo, 6 de diciembre de 2015 20:38
    domingo, 6 de diciembre de 2015 20:11
  • Hola Willams Morales  

    Ahora entiendo lo que me explicas. Por lo tanto, la lógica sería que antes de registrar una venta, primero tengo que crear al cliente, y luego jalar esa información al formulario ventas.

    Bueno en realidad cuando jalo un cliente "existente" al form de ventas, ahí si me guarda y no me genera ningún error. Creo que siempre tendré que hacer eso.

    Gracias de nuevo y saludos.

    domingo, 6 de diciembre de 2015 20:37
  • La lógica debería ser:

    Validar la existencia del DNI/RUC ingresado, si existe entonces se persiste la venta, caso contrario se debe registrar primero al cliente y luego realizar la venta:

    Dim consultaSQL As String = "SELECT COUNT(*) FROM Cliente WHERE (RucDni = @RucDni)"
    Dim cmd As New SqlCommand(consultaSQL, cn)
    
    cmd.Parameters.AddWithValue(RucDni, strRucDni)
    
    If Integer.Parse(cmd.ExecuteScalar()) > 0 Then
    		'Existe
    		'Registrar la venta
    Else
    		'No Existe
    		'Registrar el cliente
    		'Registrar la venta
    End If





    domingo, 6 de diciembre de 2015 20:46
  • Hola Willams Morales

    Creo que en ves de utilizar el COUNT(*) debería hacerse con el IF EXISTS? Por ahi dicen que es mejor.

    ¿Tú que dices?.

    domingo, 6 de diciembre de 2015 20:59
  • Hola Willams Morales

    Creo que en ves de utilizar el COUNT(*) debería hacerse con el IF EXISTS? Por ahi dicen que es mejor.

    ¿Tú que dices?.

    Depende, si la cantidad de registros es reducida entonces la cantidad de lecturas no presentará gran diferencia, pero en caso tengas una cantidad de registros con 4 o 5 ceros a la derecha entonces la cantidad de lecturas si presenta diferencias a favor de EXISTS. Aunque, en pruebas que hice una vez, si la columna está indexada no había diferencia en las lecturas, de todas formas parece que la segunda opción que muestro a continuación es mas performante:

    SELECT COUNT(*) FROM Cliente WHERE (RucDni = '12345678');
    SELECT CASE WHEN EXISTS(SELECT 1 FROM Cliente WHERE (Cliente = '12345678')) THEN 1 ELSE 0 END;


    domingo, 6 de diciembre de 2015 21:37
  • Gracias Willams Morales  por tu ayuda.

    martes, 8 de diciembre de 2015 21:08