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

Designer Discussion :

Comment récupérer la version la plus récente?


Sujet :

Designer

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Comment récupérer la version la plus récente?
    Bonjour a tous,

    Je suis actuellement sur un projet BI, et je bloque sur un problème qui parait simple mais vraiment la je n'y arrive pas...

    Je vais essayer de faire simple:
    J'ai une table RESERVATION dans laquelle j'ai un identifiant TRANS_ID, un RES_ID, une DATE_OUVERTURE et un STATUT de réservation.

    Le TRANS_ID correspond à ma clé primaire il permet de différencier une réservation à 2 instants différents, la date d'ouverture est la date de la version de la reservation.
    Exemple :

    TRANS_ID | RES_ID | DATE_OUVERTURE | STATUT
    1 | 1 | 01/01/2011 | BK
    2 | 1 | 02/01/2011 | CL
    3 | 1 | 03/01/2011 | CT
    4 | 2 | 02/01/2011 | BK
    5 | 2 | 04/01/2011 | CL


    Mon problème est le suivant, je voudrai que quand des utilisateurs font une requete sous Webi en prenant une plage de date ex : entre 15/12/2010 et 02/01/2011 les réservations résultantes soit automatiquement et seulement :
    2 | 1 | 02/01/2011 | CL
    4 | 2 | 02/01/2011 | BK

    soit la version la plus récente d'une réservation sur la plage de temps donnée.


    J'ai tenté de passer par une table dérivé avec la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT T1.RES_ID, T1.DATE_OUVERTURE, T1.TRANS_ID , T1.STATUT
    FROM RESERVATION T1
     
    INNER JOIN 
     
    (SELECT T2.RES_ID, MAX(T2.DATE_OUVERTURE) AS DATE_MAX 
    FROM RESERVATION T2 
    GROUP BY T2.RES_ID) T3
     
    ON (T1.RES_ID=T3.RES_ID) AND (T1.DATE_OUVERTURE=T3.DATE_MAX)


    Mais lorsque la plage de temps ne comprend pas la DATE_OUVERTURE maximum, je n'obtiens aucun résultat.

    J'ai aussi tenté un @Prompt ou un @Variable mais rien de satisfaisant (peut-être que je m'y suis mal pris)

    J'avoue être à court d'idée, c'est pourquoi je demande un peu de votre aide.
    Merci d'avance pour ceux qui essaieront.

    Je sais que je n'ai pas été actif depuis mon inscription mais je compte corriger ca, désolé...

  2. #2
    Membre expérimenté
    Avatar de Julien59
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    1 142
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 142
    Points : 1 458
    Points
    1 458
    Par défaut
    Bonjour,

    Pour t'aider, je vais avoir besoin de ton SGBD.
    En espérant que tu ne sois pas sous Access

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Oracle 10g
    J'aurai du le préciser avant en effet.

    Merci de t'interesser à mon problème.

  4. #4
    Membre expérimenté
    Avatar de Julien59
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    1 142
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 142
    Points : 1 458
    Points
    1 458
    Par défaut
    Je vais pouvoir t'aider alors
    Tu vas pouvoir t'en sortir en utilisant la fonction Rank().
    Ton idée était la bonne, mais je pense que tu n'arrivais tout simplement pas à la mettre en place.
    Pour résoudre le problème :
    Tu crées une table dérivée qui te ramène les lignes filtrées avec la fourchette de date souhaitée par l'utilisateur (@prompt()). Ensuite, on va faire un classement par id de réservation en fonction de la date. Ce qui donne la table dérivée suivante (je l'appelle TD_RESA) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT 
    RES_ID,
    RANK() OVER (PARTITION BY RES_ID ORDER BY DATE_OUVERTURE DESC) AS  "CLASSEMENT_DATE" ,
    FROM
    RESERVATION
    WHERE
    DATE_OUVERTURE between @prompt('date de début','D',,mono,free,) and @prompt('date de fin','D',,mono,free,)
    Une fois que tu as cette table, il te suffit de la lier à ta table RESERVATION par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TD_RESA.RES_ID = RESERVATION.RES_ID 
    and TD_RESA.CLASSEMENT_DATE=1
    Normalement, ca devrait résoudre ton problème.

    Petite remarque : Si tu as 2 réservations sur la même date :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TRANS_ID | RES_ID | DATE_OUVERTURE | STATUT
    1 | 1 | 01/01/2011 | BK
    2 | 1 | 01/01/2011 | CL
    Que dois tu ramener ?

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Normalement ce cas (2 dates identiques) est impossible mais bon...
    Vraiment merci pour ton aide, je testerai ta solution Lundi quand je retourne sur ce projet.
    Si tu as besoin de quoi que ce soit n'hésite pas

  6. #6
    Membre expérimenté
    Avatar de Julien59
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    1 142
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 142
    Points : 1 458
    Points
    1 458
    Par défaut
    Si c'est impossible, alors pas de problème, ca fonctionnera.
    Par contre, si c'est possible, demande ce qu'il faut retourner, et même si c'est impossible, demande "Et si qqun fait une erreur de saisie ?".
    Combien de fois m'a t-on dit : ce cas est impossible, et je me retrouve avec sur les bras.
    En gros, si on prend les 2, alors le rank() est ok, si tu dois n'en prendre qu'un, il faudra utiliser dense rank()
    Bon courage

Discussions similaires

  1. Réponses: 12
    Dernier message: 11/02/2009, 14h15
  2. [MySQL 3.23] Récupérer la date la plus récente
    Par griese dans le forum Langage SQL
    Réponses: 10
    Dernier message: 19/12/2006, 14h19
  3. Réponses: 2
    Dernier message: 14/09/2006, 18h53
  4. [C#]Comment récupérer la version du FrameWork?
    Par fantomchris dans le forum C#
    Réponses: 6
    Dernier message: 24/03/2006, 14h39
  5. Comment récupérer la version d'un exécutable ?
    Par bib34690 dans le forum Langage
    Réponses: 2
    Dernier message: 19/09/2005, 18h20

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