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 :

Probleme avec sql FireBird


Sujet :

SQL Firebird

  1. #1
    Membre habitué
    Inscrit en
    Mai 2006
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2006
    Messages : 249
    Points : 165
    Points
    165
    Par défaut Probleme avec sql FireBird
    Bonjour tout le monde;
    J'ai un champ dans une table; ce champ peut avoir soit une valeur 'P' soit une valeur 'R' soit rien c-a-d Null.
    Je veut exécuter la requette suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from Table where champ <> 'P'
    Le problème c'est que la requette ne retourne rien même qu'ils existes des champs avec des valeurs 'P' et d'autres non;
    Par contre si j'écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from Table where champ = 'P'
    j'obtiens le résultat attendu.
    Je n'arrive pas à résoudre le problème, j'espère qu'on va tirer quelque chose de ce problème et qu'il ne soit pas une bêtise de ma part.
    Deux personnes n'apprennent pas, un arrogant et un timide.

  2. #2
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut


    bizarre, cela devrait fonctionner sans problème pourtant, j'ai fait le même test et tout marche sans souci.

    peux tu donner la définition de ta table, notamment le type de "champ"

    tu peux aussi essayer ceci qui revient à ta première requête :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM TABLE WHERE not(champ = 'P')

  3. #3
    Membre habitué
    Inscrit en
    Mai 2006
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2006
    Messages : 249
    Points : 165
    Points
    165
    Par défaut
    Je pense que c'est du au composant ADO. Quant je lance la requette à partir de IBEasy, elle marche normalement mais quant je la lance depuis l'application par le biais d'un composant ADOQuery j'ai un message d'erreur;
    Je pense qu'il vaut mieux larguer ADO vers autres choses.
    Deux personnes n'apprennent pas, un arrogant et un timide.

  4. #4
    Membre actif
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 416
    Points : 299
    Points
    299
    Par défaut
    Et avec un code comme ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from Table where champ <> 'P' and NOT (champ IS NULL )
    “La perfection est atteinte, non pas lorsqu'il n'y a plus rien à ajouter, mais lorsqu'il n'y a plus rien à retirer.” Antoine de Saint-Exupéry.

    D1..D7-2005,2006-Xe2 Ent-XE7 archi-MsSql 2005..2008 & R2, FB 1.5..2.5.x.x -Win10,Win7/64-Xp-
    _____________________________________________________

  5. #5
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut
    Citation Envoyé par kaouane Voir le message
    mais quant je la lance depuis l'application par le biais d'un composant ADOQuery j'ai un message d'erreur;
    ce serai bien que tu nous poste le message d'erreur ici

  6. #6
    Membre habitué
    Inscrit en
    Mai 2006
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2006
    Messages : 249
    Points : 165
    Points
    165
    Par défaut
    Citation Envoyé par evarisnea Voir le message
    ce serai bien que tu nous poste le message d'erreur ici
    si dans ma table j'ai plusieurs champs avec une valeur 'P', si je lance :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Procedure TFomr1.Button1Click(sender TObject)
    var Q:TADOQuery;
    begin
      Q:=TADOQuery.Create(nil)
      Q.Connection:=dm.ADOConnection1;
      Q.sql.Add('Select * from table where (champ<>'+QuotedStr('P')+') or (champ is Null)');
      Q.Open;
      Showmessage(IntToStr(Q.recordount));
      Q.close;
      Q.Free;
    end;
    j'ai le bon résultat; mais si j'écris :

    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
     
    Procedure TFomr1.Button1Click(sender TObject)
    var Q:TADOQuery;
    begin
      Q:=TADOQuery.Create(nil)
      Q.Connection:=dm.ADOConnection1;
      Q.sql.Add('Select * from table');
      Q.Open;
      Showmessage(IntToStr(Q.recordount));
    // jusque là c bon, mais si je continu
      Q.filter=' (champ<>'+QuotedStr('P')+') or (champ is Null)';
      Q.filtered:=true;
      Showmessage(IntToStr(Q.recordount));
      Q.close;
      Q.Free;
    end;
    le message d'erreur apparait :
    "Les arguments sont de type incorrect, en dehors des limites autorisées ou en conflit les uns avec les autres"
    Deux personnes n'apprennent pas, un arrogant et un timide.

  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
    OPEN avant de filtrer

    L'open déclenche l'exécution de la requète. "Bricoler" les autres paramètres du ADOquery après l'exécution... je m'y hasarderais pas.

    Pourquoi ne mets tu pas toute la requête dans le sql ?
    "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
    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
    Personnellement j'ai horreur des filtres et je m'arrange pour les éviter .
    C'est peut être une erreur mais il faudra m'en convaincre

    En tout cas ce n'est pas un problème Firebird mais bien ADO
    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 habitué
    Inscrit en
    Mai 2006
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2006
    Messages : 249
    Points : 165
    Points
    165
    Par défaut
    Citation Envoyé par qi130 Voir le message
    OPEN avant de filtrer
    Et que voulez vous? filtrer avant Open????

    Citation Envoyé par qi130 Voir le message
    L'open déclenche l'exécution de la requète. "Bricoler" les autres paramètres du ADOquery après l'exécution... je m'y hasarderais pas.
    non cher ami, mais si le filtre était sur une champ différent ça ne cause aucun problème; si par exemple, on met :
    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
     
    Procedure TFomr1.Button1Click(sender TObject)
    var Q:TADOQuery;
    begin
      Q:=TADOQuery.CREATE(nil)
      Q.Connection:=dm.ADOConnection1;
      Q.sql.ADD('Select * from table');
      Q.Open;
      Showmessage(IntToStr(Q.recordount));
      Q.filter=' (champ<>1 or (champ is Null)';
      Q.filtered:=true;
      Showmessage(IntToStr(Q.recordount));
      Q.close;
      Q.Free;
    end;
    tout marche bien. Que dite vous??

    Citation Envoyé par qi130 Voir le message
    Pourquoi ne mets tu pas toute la requête dans le sql ?
    C'est le besoin qui impose des choix fréquemment.
    Deux personnes n'apprennent pas, un arrogant et un timide.

  10. #10
    Membre habitué
    Inscrit en
    Mai 2006
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2006
    Messages : 249
    Points : 165
    Points
    165
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Personnellement j'ai horreur des filtres et je m'arrange pour les éviter .
    C'est peut être une erreur mais il faudra m'en convaincre
    C'est une erreur, mais c'est un choix aussi; vous pouvez bricoler pour éviter d'utiliser une fonctionnalité qui se trouve un critère de choix des moyens de connexion au données.

    Citation Envoyé par SergioMaster Voir le message
    En tout cas ce n'est pas un problème Firebird mais bien ADO
    Oui c'est sûr, la preuve que si j'utilise un autre moyen de connexion par exemple dbExpress, tout va bien.
    Deux personnes n'apprennent pas, un arrogant et un timide.

  11. #11
    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
    Citation Envoyé par qi130 Voir le message
    OPEN avant de filtrer

    L'open déclenche l'exécution de la requète. "Bricoler" les autres paramètres du ADOquery après l'exécution... je m'y hasarderais pas.

    Pourquoi ne mets tu pas toute la requête dans le sql ?
    Le champ Filter peut tout aussi bien être défini à la conception (mais dans ce cas s'il ne doit pas changer il faut préférer 1000 fois l'intégrer à la requete.) ou bien à l'exécution.
    Dans ce dernier cas ca peut se faire avant l'open (pas trop d'intérêt autant appliquer les critère dans la requête encore une fois) ou après.

    Et donc je dirais le seul vrai intérêt c'est de la faire après le Open de manière dynamique.

    Cependant il faut connaitre les limites de ce filtre. Il est purement local, ce qui veut dire que l'intégralité des enregistrements de la requête sont demandés (enfin si on balaye toute la requête). Et c'est donc en local que le composant va décider de fournir ou non l'enregistrement suivant ce filtre.

    Donc je dirais que c'est une manière assez simple de créer des filtres utilisateurs dynamiques.

    Pour revenir au problème originel, essayez ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Q.filter=' (champ <> 1 or (champ is Null)';
    Mettez impérativement un espace apres le nom du champ et avant l'opérateur de comparaison.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Q.filter=' (champ <> '+QuotedStr('P')+') or (champ is Null)';

  12. #12
    Membre habitué
    Inscrit en
    Mai 2006
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2006
    Messages : 249
    Points : 165
    Points
    165
    Par défaut
    Ca ne marche pas avec ADO cher Barbibulle, peut être parce que ADO essai de convertir le contenu du champ du filtre avant de le comparer; ce qui provoquera surement des erreurs à chaque fois.
    Si par exemple le champ dans la table et de valeur null, il va essayer de la convertir avant de la comparer à la condition du filtre :
    Q.filter='champ='+QuotedStr('P');
    Je ne sais pas exactement, c juste une hypothèse.
    Deux personnes n'apprennent pas, un arrogant et un timide.

  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
    Citation Envoyé par kaouane Voir le message
    Q.filter='champ='+QuotedStr('P');
    Ne peut pas fonctionner. Comme je l'ai dit précédemment il faut mettre impérativement un espace après le nom des champs...

    Citation Envoyé par kaouane Voir le message
    Q.filter='champ = '+QuotedStr('P');

  14. #14
    Membre habitué
    Inscrit en
    Mai 2006
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2006
    Messages : 249
    Points : 165
    Points
    165
    Par défaut
    Le même message apparait même avec l'astuce que vous m'avez proposé.
    Deux personnes n'apprennent pas, un arrogant et un timide.

  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
    Ce n'est pas une astuce, c'est ce qui est écrit dans la documentation :

    Remarque*: Placez un espace entre les valeurs comparées et les opérateurs de comparaison dans les expressions de filtre.En particulier,vous devez vous assurer qu'il y a un espace après le nom de champ et avant l'opérateur.
    De plus il me semble que pour tester un champ à null il ne faut pas faire comme en SQL : "Champ is NULL" mais "champ =NULL"

    C'est quoi le message exactement ?

  16. #16
    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 kaouane Voir le message
    Et que voulez vous? filtrer avant Open????


    non cher ami, mais si le filtre était sur une champ différent ça ne cause aucun problème; si par exemple, on met :
    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
     
    Procedure TFomr1.Button1Click(sender TObject)
    var Q:TADOQuery;
    begin
      Q:=TADOQuery.CREATE(nil)
      Q.Connection:=dm.ADOConnection1;
      Q.sql.ADD('Select * from table');
      Q.Open;
      Showmessage(IntToStr(Q.recordount));
      Q.filter=' (champ<>1 or (champ is Null)';
      Q.filtered:=true;
      Showmessage(IntToStr(Q.recordount));
      Q.close;
      Q.Free;
    end;
    tout marche bien. Que dite vous??.
    Je dis qu'une colonne ne peut être à la fois numérique (champ<>1) et alpha (champ <> '+QuotedStr('P'))
    Trêve de... Il faudrait + de précisions, l'endroit exact où l'exception est lévée, etc... (en fait le code ci-dessus ne peut marcher car il manque 1 parenthèse fermante, alors j'ai un doute sur le "tout marche bien"...

    @Barbibulle: oui, je comprends bien dans le cas où le query est cablé à un autre compo... mais là
    "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

  17. #17
    Membre habitué
    Inscrit en
    Mai 2006
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2006
    Messages : 249
    Points : 165
    Points
    165
    Par défaut
    Citation Envoyé par Barbibulle Voir le message
    De plus il me semble que pour tester un champ à null il ne faut pas faire comme en SQL : "Champ is NULL" mais "champ =NULL"
    Non, ça marche aussi.

    Citation Envoyé par Barbibulle Voir le message
    C'est quoi le message exactement ?
    Le message d'erreur est le suivant:
    "Les arguments sont de type incorrect, en dehors des limites autorisées ou en conflit les uns avec les autres"
    Deux personnes n'apprennent pas, un arrogant et un timide.

  18. #18
    Membre actif
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 416
    Points : 299
    Points
    299
    Par défaut
    Citation Envoyé par kaouane Voir le message


    Le message d'erreur est le suivant:
    "Les arguments sont de type incorrect, en dehors des limites autorisées ou en conflit les uns avec les autres"
    Bonjour,
    il me semble (j'ai pas l'habitude d'ADO...), qu'il y a une erreur de syntaxe ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Q.filter=' (champ<>1 or (champ is Null)';
    et il faudrait faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Q.filter=' ((champ <>1) or (champ is Null)) ';
    Mais encore une fois je ne suis pas rompu à ADO
    “La perfection est atteinte, non pas lorsqu'il n'y a plus rien à ajouter, mais lorsqu'il n'y a plus rien à retirer.” Antoine de Saint-Exupéry.

    D1..D7-2005,2006-Xe2 Ent-XE7 archi-MsSql 2005..2008 & R2, FB 1.5..2.5.x.x -Win10,Win7/64-Xp-
    _____________________________________________________

Discussions similaires

  1. probleme avec sql
    Par joe370 dans le forum VBA Access
    Réponses: 7
    Dernier message: 30/05/2007, 13h24
  2. probleme avec sql server
    Par elamarti dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/03/2007, 12h43
  3. probleme avec sql server 2005
    Par tarajji dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 21/02/2007, 17h28
  4. tres urgent : probleme avec sql server
    Par nourelhouda dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/03/2006, 11h19

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