Forum Programmation.autre SQL update et select.

Posté par  .
Étiquettes : aucune
0
12
oct.
2005
Hello forum !
Voilà mon problème du jour :
j'ai une table dans laquelle j'ai deux champs : une date et une observation.
Cette table est liée à d'autres tables, mais là n'est pas le propos. Ce qu'il faut savoir, c'est que lors de l'ajout d'un enregistrement dans l'une des tables liées à celle-ci, toutes les dates qui m'intéressent sont automatiquement insérées dans cette table. Un petit schéma éclaircira ça :
Une table agent, et lorsqu'on y ajoute un enregistrement, la table pointage est automatiquement nourrie avec tous les jours pour lesquels cet agent est susceptible de pointer. Jusque là, rien d'exceptionnel.
Là où je veux en venir, c'est qu'un agent peut renseigner toute une période de congés, par exemple. Dans l'application associée à cette base de données, il saisit la date de début et la date de fin de la période. Ca se traduit par un "update pointage set observation = 'Congé' where date_pointage between [date_deb] and [date_fin];".
Jusque là, tout va bien.
Ce que je voudrais obtenir, maintenant, c'est le pendant de cet update : savoir d'après la table pointage les périodes (date de début et de fin, donc) renseignées comme période de congé. Et là, je sèche. Alors si une bonne âme a une solution à ce problème, je suis preneur.
Pour information, c'est une base qui tourne sous postgreSQL v8, et comme j'en suis le DBA, j'ai toute latitude pour ajouter ce que je veux à mes bases (types, opérateurs, fonctions, langages, etc).
Merci de votre attention, en espérant avoir été assez clair.
  • # hmmm

    Posté par  . Évalué à 3.

    select min(date_pointage) d1, max(date_pointage) d2
    from pointage
    where
    agent = [num]
    observation = 'Congé' and
    not exists (select * from pointage where observation <> 'Congé' and date_pointage between d1 and d2)

    je n'ai pas testé et j'ai un doute sur le d1 et d2 de la fin mais si ca passe pourquoi pas.

    Dam
    • [^] # Re: hmmm

      Posté par  . Évalué à 2.

      Dommage, l'idée me plaisait bien, mais ça ne fonctionne pas avec postgreSQL.
      Pour clarifier la situation, et expliquer la structure de la table incriminée, voici un exemple :

      Dans ma table ne figurent pour chaque agent que chaque jour considéré comme ouvré. Comprendre par là que ça court du lundi au samedi matin inclus.
      Donc, je peux très bien avoir ce cas de figure :

      01/09/2005 ; 'Aucune'
      02/09/2005 ; 'Aucune'
      03/09/2005 ; 'Aucune'
      05/09/2005 ; 'Congé'
      06/09/2005 ; 'Congé'
      ....
      26/09/2005 ; 'Congé'
      27/09/2005 ; 'Aucune'
      .....
      24/12/2005' ; 'Aucune'
      26/12/2005' ; 'Congé'
      ...
      03/01/2006 ; 'Congé'
      04/01/2006 ; 'Aucune'.

      Les ... remplacent des dates pour lesquelles les observations sont les mêmes que celle qui suivent ou précèdent.
      Je voudrais récupérer :
      05/09/2005 à 26/09/2005 -> Congé
      26/12/2005 à 03/01/2006 -> Congé.
      Le reste m'importe peu (encore que si on peut faire l'un, on peut faire l'autre).
      Voilà, j'espère que c'est plus clair.
      Et puis, surtout merci de t'intéresser à mon problème !
    • [^] # Re: hmmm

      Posté par  . Évalué à 2.

      Il me smeble qu'il faille faire un alias de table dans ce cas présent:

      SELECT MIN(D1.date_pointage), MAX(D2.date_pointage)
      FROM pointage D1, pointage D2
      WHERE
      agent = numAgent
      AND
      observation = Congé
      AND
      NOT EXISTS (SELECT * from pointage where observation <> 'Congé' and date_pointage between d1 and d2);

      bloub° bloub°

      dabowl_75

  • # un debut de quelque chose

    Posté par  . Évalué à 2.

    Bon c'est testé sur de l'oracle
    il y a une vue p (pour que les rownum soit cohérant avec le temps)

    create view p as select * from pointage order by date_pointage;

    select * from
    (select rownum id, p.*
    from p) t1,
    (select rownum id, p.*
    from p) t2,
    (select rownum id, p.*
    from p) t3
    where t1.id = t2.id(+)-1 and t1.id = t3.id(+) + 1 AND (t1.observation <> t2.observation or t1.observation <> t3.observation) and t1.observation = 'Congés';

    Avec ça tu as une ligne pour un début de congés, unligne pour une find e congé, un ligen pour un début de congés ...

    le probleme se pose si on commence par un congé mais sinon ca passe :)

    Dam

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.