IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Firebird Discussion :

Rechercher les périodes non incluses dans une table


Sujet :

SQL Firebird

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut Rechercher les périodes non incluses dans une table
    Bonjour à tous,

    J'ai une table "PERIODE" pour géré les maintenances véhicules par période
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE PERIODE
    (
     
      DATD Date NOT NULL,
      DATF Date NOT NULL,
      DES Varchar(255) CHARACTER SET ISO8859_1,
      PRIMARY KEY (DATD,DATF)
    );
    et je voudrais pouvoir rechercher les périodes non incluses dans la table jusqu’à à une date précise.
    exple:

    datd=01/01/2021 datf=03/01/2021
    datd=05/01/2021 datf=05/01/2021
    datd=08/01/2021 datf=10/01/2021

    ici les périodes
    datd=04/01/2021 datf=04/01/2021
    et
    datd=06/01/2021 datf=07/01/2021

    ne sont pas incluses.

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Faites une recherche sur les CTE récursives, il est hors de question que je vous donne la solution tout de suite
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut
    bonjour,

    Je suis arrivé à trouver un code qui marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    WITH RECURSIVE date_range AS (
        SELECT date'2019-01-03' dateval
        FROM rdb$database
        UNION ALL 
        SELECT dateval + 1
        FROM date_range
        WHERE dateval < date'2019-01-09'
    )
    SELECT *
    FROM date_range
    par contre si je le met dans ma procédure il signale des erreurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    CREATE PROCEDURE DATDISP
     (DAD DATE,DAF DATE) 
    RETURNS 
     ( DATDIS DATE )
    AS 
    declare variable DATE1 date;
    BEGIN
    WITH RECURSIVE dates AS (
        SELECT DAD  date1  
        FROM rdb$database
        UNION ALL 
        SELECT date1 + 1
        FROM dates
        WHERE date1 < DAF 
    )
    SELECT * FROM dates;  ///token unkown
    suspend;
     
    END

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Je suis arrivé à trouver un code qui marche
    mais l'avez vous compris ?
    si je le met dans ma procédure il signale des erreurs
    Parce qu'il vous manque une boucle FOR et un INTO. Revoyez votre copie
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut
    mais l'avez vous compris ?
    , evidement je l'ai compris, il donne une plage de date selon les conditions
    Parce qu'il vous manque une boucle FOR et un INTO
    LA J'AI PAS COMPRIS.

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    LA J'AI PAS COMPRIS.
    Pourtant, il y a peu vous avez utilisé ces mêmes boucles FOR...INTO ici et
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut
    Bonjour,

    Franchement, je ne sais pas ou introduire la boucle for , puisque mon but est de récupérer la plage de date selon les paramètres ('DAD,'DAF')

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Pour le FOR INTO, je répondais à cette question
    par contre si je le met dans ma procédure il signale des erreurs
    et la solution était
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    CREATE PROCEDURE DATDISP
     (DAD DATE,DAF DATE) 
    RETURNS 
     ( DATDIS DATE )
    AS 
    declare variable DATE1 date;
    BEGIN
    FOR WITH RECURSIVE dates AS (
        SELECT DAD  date1  
        FROM rdb$database
        UNION ALL 
        SELECT date1 + 1
        FROM dates
        WHERE date1 < DAF 
    )
    SELECT * FROM dates DO suspend;
     
    END
    evidement je l'ai compris, il donne une plage de date selon les conditions
    non, sinon vous auriez peut-être pu répondre en partie à la question principale, en incluant dans la requête récursive la table PERIODE
    la plage de date selon les paramètres ('DAD,'DAF')
    une dernière remarque, je doute de la structure de votre table PERIODE
    J'ai une table "PERIODE" pour gérer les maintenances véhicules par période
    Et il n'y a nulle part indication du véhicule ! ça craint votre description a certainement été trop simplifiée !
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  9. #9
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut
    bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    CREATE PROCEDURE DATDISP
     (DAD DATE,DAF DATE) 
    RETURNS 
     ( DATDIS DATE )
    AS 
    declare variable DATE1 date;
    BEGIN
    FOR WITH RECURSIVE dates AS (
        SELECT DAD  date1  
        FROM rdb$database
        UNION ALL 
        SELECT date1 + 1
        FROM dates
        WHERE date1 < DAF 
    )
    SELECT date1 FROM dates DO  suspend;//unkown suspend
     
    END
    Il signale erreur "unkown suspend"

    par contre comme ça il marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    CREATE PROCEDURE DATDISP
     (DAD DATE,DAF DATE) 
    RETURNS 
     ( DATDIS DATE )
    AS 
    declare variable DATE1 date;
    BEGIN
    FOR WITH RECURSIVE dates AS (
        SELECT DAD  date1  
        FROM rdb$database
        UNION ALL 
        SELECT date1 + 1
        FROM dates
        WHERE date1 < DAF 
    )
    SELECT date1 FROM dates into :datdis do suspend;
     
    END
    Par contre mon problème n'est pas résolu. En effet comment intégrer les véhicules et les réservations dans la structure?

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par chekkal Voir le message
    Il signale erreur "unkown suspend"
    C'est ma faute mais je n'en suis absolument pas désolé. La seule chose que je regrette c'est d'avoir copié votre code et de m'être uniquement focalisé sur la boucle (FOR INTO).

    En effet comment intégrer les véhicules et les réservations
    Citation Envoyé par SergioMaster
    Dans la description de votre table, il n'y a nulle part indication du véhicule !
    de maintenance on passe à réservation
    Il y en a marre, je parierai que la table ne se nomme pas réellement PERIODE. Je crois qu'aucun DBA n'aurait créé une table ainsi (perso j'aurai mis seulement une date de début et un nombre de jours)
    Quant à la clé primaire

    Donnez de bonnes informations en une fois (script de création de table, jeux d'essai inclus) ou je passe mon tour et ne réponds plus à vos sollicitations
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  11. #11
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut
    bonjour,
    de maintenance on passe à réservation
    c'est pourtant bien expliqué, "période disponible pour faire une réservation". Pour l'Histoire c'est une entreprise de maintenance véhicule, et les gérants de la boite veulent avoir un fichier réservations, ainsi un nouveau client peut avoir une date pour la maintenance de son véhicule.

  12. #12
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Vous me fatiguez avec vos atermoiements et votre peu d'implication personnelle (pas de code vraiment personnel), et ce n'est pas en pompant un code qui fonctionne comme dans le post #3 que vous montrez celle-ci

    Voilà une version Firebird 3* avec ce qu'il faut pour tester
    * Oui, vous n'aviez pas indiqué de version non plus


    comme vous n'avez indiqué aucune notion de véhicule j'ai condidéré que l'entreprise ne traitait qu'un seul véhicule à la fois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    CREATE TABLE PERIODE
    (
      ID bigint GENERATED BY DEFAULT AS IDENTITY  NOT NULL,
      DATD date NOT NULL,
      JOURS integer DEFAULT 1,
      CONSTRAINT INTEG_81 PRIMARY KEY (ID)
    );
    COMMIT;
    INSERT INTO PERIODE (DATD, JOURS) VALUES ('01.01.2021', '2');
    INSERT INTO PERIODE (DATD, JOURS) VALUES ('05.01.2021', '0');
    INSERT INTO PERIODE (DATD, JOURS) VALUES ('08.01.2021', '2');
    COMMIT;
     
    SET TERM ^ ;
    CREATE PROCEDURE JOURSDISPO (
        FROMDATE date,
        TODATE date )
    RETURNS (
        DISPODATE date )
     
    AS
    DECLARE VARIABLE N INTEGER;
    BEGIN
    FOR WITH RECURSIVE dates AS (
        SELECT :FROMDATE  date1  
        FROM rdb$database
        UNION ALL 
        SELECT date1 + 1
        FROM dates 
        WHERE date1 < :TODATE 
    ) 
    SELECT Date1 FROM Dates into :DISPODATE 
    DO BEGIN
      SELECT COUNT(1) FROM PERIODE P WHERE :DISPODATE BETWEEN P.DATD AND dateadd(P.JOURS DAY TO P.DATD)  INTO :N;
      IF ((N=0) AND (EXTRACT(WEEKDAY FROM :DISPODATE)<5)) -- vendredi/samedi chomés
       THEN SUSPEND;  
    END
    END
    ^
    SET TERM ; ^
    COMMIT;
    SELECT p.DISPODATE,EXTRACT(WEEKDAY FROM p.DISPODATE)
    FROM JOURSDISPO ('01.01.2021', '20.01.2021') p;
    je reste persuadé que l'on peut faire mieux au sein de la requête récursive mais faut pas pousser

    résultats
    DISPODATE EXTRACT
    04.01.2021 1
    06.01.2021 3
    07.01.2021 4
    11.01.2021 1
    12.01.2021 2
    13.01.2021 3
    14.01.2021 4
    17.01.2021 0
    18.01.2021 1
    19.01.2021 2
    20.01.2021 3
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  13. #13
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut
    Bonjour,

    j'ai fait un test avec votre code, il me signale erreurNom : Sans titre.png
Affichages : 118
Taille : 41,6 Ko,

    En plus , ma table est structurée sur "date départ" et "date fin", aussi l'entreprise peut avoir plusieurs véhicule à la fois. Pour dépanner j'ai construit ce code avec delphi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    while datedepart<=datefin do
    begin
            requette='select datedepart,datefin from periode c where (not datedepart between c.datedepart and datefin)'
           tab[i]:=datedepart;////tableau de date disponbile
           datedepart:=datedepart+1; 
    end;
    je récupère les date disponibles.

  14. #14
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par chekkal Voir le message
    j'ai fait un test avec votre code, il me signale erreur
    ce n'est pas mon code dans l'image
    En plus , ma table est structurée sur "date départ" et "date fin",
    Que votre table soit structuré différement c'est votre problème pas le mien, et franchement il est facilement adaptable

    aussi l'entreprise peut avoir plusieurs véhicule à la fois.
    nulle part dans la description de table vous n'avez indiqué de notion de véhicule

    Pour dépanner j'ai construit ce code avec delphi
    Dans ce code non plus il n'y a pas de notion de véhicule.
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  15. #15
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    ce n'est pas mon code dans l'image
    enfin je pense c'est en partie le mien puisque le problème vient du commentaire.
    Vous n'avez pas été capable de comprendre le message d'erreur "malformed string" ! Un indice chomés contient un accent

    aussi l'entreprise peut avoir plusieurs véhicule à la fois.
    Je pense que vous voulez plutôt parler de quelque chose comme des bancs de tests ou d'ateliers de réparation et par périodes des sortes de rendez-vous.
    Tout concepteur de base de données verra facilement où mettre une colonne supplémentaire. Colonne qu'il faudra rapporter dans la procédure proposée
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

Discussions similaires

  1. recherche de valeur non présentes dans une autre table
    Par omelhor dans le forum Requêtes
    Réponses: 2
    Dernier message: 16/02/2015, 10h51
  2. Réponses: 2
    Dernier message: 24/06/2014, 08h52
  3. Réponses: 5
    Dernier message: 28/05/2012, 15h53
  4. [AC-2007] Comment rechercher les objets non utilisés dans une application
    Par Triton972 dans le forum VBA Access
    Réponses: 1
    Dernier message: 14/12/2011, 05h45
  5. recherche de champ vide ou non vide dans une table
    Par milan dans le forum Requêtes
    Réponses: 4
    Dernier message: 22/07/2008, 10h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo