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

Delphi Discussion :

Utiliser le champ d'une vue


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de oneDev
    Homme Profil pro
    dilettant
    Inscrit en
    Mars 2019
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : dilettant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2019
    Messages : 220
    Par défaut Utiliser le champ d'une vue
    Bonjour,

    J'utilise Delphi 11.1 avec les composants firedac pour afficher les données d'une base sqlite.

    Dans ma base, j'ai les données suivantes :

    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
    -- // Tables
    CREATE TABLE "auteurs" (
      "id" INTEGER PRIMARY KEY AUTOINCREMENT,
      "nom" VARCHAR(255) NOT NULL,
      "prenom" VARCHAR(255) DEFAULT NULL
    );
     
    -- // Vues
    CREATE VIEW auteurs_nom_prenom AS
        SELECT
          "id",
          CAST(
            CASE
              WHEN "prenom" IS NULL OR "prenom" = "" THEN "nom"
              ELSE "prenom" || " " || "nom"
            END 
            AS varchar(510)) "prenom_nom"
        FROM "auteurs";
    Je souhaite afficher des données en faisant une jointure sur ma vue.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    qry.SQL.Text := 'SELECT l."titre", l."lu", '
      + '   g."nom" "genre" '
    //  + '   , a.prenom_nom'
      + ' FROM "livres" l '
      + ' LEFT JOIN "genres" g ON l."genre_id" = g."id" '
      + ' LEFT JOIN "auteurs_nom_prenom" a ON l."auteur_id" = a."id";';

    La requête fonctionne correctement dans sqlite.
    Avec la ligne commenté, cela fonctionne, mais si je décommente , a.nom_prenom, j'obtiens l'erreur : 'Type de champ non valide'.

    Savez-vous comment corriger cette erreur ?

  2. #2
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    il ne manque pas une virgule entre g."nom" et "genre" ? et je ne mettrais pas de ; à la fin

    ceci dit ça ne devrait pas être l'origine de l'erreur.

    est-ce qu'un "SELECT prenom_nom FROM auteurs_nom_prenom" passe ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre éprouvé Avatar de oneDev
    Homme Profil pro
    dilettant
    Inscrit en
    Mars 2019
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : dilettant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2019
    Messages : 220
    Par défaut
    Entre nom et genre, c'est juste que je n'ai pas indiqué le AS.
    Mais avec la ligne commenté cela fonctionne correctement.
    L'erreur intervient quand je la décommente.

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 678
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    j'ai en sainte horreur toutes ces " " qui gênent et forcent le respect de la casse. Idem, je trouve que l'utilisation d'une vue n'est pas nécessaire et je serais plutôt passé par un Trim(COALESCE(prenom,' ')||' '||nom) prenom_nom
    ce serait plutôt la ligne 2 de la requête qui pose problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    qry.SQL.Text := 'SELECT l."titre", l."lu", '
      + '   g."nom",g."genre" '
     + '   , a.prenom_nom'
      + ' FROM "livres" l '
      + ' LEFT JOIN "genres" g ON l."genre_id" = g."id" '
      + ' LEFT JOIN "auteurs_nom_prenom" a ON l."auteur_id" = a."id"';

  5. #5
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    non, de ce que je comprend c'est

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT l.titre, l.lu, g.nom AS genre, a.prenom_nom 
    FROM livres l 
    LEFT JOIN genres g ON g.id = l.genre_id
    LEFT JOIN auteurs_nom_prenom a ON a.id = l.auteur_id
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    ...

    est-ce qu'un " SELECT prenom_nom FROM auteurs_nom_prenom" passe ?
    c'est le premier test à faire
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Membre éprouvé Avatar de oneDev
    Homme Profil pro
    dilettant
    Inscrit en
    Mars 2019
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : dilettant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2019
    Messages : 220
    Par défaut
    J'obtiens effectivement la même erreur. "Type de champ non valide."

    Effectivement c'est possible de faire ce genre de chose Trim(COALESCE(prenom,' ')||' '||nom) prenom_nom.
    Mais cela m'embête de devoir écrire ce genre de chose à chaque que j'en aurai besoin. C'est pour cette raison que je préferai passer par une vue.

    Oui la requête est bien celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT l.titre, l.lu, g.nom AS genre, a.prenom_nom 
    FROM livres l 
    LEFT JOIN genres g ON g.id = l.genre_id
    LEFT JOIN auteurs_nom_prenom a ON a.id = l.auteur_id

  8. #8
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 950
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 950
    Par défaut
    Citation Envoyé par oneDev Voir le message
    J'obtiens effectivement la même erreur. "Type de champ non valide."
    Comment testes-tu ça, en runtime ou au design à l'édition de la requête dans le TFDQuery ?

    Le message fait penser à une différence de type entre la déclaration dans la DB et le type utilisé dans Delphi (à travers l'éditeur de champs, même si Firedac devrait plutôt renvoyer "type de champ inadéquate"). Cette erreur se verrait en runtime mais pas en design.


    Citation Envoyé par oneDev Voir le message
    Mais cela m'embête de devoir écrire ce genre de chose à chaque que j'en aurai besoin.
    LEFT JOIN auteurs_nom_prenom a ON a.id = l.auteur_id n'est pas plus léger à écrire. Pourquoi ne pas créer une vue contenant directement tous les champs requis (incluant les jointures)

    Une autre approche aurait été d'utiliser un TFDSQLiteFunction pour retourner le nom complet.

  9. #9
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    bon...j'ai créé une base SQLite avec la table et la vue que tu donnes

    j'ai ajouté
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    create table livres (
      genre_id,
      auteur_id,
      titre,
      lu
    );
     
    create table genres (
      id,
      nom
    );

    et ça fonctionne avec tout par défaut sous Alexandria
    Nom : SQLiteTest.png
Affichages : 136
Taille : 16,2 Ko

    y compris avec des données
    Nom : SQLiteTest.png
Affichages : 151
Taille : 3,7 Ko
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

Discussions similaires

  1. Ajout de champs dans une vue
    Par magfen dans le forum C#
    Réponses: 4
    Dernier message: 23/11/2010, 15h23
  2. champ d'une vue oracle
    Par lady701 dans le forum Administration
    Réponses: 2
    Dernier message: 02/03/2010, 17h14
  3. Réponses: 4
    Dernier message: 30/07/2009, 09h56
  4. Type des champs d'une vues mysql
    Par JmL40 dans le forum Requêtes
    Réponses: 1
    Dernier message: 27/05/2008, 16h06
  5. Utiliser 2 champs dans une fonction IN
    Par hannii dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 10/12/2007, 16h55

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