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

InterBase Discussion :

Interbase: Problème de case dans un SELECT


Sujet :

InterBase

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2006
    Messages : 40
    Points : 31
    Points
    31
    Par défaut Interbase: Problème de case dans un SELECT
    Bonsoir à tous;
    Je développe une application en Delphi avec une base de données Interbase.
    Je rencontre depuis des heures un problème avec la requête suivante:
    (là je simplifi la reqûete)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    SELECT 
       matable.IDNUM, 
       matable.AUTREDATE , 
       matable.MADATE, 
       case when matable.MADATE >= '11/08/2007' 
           then 0 
           else 1 
           end  AS MONINDIC
    FROM matable 
    where matable.AUTREDATE > '11/01/2007'
    sachant que le format date de interbase est mm/dd/yyyy

    J'ai essayé le IF , IIF mais ça ne fonctionne pas !

    Merci d'essayer de m'aider

  2. #2
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 903
    Points : 6 027
    Points
    6 027
    Par défaut
    Quelle version d'Interbase ?

    Quelle erreur se produit ?
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2006
    Messages : 40
    Points : 31
    Points
    31
    Par défaut
    Citation Envoyé par qi130 Voir le message
    Quelle version d'Interbase ?

    Quelle erreur se produit ?
    Tout d'abord merci de vous intéresser à ma question

    voici l'erreur:

    ISC ERROR CODE:335544569

    ISC ERROR MESSAGE:
    Dynamic SQL Error
    SQL error code = -104
    Token unknown - line 6, char 7
    when
    STATEMENT:
    TIBOInternalDataset: "<TApplication>.frm_DBS_SQL_Entry.qry.IBOqrqry."

    J'utilise Interbase 6 que voici l'écran de son About..

    avec Delphi 7 muni des composant de la JVCL

  4. #4
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Bonjour,

    Interbase 6 ne gère pas de "Case".
    Cette notion a été introduite dans firebird 1.5 (quipeux remplacer Interbase 6 presque sans aucun probleme de conversion).

    Et je pense que le "case" existe sous interbase > à la version 7.x (A faire confirmer).

    Si vous voulez le faire sous Ib6 il vous faudra passer par une procédure stoquée ou bien un select Union poura faire l'affaire.

    Cordialement

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2006
    Messages : 40
    Points : 31
    Points
    31
    Par défaut
    Bonjour,
    Je ne pense pas que je pourrais changer vers firebird tout de suite mais la solution de SELECT UNION sera la mieu adaptée
    comment pourrais-je ajouter cette condition dans un SELECT

  6. #6
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Preferez le format date AAAA/MM/JJ qui est moins ambigu.
    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
    SELECT 
       m.IDNUM, 
       m.AUTREDATE , 
       m.MADATE, 0 AS MONINDIC
    FROM matable m
    WHERE m.AUTREDATE > '2007/11/01'
       and m.MADATE >= '2007/11/08' 
    UNION
    SELECT 
       m.IDNUM, 
       m.AUTREDATE , 
       m.MADATE, 1 AS MONINDIC
    FROM matable m
    WHERE m.AUTREDATE > '2007/11/01'
       and m.MADATE < '2008/11/08' ;

  7. #7
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 903
    Points : 6 027
    Points
    6 027
    Par défaut
    Citation Envoyé par Barbibulle Voir le message
    Et je pense que le "case" existe sous interbase > à la version 7.x
    J'ai effectivement trouvé des infos dans ce sens sur , d'où ma demande quant à la version.
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2006
    Messages : 40
    Points : 31
    Points
    31
    Par défaut
    Merci le PROs pour vos réponses, en fait vu ma requete qui est trés complexe, je vais rediriger le SELECT vers une table temporaire puis en parcourant cette table je vais modifier mes indicateurs qui sont au nombre de 6 avec des update.
    Mais maintenant je rencontre un autre type de problème je possède deux champs de type timestamp que je ne peux pas comparer avec une date !
    Ma question est : comment extraire une date d'un champ TIMESTAMP dans un SELECT ?

  9. #9
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par mameziane Voir le message
    comment extraire une date d'un champ TIMESTAMP dans un SELECT ?
    avec un CAST:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      SELECT CAST(MonChampTimeStamp AS DATE), ...
    @+ Claudius

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2006
    Messages : 40
    Points : 31
    Points
    31
    Par défaut
    Meci Cl@udius ca fonctionne pour le Timestamp.
    Mais là encore je me plante sur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select * from Matable into TableTemp
    qui apparemment ne fonctionne pas avec Interbase 6 !
    Y-a-t-il d'autre moyen pour rediriger le résultat du select vers une autre table ?

  11. #11
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Re,

    As-tu essayé dans l'autre sens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      INSERT INTO TableTemp
      FROM (SELECT ...);
    ?

    @+ Claudius

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2006
    Messages : 40
    Points : 31
    Points
    31
    Par défaut
    En fait j'ai pas pensé, je vais essayé d'adapter cette requête avec la tâche à réaliser et je vous en dirais de mes nouvelle
    Encore merci

  13. #13
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    A votre place je ferai une procédure stoquée. Celà évitera de dédoubler des données et d'allourdir le traitement (dans votre cas, un select/insert, puis des Updates pour enfin faire un select du résultat).

    Qeulque chose du genre :
    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
    Create procedure MaProcedure(MaDateParam date, MaDateParam2 date)
    returns (IDNUM integer,
        Autredate date,
        Madate date,
        MONINDIC smallint)
     
    as
    begin
      For SELECT matable.IDNUM, matable.AUTREDATE, matable.MADATE
      FROM matable 
      WHERE matable.AUTREDATE > :MaDateParam
      into :IDNUM, :AUTREDATE, :MADATE
      do
      begin
         if (MADATE >= MaDateParam2) then
           MONINDIC = 0;
         else
           MONINDIC = 1;
         end
        suspend;
      end
    end
    Puis pour l'utiliser il vous suffit de faire un select :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select Autredate, Madate, MONINDIC from MaProcedure( '2007/11/1', '2007/11/8')

  14. #14
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    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 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Attention toutefois au SQLDialect

    si c'est le 1 bien indiqué la date et l'heure 00:00:00
    (je viens de me faire avoir , donc je parle d'expérience)
    Date est un TimeStamp en dialect 1 alors qu'en dialect 3 c'est bien juste la date

    je ne sais plus ou j'ai trouvé sur le net la difference entre les dialects 1,2,3
    mais c'est édifiant
    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
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Sauf qu'il n'y a aucune raison d'utiliser la dialect 1 ou 2 avec IB6.

    Pour rappel le Dialect 1 etait celui utilisé par les versions antérieures à la V6. Le dialect 2 a été crée dans l'unique but de faciliter la migration vers le dialect 3 qui est celui qu'il faut utiliser dans les versions >= 6.

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2006
    Messages : 40
    Points : 31
    Points
    31
    Par défaut
    Merci les Pros pour vos précieux conseils.
    En fait et après plusieurs test, vus qu'en réalité ma requête conserne 6 champs de date dont deux son en timestamp, j'ai décidé d'ajouter des champs flag type ARR varchar(1) pour controler la date d'arrivée, DEX varchar(1) pour la date début d'exécution, etc... chaque date aura un indicateur qui sera modifié en même temps que la date correspondante et qui aura 1 si la date est dans la plage désiré sinon 0 par 6 requetes UPDATE et puis lors du SELECT que se soit à l'affichage dans une grille ou à l'impression chaque indicateur servira comme critère de selection.
    Désolé de vous décevoir en utilisant cette solution (de cuisine) mais vu que je suis encore débutant (depuis 7 ans déjà) je n'ai pas pu faire mieux.
    Encore merci à tous

  17. #17
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    C'est en effet dommage de n'avoir pas créer une petite procédure stockée qui aurait été une solution plus élégante et plus pérène.

    Sans compté que celà vous aurait pris moins de temps à développer.

    Se plus si un jour une des règles changent vous allez devoir mettre à jour toute votre table pour que les flags reflètent bien la nouvelle règle.

    Et combien de flag allez vous devoir ajouter au fil de votre développement ?

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

Discussions similaires

  1. Problème de variable dans requete Select
    Par Avatar69 dans le forum ASP.NET
    Réponses: 6
    Dernier message: 09/10/2009, 09h11
  2. problème de if dans mon select en mysql
    Par sinifer dans le forum Requêtes
    Réponses: 3
    Dernier message: 25/05/2009, 20h26
  3. [MySQL] Problème de condition dans le SELECT
    Par nicocaine dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 15/06/2007, 08h20
  4. [Interbase] Récupérer une valeur dans un select
    Par ftoutin dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 09/01/2007, 13h36
  5. [PL SQL] Problème avec 'case' dans une fonction
    Par divail dans le forum Oracle
    Réponses: 14
    Dernier message: 13/03/2006, 15h50

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