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

DB2 Discussion :

Test chevauchement Date avant insert


Sujet :

DB2

  1. #1
    Membre averti Avatar de rockley
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 404
    Points : 346
    Points
    346
    Par défaut Test chevauchement Date avant insert
    Bonjour

    J'ai un petit problème.
    J'ai un table type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CODE_PRO
    CODE_BAR
    DAT_DEBUT
    DAT_FIN
    Je voudrais mettre en place une insertion mais pour cela il faut s'assurer au préalable que les dates ne se chevauchement pas.

    Donc si on a
    DAT_DEBUT = 02-01-2000
    DAT_FIN = 04-01-2000
    En base


    On ne pourra pas insérer

    DAT_DEBUT = 01-01-2000
    DAT_FIN = 03-01-2000

    ou

    DAT_DEBUT = 03-01-2000
    DAT_FIN = 05-01-2000
    On peut donc avoir plusieurs lignes de CODE_PRO et CODE_BAR identiques avec des dat_debut et dat_fin différente.

    Pouvez-vous m'aider à faire cela proprement ?

    Merci d'avance

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    Novembre 2012
    Messages
    1 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'Etude Mainframe/AS400
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2012
    Messages : 1 767
    Points : 10 765
    Points
    10 765
    Par défaut
    Bonjour,

    Pour savoir si ta ligne à insérer est "valide" tu peux lancer la requête suivante (après selon ton index cela peut être plus ou moins couteux):
    Ligne par ligne 'de table) il contrôle que tes bornes sont cohérentes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT COUNT (*)
    FROM ...
    WHERE 
    'CODE_PRO_INSERE' = CODE_PRO
    AND
    'CODE_BAR_INSERE' = CODE_BAR
    AND 
    (('DAT_DEBUT_INSERE' > DAT_DEBUT AND 'DAT_DEBUT_INSERE' < DAT_FIN
    OR
     ('DAT_FIN_INSERE' > DAT_DEBUT AND 'DAT_FIN_INSERE' < DAT_FIN))
    AND 
    'DAT_FIN_INSERE' > 'DAT_DEBUT_INSERE'
    (Vérifier quand même ma requête) J'ai inversé valeur testée et valeur de champs.
    Si Le count est > 0 c'est que tu ne peux pas insérer ta ligne.

  3. #3
    Membre averti Avatar de rockley
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 404
    Points : 346
    Points
    346
    Par défaut
    Avant tout merci pour ta réponse Darkzinus.

    Je suis arrivé à ce résultat pour le moment.
    Je teste également qu'une date déjà inscrit n'est pas contenu dans
    ce que l'on veut insérer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    WHERE CODE_PRO= :CODE-PRO
                     AND
                     (
                      ((AFC_DAT_DEB BETWEEN :AFC-DAT-DEB AND :AFC-DAT-FIN)
                        AND
                       (AFC_DAT_FIN BETWEEN :AFC-DAT-DEB AND :AFC-DAT-FIN)
                      )
                      OR
                      ((:AFC-DAT-DEB BETWEEN AFC_DAT_DEB AND AFC_DAT_FIN)
                       OR
                       (:AFC-DAT-FIN BETWEEN AFC_DAT_DEB AND AFC_DAT_FIN)
                      )
                     )
    Mais bon voilà. Ça me semble quand me très très coûteux.
    Es-ce que ta solution pourrait s'avérer plus rapide tu penses ?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    Novembre 2012
    Messages
    1 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'Etude Mainframe/AS400
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2012
    Messages : 1 767
    Points : 10 765
    Points
    10 765
    Par défaut
    Si ton index est sur le COD_PRO, cela ne devrait pas être couteux. Enfin après tout dépend aussi de ta volumétrie au niveau du nombre d'enregistrements pour un même COD_PRO. Le test en lui-même sur les dates ne doit pas coûter grand chose.

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    pourquoi faire 2 fois le test sur les dates ?

    le test avec les OR est suffisant.

  6. #6
    Membre averti Avatar de rockley
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 404
    Points : 346
    Points
    346
    Par défaut
    C'est pas indexé sur Code_Pro malheureusement

    le test avec les or
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    OR
                      ((:AFC-DAT-DEB BETWEEN AFC_DAT_DEB AND AFC_DAT_FIN)
                       OR
                       (:AFC-DAT-FIN BETWEEN AFC_DAT_DEB AND AFC_DAT_FIN)
                      )
    Test si date_deb_Insert et date_fin_insert ne sont pas compris dans les dates déjà existant.
    Mais j'ai besoin du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ((AFC_DAT_DEB BETWEEN :AFC-DAT-DEB AND :AFC-DAT-FIN)
                        AND
                       (AFC_DAT_FIN BETWEEN :AFC-DAT-DEB AND :AFC-DAT-FIN)
                      )
    pour savoir si la plage date_deb_Insert et date_fin_insert ne couvre pas
    dat_deb et dat_fin déjà existant.

    Donc si je veux insérer 01-01-2000/04-01-2000 et que
    02-01-2000/03-01-2000 existe, mon insert marchera alors que je ne veux pas.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    Novembre 2012
    Messages
    1 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'Etude Mainframe/AS400
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2012
    Messages : 1 767
    Points : 10 765
    Points
    10 765
    Par défaut
    Le test avec les "OR" est suffisant pour gérer ce cas.

  8. #8
    Membre averti Avatar de rockley
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 404
    Points : 346
    Points
    346
    Par défaut
    Il y a une simplification. Tu as raison.

    De
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    WHERE CODE_PRO= :CODE-PRO
                     AND
                     (
                      ((AFC_DAT_DEB BETWEEN :AFC-DAT-DEB AND :AFC-DAT-FIN)
                        AND
                       (AFC_DAT_FIN BETWEEN :AFC-DAT-DEB AND :AFC-DAT-FIN)
                      )
                      OR
                      ((:AFC-DAT-DEB BETWEEN AFC_DAT_DEB AND AFC_DAT_FIN)
                       OR
                       (:AFC-DAT-FIN BETWEEN AFC_DAT_DEB AND AFC_DAT_FIN)
                      )
                     )
    On passe à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    WHERE CODE_PRO= :CODE-PRO                 
                     AND
                     (
                      (AFC_DAT_DEB BETWEEN :AFC-DAT-DEB AND :AFC-DAT-FIN)
                      OR
                      (:AFC-DAT-DEB BETWEEN AFC_DAT_DEB AND AFC_DAT_FIN)
                     )

    Avec AFC_DAT_DEB=DATE DEJA EXISTANT
    Et :AFC-DAT-DEB=DATE A INSERER

    Ce code permet de couvrir les cinq cas :
    - plage à insérer trop large
    - plage à insérer contenu dans plage déjà existante
    - plages identiques.
    - plage avec dat-deb-insert contenu dans l'existant
    - plage avec dat-fin-insert contenu dans l'existant

  9. #9
    Membre averti Avatar de rockley
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 404
    Points : 346
    Points
    346
    Par défaut
    Merci à tous pour l'aide que vous m'avez apporté.
    Je ne pense pas pouvoir plus optimiser ma requête pour le moment.
    Je le met en résolut.

  10. #10
    Membre averti Avatar de rockley
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 404
    Points : 346
    Points
    346
    Par défaut
    Peut être que si en fait.

    ça me semble pas mal non plus ça

    DAT-DEB à insérer < DAT-FIN AND DAT-FIN à insérer > DAT-DEB
    ça marche sur papier

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PDO] test d'existance avant insertion
    Par iMech dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 04/02/2015, 18h46
  2. Contrôle date avant insertion dans base de données
    Par Invité dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 24/02/2014, 18h15
  3. [9.0] Trigger pour formater des dates avant insertion
    Par Logarithmix dans le forum Requêtes
    Réponses: 1
    Dernier message: 13/05/2013, 14h22
  4. [MySQL] Format date avant insertion
    Par Darkcristal dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 30/06/2010, 10h27
  5. Réponses: 2
    Dernier message: 03/11/2009, 16h28

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