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

Bases de données Delphi Discussion :

Souci avec la structure du SQL dans un Query


Sujet :

Bases de données Delphi

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Février 2014
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de base de données

    Informations forums :
    Inscription : Février 2014
    Messages : 59
    Points : 25
    Points
    25
    Par défaut Souci avec la structure du SQL dans un Query
    Bonjour à toutes et à tous,

    Je viens demander de l'aide ici car j'ai un petit souci aujourd'hui.

    J'avais à l'origine une requête de ce genre :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select d.* 
    from demande d
    where d.id = :ID_DEMANDE

    dans mon query et dont je renseignais le seul paramètre ID_DEMANDE en passant par le ParamValues.

    Aujourd'hui, il y a un des champs du select que je veux voir à vide ou avec la valeur du champ initial en fonction d'une question posée à l'utilisateur.

    Je m'explique.

    Si je veux détailler le select, j'aurai :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select d.id, d.date_demande, d.montant, d.statut, d.supprime
    from demande d
    where d.id = :ID_DEMANDE

    Si l'utilisateur dit qu'il ne veut pas voir le statut sur l'interface, j'aimerai pouvoir faire par exemple :

    Dans le SQL :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select d.id, d.date_demande, d.montant, :STATUT as statut, d.supprime
    from demande d
    where d.id = :ID_DEMANDE

    Dans le code Delphi :
    - avoir dans le cas où je veux l'afficher ->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IBQDemande.Params.ParamValues['STATUT'] := 'd.statut'
    - avoir dans le cas où je veux pas l'afficher ->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IBQDemande.Params.ParamValues['STATUT'] := 'NULL'
    Le souci, c'est que tel quel, ça me retourne l'erreur :

    "Le projet XXX a déclenché la classe d'exception EIBInterbaseError avec le message 'Dynamic SQL Error SQL error code = -804 Data Type unknown'.

    Je pense que c'est parce qu'en insérant les valeurs de paramètres, je dois me retrouver avec le SQL suivant :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select d.id, d.date_demande, d.montant, 'd.statut' as statut, d.supprime
    from demande d
    where d.id = :ID_DEMANDE
    et du coup il ne l'interprèterait pas.

    Quelqu'un aurait une idée ?

    Merci par avance

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Les IBX ne permettent pas ce genre de chose (une genre de macro pour créer la requête). Il existe des composants qui le font. Firedac il me semble...

    Mais bon je ne procèderai pas comme ça....

    J'utiliserai la requête complète et simplement j'utiliserai la propriété Visible du Field associé à statut ou la propriété Visible de la colonne de la grille....


    Pour moi une requête ne s'occupe pas (ou très peu) de la présentation.... C'est à l'interface graphique de gérer ce genre de chose...

  3. #3
    Membre émérite
    Avatar de skywaukers
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2005
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 216
    Points : 2 303
    Points
    2 303
    Par défaut
    Bonjour,

    je suis d'accord avec Barbibulle, une requette ne prend pas en considération les problèmes de présentation. Cependant, par soucis d'optimisation, il est quand même intéressant de pouvoir ne ramener que les colonnes qui sont nécessaires à ce qu'on veut faire. Je ne sais pas si ce que tu esaye de faire est possible, personnellement je procède différement. La propriété SQL de ton query est généralement un TStrings que tu peux renseigner ou modifier à l'exécution. Pourquoi ne pas mettre par exemple dans ton composant cette requette :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select {%champs%}
    from demande d
    where d.id = :ID_DEMANDE
    puis lorsque l'utilisateur a choisi les champs qu'il veut afficher, tu construit la liste dans une chaine de caractères et tu remplace {%champs%} par cette chaine avant d'activer le query.

    @++
    Dany

  4. #4
    Membre habitué Avatar de donnadieujulien
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 433
    Points : 191
    Points
    191
    Par défaut ...
    A force de fournir des outils et/ou des objets de plus en plus complexe pour faire des choses simples les développeurs (en herbe) en oublient même l'essentiel, une requête SQL c'est d'abord une chaine de caractère.
    Dans ce cas la avec un peu de réflexion et des outils simples comme strreplace on peut tout faire, sous réserve de trouver ou se cache la chaine de caractère.

    En tout cas je suis vraiment opposé à ce genre d'objets qui ne servent franchement pas à grand chose...
    On ne peut créér ce qu'on ne peut imaginer...
    Tu sens la puissance du BIT?

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Citation Envoyé par donnadieujulien Voir le message
    En tout cas je suis vraiment opposé à ce genre d'objets qui ne servent franchement pas à grand chose...
    C'est certain c'est comme programmer en pascal, il ne faut pas oublier qu'après compilation c'est du code machine. Autant apprendre et programmer directement en code machine (allez... l'assembleur pour être plus tolérant...). (désolé, c'est un peu exagéré, c'est la proximité de Marseille qui déteint sur moi )

    Moi je trouve au contraire que de ne pas utiliser ces objets Fields / Paramètres c'est passer à coté de choses intéressantes.

    Si vous utilisez un type TxxQUERY, que vous fassiez votre requête dynamiquement lors de l’exécution ou lors de la conception, les objets FIELDS seront créés. (Donc autant en profiter...)
    Qu'apporte les fields ?
    L'utilisation plus simple des données comme les dates (s'affranchir du paramétrage régional du poste), les blobs, les champs calculés,
    Les évènements au niveau field peuvent être intéressant comme le onValidate,
    La définition du "display label"
    Les règles de visibilité ou le readonly
    Le formatage de la valeur à l'écran,
    Un masque de saisie,
    Un code source plus lisible,
    Bien entendu il faut les utiliser avec des composants d'affichage de type TDBxxx.

    Bref dire que cela n'apporte rien c'est passer à coté de pas mal de fonctionnalités.

    Générer une requête dynamique c'est prendre le risque d'engendrer une requête qui est fausse, ou non optimisée, et je trouve aussi plus difficile la maintenance de ces requêtes et surtout la lisibilité du code.

    Bref pour ma part je ne reviendrais pas aux requêtes dynamiques sauf cas bien particuliers.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Février 2014
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de base de données

    Informations forums :
    Inscription : Février 2014
    Messages : 59
    Points : 25
    Points
    25
    Par défaut
    Bonjour à tous,

    Tout d'abord, merci pour toutes vos réponses...

    Finalement, j'ai opté pour laisser un SELECT * FROM DEMANDE et finalement modifier l'interface.
    Au final, le contenu de cette requête était affiché dans un QReport. J'ai donc réadapté mon report pour cacher les champs que je ne voulais pas voir apparaitre.

    Mais disons que le sujet méritait tout de même d'être abordé,... une requête dynamique, bien que ce ne soit pas préconisé, peut être utile...

  7. #7
    Membre habitué Avatar de donnadieujulien
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 433
    Points : 191
    Points
    191
    Par défaut
    C'est certain c'est comme programmer en pascal, il ne faut pas oublier qu'après compilation c'est du code machine. Autant apprendre et programmer directement en code machine (allez... l'assembleur pour être plus tolérant...). (désolé, c'est un peu exagéré, c'est la proximité de Marseille qui déteint sur moi )
    A force de faire toujours plus d'objets et d'écrire toujours moins de code, on en arrive à avoir des développeurs qui ne savent plus coder.
    Évidement qu'il faut se servir des outils à disposition, mais pour commencer ce n'est pas l'idéal.
    On ne peut créér ce qu'on ne peut imaginer...
    Tu sens la puissance du BIT?

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 12/09/2012, 19h39
  2. Jeu Othello et quelque soucis avec une structure
    Par AliFirat91 dans le forum C
    Réponses: 4
    Dernier message: 26/04/2012, 19h27
  3. Soucis avec lecture d'un Boolean dans un fichier property
    Par timbrochier dans le forum Langage
    Réponses: 2
    Dernier message: 01/10/2010, 18h28
  4. Réponses: 5
    Dernier message: 22/12/2009, 13h09
  5. importer une structure en sql dans 4D
    Par saturne27 dans le forum 4D
    Réponses: 2
    Dernier message: 15/01/2008, 11h08

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