none
Error en consulta RRS feed

  • Pregunta

  • TEngo esta consulta de maestro detalle que me da el siguiente error.

    public static DataSet PedidoDetalle(string idCia, DateTime fecha)
            {
                using (SqlConnection cn = Conexion.Conectar("default"))
                {
                    using (SqlCommand cmd = cn.CreateCommand())
                    {
                        cmd.CommandText =
                           
    
                            "SELECT Pedidos.Venta_Id AS Id, Pedidos.Nro_Doc, Pedidos.Fecha_Doc," + 
                            " Clientes.Nombre, Pedidos.Lug_Ent_Id, EstadoServ.Descripcion" +
                            " FROM Clientes INNER JOIN Pedidos" + 
                            " ON Clientes.Cliente_Id = Pedidos.Cliente_Id INNER JOIN Pedidos_Detalle" + 
                            " ON Pedidos.Venta_Id = Pedidos_Detalle.Venta_Id INNER JOIN Personal" +
                            " ON Pedidos.Vendedor_Id = Personal.Personal_Id INNER JOIN EstadoServ" +
                            " ON Pedidos.Estado_Id = EstadoServ.Estado_Id" +
                            " WHERE Pedidos.Cia_Id=@Cia_Id AND Pedidos.Fecha_Doc=@Fecha_Doc";
    
                          
                        cmd.Parameters.AddWithValue("@Cia_Id", idCia);
                        cmd.Parameters.AddWithValue("@Fecha_Doc", fecha);
                        using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                        {
                            DataSet ds = new DataSet();
                            // Llenar DataTables en el DataSet
                            da.Fill(ds, "Pedidos");
                            cmd.CommandText =
                                
    
                                "SELECT Pedidos_Detalle.Venta_Id AS Id, Pedidos_Detalle.Producto_Id, Productos.Nombre, Pedidos_Detalle.Cantidad, Pedidos_Detalle.Imp_Uni, Pedidos_Detalle.Imp_Tot" +
                                " FROM Pedidos_Detalle INNER JOIN Productos" +
                                " ON Pedidos_Detalle.Producto_Id = Productos.Producto_Id";
    
                               
                            da.Fill(ds, "Pedidos_Detalle");
    
                            // Establecer relaciones
                            DataColumn colPadre = ds.Tables["Pedidos"].Columns["Id"];
                            DataColumn colHijo = ds.Tables["Pedidos_Detalle"].Columns["Id"];
                            DataRelation Relacion = new DataRelation("DetallePedidos", colPadre, colHijo);
                            ds.Relations.Add(Relacion); ==> Error.
    
                            //DataTable dt = new DataTable();
                            //da.Fill(dt);
                            return ds;
                        }
                    }
                }
            }

    Error: No se puede habilitar esta restricción ya que todos los valores no tienen los valores primarios correspondientes.


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú


    • Editado Pedro Ávila miércoles, 9 de abril de 2014 15:11 xxxxxxxxxxxxxxxxxx
    miércoles, 9 de abril de 2014 15:09

Respuestas

Todas las respuestas

  • Este es el plan de ejecucion


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    miércoles, 9 de abril de 2014 15:13
  • No se como solucionar este problema

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    miércoles, 9 de abril de 2014 15:13
  • Hola, ¿la query si la lanzas en la bbdd te devuelve datos o te da error?

    Si en la bbdd no te da error, ¿puede ser que la query te devuelva filas repetidas y te da error la relación porque tiene restricciones que no puede aplicar?

    Si este es el caso, "agrupa" o pon la clausula "Distinct" despues del select a ver si se soluciona.

    Espero que te sirva de ayuda.

    Saludos.



    Víctor del Valle - http://www.vrdelvalle.net

    miércoles, 9 de abril de 2014 15:22
  • deverias de probar con clases y hacerlo por procedimiento almacenando.

    tambien si puede ejecuta los query para ver que es lo que te devuelve.

    y pon una pantallazo


    juanca

    miércoles, 9 de abril de 2014 15:24
  • como hago con la fecha el servidor es en ingles

    SELECT DISTINCT Pedidos.Venta_Id, Pedidos.Nro_Doc, Pedidos.Fecha_Doc,  
    Clientes.Nombre, Pedidos.Lug_Ent_Id, EstadoServ.Descripcion
    FROM Clientes INNER JOIN Pedidos 
    ON Clientes.Cliente_Id = Pedidos.Cliente_Id INNER JOIN Pedidos_Detalle 
    ON Pedidos.Venta_Id = Pedidos_Detalle.Venta_Id INNER JOIN Personal 
    ON Pedidos.Vendedor_Id = Personal.Personal_Id INNER JOIN EstadoServ 
    ON Pedidos.Estado_Id = EstadoServ.Estado_Id
    WHERE Pedidos.Cia_Id='01' AND Pedidos.Fecha_Doc='20140407'


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    miércoles, 9 de abril de 2014 15:24
  • como hago con la fecha el servidor es en ingles

    SELECT DISTINCT Pedidos.Venta_Id, Pedidos.Nro_Doc, Pedidos.Fecha_Doc,  
    Clientes.Nombre, Pedidos.Lug_Ent_Id, EstadoServ.Descripcion
    FROM Clientes INNER JOIN Pedidos 
    ON Clientes.Cliente_Id = Pedidos.Cliente_Id INNER JOIN Pedidos_Detalle 
    ON Pedidos.Venta_Id = Pedidos_Detalle.Venta_Id INNER JOIN Personal 
    ON Pedidos.Vendedor_Id = Personal.Personal_Id INNER JOIN EstadoServ 
    ON Pedidos.Estado_Id = EstadoServ.Estado_Id
    WHERE Pedidos.Cia_Id='01' AND Pedidos.Fecha_Doc='20140407'


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    pregunta, no tendria que llevar separadores la fecha 2014-04-07 algo asi?

    y si pruebas mandar la fecha separada y luego la unes

    osea @dia, @mes, @ano 

    datepart('dd',@fecha) = @dia

    datepart('mm',@fecha) = @mes

    datepart('yyyy',@fecha) = @ano 

    SELECT DISTINCT Pedidos.Venta_Id, Pedidos.Nro_Doc, Pedidos.Fecha_Doc,  
    Clientes.Nombre, Pedidos.Lug_Ent_Id, EstadoServ.Descripcion
    FROM Clientes INNER JOIN Pedidos 
    ON Clientes.Cliente_Id = Pedidos.Cliente_Id INNER JOIN Pedidos_Detalle 
    ON Pedidos.Venta_Id = Pedidos_Detalle.Venta_Id INNER JOIN Personal 
    ON Pedidos.Vendedor_Id = Personal.Personal_Id INNER JOIN EstadoServ 
    ON Pedidos.Estado_Id = EstadoServ.Estado_Id
    WHERE Pedidos.Cia_Id='01' AND Pedidos.Fecha_Doc=@fecha


    juanca

    miércoles, 9 de abril de 2014 15:34
  • Hola.

    No sé si ya lo resolviste. La cuestión original no es de SQL Server (una consulta no falla por integridad referencial) y la cuestión de fechas, empleando el formato YYYYMMDD siempre se interpreta bien (y es lo que usas). Quizá los tipos de datos no son los que parecen y ahí esté el problema, pero no lo sabemos.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    viernes, 18 de abril de 2014 15:10
    Moderador
  • Hola Alberto.

    Así es no lo pude resolver, solo se me ocurrió una salida la cual lo hice en dos consultas.

    Maestro

    using (SqlCommand cmd = cn.CreateCommand())
                    {
                        cmd.CommandText =
                            "SELECT v.Venta_Id AS Id, v.NroDoc AS Pedido," +
                            " CONVERT(varchar(10), CAST(v.FechaIng as time), 100) AS H_Ingreso, DATEDIFF(mi, v.FechaIng, GETDATE()) AS [T Atención], c.Nombre AS Cliente, ps.Nombre AS Moso, v.PS_Id AS Mesa, e.Descripcion AS Estado" +
                            " FROM Pedidos v" +
                            " INNER JOIN Clientes c ON v.Cliente_Id = c.Cliente_Id" +
                            " INNER JOIN Personal ps ON v.Vendedor_Id = ps.Personal_Id" +
                            " INNER JOIN EstadoServ e ON v.Estado_Id = e.Estado_Id" +
                            " WHERE v.Cia_Id=@Cia_Id AND v.FechaDoc=@Fecha_Doc";
    
                        cmd.Parameters.AddWithValue("@Cia_Id", idCia);
                        cmd.Parameters.AddWithValue("@Fecha_Doc", fecha);

    Detalle

    using (SqlCommand cmd = cn.CreateCommand())
                    {
                        cmd.CommandText =
                                "SELECT vd.Venta_Id AS Id, p.Producto_Id, p.Nombre, vd.Cant, vd.Imp_Uni, vd.Imp_Tot, vd.Descripcion AS Observación" +
                                " FROM Pedidos_Detalle vd" +
                                " INNER JOIN Productos p ON vd.Producto_Id = p.Producto_Id WHERE Venta_Id = '" + idVenta + "'";
    

    Pero la primer método que posteo es como se debe hacer me asegura consistencia en los datos, pero no soy muy experto en SQL como para descartar el error por eso lo solucione de esa manera que no es la correcta para poder seguir avanzando con el proyecto.


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    viernes, 18 de abril de 2014 15:23
  • Hola.

    En ese caso, ¿lo resolviste? El error no es de SQL Server, de ahí que poco vas a poder resolver de ese lado. De todos modos, si aunque el error no sea de SQL Server, la duda sí lo es, trata de explicárnoslo y vemos si podemos ayudarte.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    viernes, 18 de abril de 2014 15:44
    Moderador