none
Como obtener facturas que no tengan guias RRS feed

  • Pregunta

  • Hola



    Las dos tablas del medio son de Factura y las dos tablas de la derecha son de Guias, el dato interesante es que en Guia tengo un campo nume_fact es de tipo integer eso quiere decir que no acepta nulos, ahi ya me descuadro, ¿como podría hacer la consulta para saber que facturas no tienen guias?

    Saludos!




    domingo, 10 de junio de 2018 17:25

Respuestas

  • Hola Julian:

    Si se eliminan o no, supongo que solo depende, de si el software lo permite o no.

    Si te aparecen guias sin factura, yo diría que sí. sino será otro motivo.

    Para saber si se eliminan puedes usar un trigger, que lo registre.

    En cuanto a la integridad te pongo un ejemplo de como puede ser para esas tablas.

    /* creo la tabla de cabecera con la clave primaria, mas una columna */
    
    CREATE TABLE vetbcabefact
    (codi_empr      INT,
     codi_bode      INT,
     nume_Fact      INT,
     tipo_conc_fact INT,
     nume_pedi      INT,
     PRIMARY KEY(codi_empr, codi_bode, nume_fact, tipo_conc_fact)
    );
    GO
    
    /* creo la otra tabla del mismo modo */
    
    CREATE TABLE vetbguiapedi
    (codi_empr      INT,
     codi_bode      INT,
     nume_Fact      INT,
     tipo_conc_fact INT,
     nume_guia      INT,
     cons_a         INT,
     PRIMARY KEY(codi_empr, codi_bode, nume_fact, tipo_conc_fact, nume_guia)
    );
    GO
    
    /* modifico la definicion de la tabla para incluir la foreign key */
    
    ALTER TABLE vetbguiapedi
    ADD CONSTRAINT fk_ejemplo FOREIGN KEY(codi_empr, codi_bode, nume_fact, tipo_conc_fact) REFERENCES vetbcabefact(codi_empr,
                                                                                                                   codi_bode,
                                                                                                                   nume_fact,
                                                                                                                   tipo_conc_fact) ON UPDATE CASCADE 
    
    /*le indico que si la cabecera de factura se modifica un registro identificado por su clave, todos los registros de 
    esta otra tabla, tambien se ven modificados automaticamente */
    
        ON DELETE CASCADE; 
    
    /* le indico que si borra la cabecera, todos los registros se verán borrados */
    
    GO
    INSERT INTO vetbcabefact
    (codi_empr,
     codi_bode,
     nume_Fact,
     tipo_conc_fact,
     nume_pedi
    )
    VALUES
    (1, 1, 1, 1, 1),
    (2, 1, 1, 1, 1),
    (3, 1, 1, 1, 1); 
    
    /*inserto 3 registros de ejemplo */
    
    GO
    INSERT INTO vetbguiapedi
    (codi_empr,
     codi_bode,
     nume_Fact,
     tipo_conc_fact,
     nume_guia,
     cons_a
    )
    VALUES
    (1, 1, 1, 1, 1, 1),
    (2, 1, 1, 1, 1, 1),
    (3, 1, 1, 1, 1, 1); 
    
    /*lo mismo para la otra tabla */
    
    GO
    DELETE FROM vetbcabefact
    WHERE codi_empr = 1
          AND codi_bode = 1
          AND nume_Fact = 1
          AND tipo_conc_Fact = 1; 
    
    /*borro un registro*/
    
    GO
    SELECT COUNT(*)
    FROM vetbcabefact;
    SELECT COUNT(*)
    FROM vetbguiapedi; 
    
    /* la integridad referencial ha borrado el registro*/
    
    /*ahora modificamos*/
    
    UPDATE vetbcabefact
      SET
          codi_empr = 8
    WHERE codi_empr = 2
          AND codi_bode = 1
          AND nume_Fact = 1
          AND tipo_conc_Fact = 1;
    SELECT *
    FROM vetbcabefact;
    SELECT *
    FROM vetbguiapedi;
    

    Un saludo

    • Marcado como respuesta JulianSanchez domingo, 10 de junio de 2018 22:46
    domingo, 10 de junio de 2018 17:55
  • Si te refieres, a que la integridad referencial no permite facturas sin guias, no es correcto.

    Si te refieres a que en tu lógica de negocio, no puede exisitr una factura sin una guia, entonces, lo que debes de hacer es insertar la factura y la guia en la misma transaccion, a través de un procedimiento almacenado.

    Un saludo

    • Marcado como respuesta JulianSanchez domingo, 10 de junio de 2018 22:46
    domingo, 10 de junio de 2018 19:20

Todas las respuestas

  • Hola JulianSanchez:

    En principio si no tienes integridad referencial sobre esas tablas, y borras una factura el registro de la otra persiste. Es una manera.

    SELECT * FROM vetbguiapedi 
    where nume_fact not in
     (Select nume_fact from vetbcabefact)

    Con IN te devuelve un subconjunto de las cabeceras de factura. Solo tienes que preguntarle cualquier vetbguiapedi que no este en ese subconjunto.

    Lo mismo para la otra tabla.

    Un saludo

    domingo, 10 de junio de 2018 17:33
  • Hola JaviA que se debe en el diagrama que al momento que las puse ahí  ¿no muestre la relación si están unidad por una llave primaria compuesta?

    En principio si no tienes integridad referencial sobre esas tablas, y borras una factura el registro de la otra persiste. Es una manera.

    Entiendo que si no tiene la relación al borrar la cabecera se va a quedar el registro del detalle perteneciente a ese registro de cabecera que se eliminino. ¿Pero una factura o guia se elimina?

    Claro que definitivamente le faltan las relaciones, para obtener integridad referencial.

    Saludos!



    domingo, 10 de junio de 2018 17:39
  • Hola Julian:

    Si se eliminan o no, supongo que solo depende, de si el software lo permite o no.

    Si te aparecen guias sin factura, yo diría que sí. sino será otro motivo.

    Para saber si se eliminan puedes usar un trigger, que lo registre.

    En cuanto a la integridad te pongo un ejemplo de como puede ser para esas tablas.

    /* creo la tabla de cabecera con la clave primaria, mas una columna */
    
    CREATE TABLE vetbcabefact
    (codi_empr      INT,
     codi_bode      INT,
     nume_Fact      INT,
     tipo_conc_fact INT,
     nume_pedi      INT,
     PRIMARY KEY(codi_empr, codi_bode, nume_fact, tipo_conc_fact)
    );
    GO
    
    /* creo la otra tabla del mismo modo */
    
    CREATE TABLE vetbguiapedi
    (codi_empr      INT,
     codi_bode      INT,
     nume_Fact      INT,
     tipo_conc_fact INT,
     nume_guia      INT,
     cons_a         INT,
     PRIMARY KEY(codi_empr, codi_bode, nume_fact, tipo_conc_fact, nume_guia)
    );
    GO
    
    /* modifico la definicion de la tabla para incluir la foreign key */
    
    ALTER TABLE vetbguiapedi
    ADD CONSTRAINT fk_ejemplo FOREIGN KEY(codi_empr, codi_bode, nume_fact, tipo_conc_fact) REFERENCES vetbcabefact(codi_empr,
                                                                                                                   codi_bode,
                                                                                                                   nume_fact,
                                                                                                                   tipo_conc_fact) ON UPDATE CASCADE 
    
    /*le indico que si la cabecera de factura se modifica un registro identificado por su clave, todos los registros de 
    esta otra tabla, tambien se ven modificados automaticamente */
    
        ON DELETE CASCADE; 
    
    /* le indico que si borra la cabecera, todos los registros se verán borrados */
    
    GO
    INSERT INTO vetbcabefact
    (codi_empr,
     codi_bode,
     nume_Fact,
     tipo_conc_fact,
     nume_pedi
    )
    VALUES
    (1, 1, 1, 1, 1),
    (2, 1, 1, 1, 1),
    (3, 1, 1, 1, 1); 
    
    /*inserto 3 registros de ejemplo */
    
    GO
    INSERT INTO vetbguiapedi
    (codi_empr,
     codi_bode,
     nume_Fact,
     tipo_conc_fact,
     nume_guia,
     cons_a
    )
    VALUES
    (1, 1, 1, 1, 1, 1),
    (2, 1, 1, 1, 1, 1),
    (3, 1, 1, 1, 1, 1); 
    
    /*lo mismo para la otra tabla */
    
    GO
    DELETE FROM vetbcabefact
    WHERE codi_empr = 1
          AND codi_bode = 1
          AND nume_Fact = 1
          AND tipo_conc_Fact = 1; 
    
    /*borro un registro*/
    
    GO
    SELECT COUNT(*)
    FROM vetbcabefact;
    SELECT COUNT(*)
    FROM vetbguiapedi; 
    
    /* la integridad referencial ha borrado el registro*/
    
    /*ahora modificamos*/
    
    UPDATE vetbcabefact
      SET
          codi_empr = 8
    WHERE codi_empr = 2
          AND codi_bode = 1
          AND nume_Fact = 1
          AND tipo_conc_Fact = 1;
    SELECT *
    FROM vetbcabefact;
    SELECT *
    FROM vetbguiapedi;
    

    Un saludo

    • Marcado como respuesta JulianSanchez domingo, 10 de junio de 2018 22:46
    domingo, 10 de junio de 2018 17:55
  • Hola

    Si te aparecen guias sin factura, yo diría que sí. sino será otro motivo.

    ¿No puede ser Facturas sin Guías?

    Saludos!

    domingo, 10 de junio de 2018 18:12
  • Si te refieres, a que la integridad referencial no permite facturas sin guias, no es correcto.

    Si te refieres a que en tu lógica de negocio, no puede exisitr una factura sin una guia, entonces, lo que debes de hacer es insertar la factura y la guia en la misma transaccion, a través de un procedimiento almacenado.

    Un saludo

    • Marcado como respuesta JulianSanchez domingo, 10 de junio de 2018 22:46
    domingo, 10 de junio de 2018 19:20