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 :

TFDQuery et RequestLive


Sujet :

Bases de données Delphi

  1. #1
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 535
    Par défaut TFDQuery et RequestLive
    Bonjour

    Je sens que Sergio va sauter sur la question en bon spécialiste qu'il est.

    J'ai 2 tables sur lesquelles je fais une jointure et j'affiche les données dans une TDBGrid.
    Le composant me dit bien RequestLive = True.
    J'ai bien mis CachedUpdates = True
    Malgré cela, la modification des valeurs ne se fait pas.
    Ou plutôt, elle est possible mais rien ne s'enregistre.

    J'imagine qu'il y a des restrictions sur le SQL dans la requête mais je ne trouve pas de référence documentaire sur le sujet.

    Quelqu'un aurait un lien vers une doc expliquant tout ça ?

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 707
    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 707
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Je sens que Sergio va sauter sur la question en bon spécialiste qu'il est.
    Je pourrais la preuve mais c'est un sujet que je maitrise mal, il va me falloir consulter ma bible (Delphi in Depth : Firedac)

    J'ai 2 tables sur lesquelles je fais une jointure et j'affiche les données dans une TDBGrid.
    jusque là , c'est du SQL, donc RAS, tu as bien un FDUPdateSQL qui traine avec ?
    Mais c'est peut-être deux FDTable liées donc il faudrait éclairer ma lanterne

    Le composant me dit bien RequestLive = True.
    ça c'est ma bête noire, je n'ai jamais fait appel à ça.
    J'ai bien mis CachedUpdates = True
    Bon, là encore, si j'utilise je maitrise mal les subtilités

    Malgré cela, la modification des valeurs ne se fait pas.
    Ou plutôt, elle est possible mais rien ne s'enregistre.
    un petit commit update est bien présent ?

    Quelqu'un aurait un lien vers une doc expliquant tout ça ?
    un lien non, un bouquin oui encore que pour l'instant, je ne vois pas quel chapitre mais c'est faute de comprendre exactement ce que tu fais

  3. #3
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 535
    Par défaut
    Ok, allons-y pour un peu plus de détails !

    Je dispose de 3 tables (créées par moi, donc modifiables si besoin).

    Une table générale Assemblees identifiée par un ID unique.
    ID_Assemblee
    Nom

    Une table de personnes assistant à une assemblée avec les champs
    ID_assemblee
    ID_Personne
    Id_Nom
    etc.

    Une liste de décisions pour une assemblée
    Id_Assemblee
    Id_Decision
    NumeroNiveau1
    NumeroNiveau2 (position en second niveau du champ précédent)
    Description
    etc.

    Enfin, une table Choix pour saisir et conserver le décisions de chaque personne pour une assemblée
    Id_Assemblee
    Id_Decision
    Id_Personne
    Reponse

    Sur mon écran, 3 DBGrid :

    La première affiche les assemblées
    La seconde, les décisions pour l'assemblée sélectionnée (lien mastersource)
    La troisième affiche la requête qui m'ennuie (lien mastersource vers personnes, sans définition des champs liés puisque les noms de clés sont identiques)

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT 
      Decisions.NumeroNiveau1, 
      Decisions.NumeroNiveau2, 
      Decisions.Description, 
      Choix.Reponse
    FROM Decisions 
      INNER JOIN Choix ON Decisions.Id_Assemblee = Choix.Id_Assemblee
    GROUP BY 
      Decisions.NumeroNiveau1, 
      Decisions.NumeroNiveau2, 
      Decisions.Description, 
      Choix.Reponse
    Choix.Reponse est un entier (pour l'instant mais qui devrait se transformer à terme par une liste de choix dans la grille quand mon problème sera résolu)

    Par défaut, Choix.Reponse est à 1

    Si je change le 1 en 2, ça fonctionne.
    Mais si je change de personne et que je reviens sur la personne pour laquelle j'ai modifié une décision, tout est revenu à 1.

    Le TUpdateSQL, je l'ai tenté mais Delphi me sortait des erreurs en prétendant qui lui manquait des champs
    J'ai compris qu'il fallait que je rajoute à ma requête tous les champs de la tables Decisions pour que ça fonctionne.
    Mais dans ce cas, l'affichage dans ma grille était complètement foireux. La requête multipliait les enregistrements et au lieu d'avoir les decisions, j'en avais nombre de personnes multiplié par le nombre de décsions.
    Bref, ça n'allait pas.

    J'ai essayé d'enlever la jointure dans la requête pour faire plus simple mais ça n'a rien changé.

    J'ai tourné en rond là-dessus jusque tard hier soir et j'ai calé sur le sujet qui me paraissait pourtant simple au début.

    Il faut que je trouve une solution aujourd'hui.
    Donc, si ça ne fonctionne pas avec une query, je pense modifizer ma table pour en créer une qui contiendra toutes les informations pur une ligne et passer par un TFDTable.
    Mais je trouve dommage de devoir doublonner les données de chaque décision pour chaque personne alors qu'elles sont déjà dans la table decisions.

    Avec Firebird, je n'avais jamais fait ça.
    Avec SQLServer + ADO, il me semble que ça marchait très bien.

    J'imagine que chaque système de données a ses limitations mais sans référence, je ne peux pas les inventer. :-(

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 707
    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 707
    Billets dans le blog
    65
    Par défaut
    Il faut que je trouve une solution aujourd'hui.
    Ah, un truc pour avant-hier, j'en ai deux sur le feu, il faut aller à Lourdes pour les miracles
    Alors, vite fait

    Le TUpdateSQL, je l'ai tenté mais Delphi me sortait des erreurs en prétendant qui lui manquait des champs
    Moui bon le TFDUPdateSQL il faut le travailler au corps , une chose théoriquement possible est de mettre plusieurs SQL dans une même clause mais j'avoue ne pas avoir tenté le diable.

    Avec Firebird, je n'avais jamais fait ça.
    donc il s'agirait de FireBird, ça tombe bien je maitrise
    J'imagine que chaque système de données a ses limitations
    AMHA Cela ne vient pas du choix de SGBD

    Si je comprend ta grille affiche la décision de chaque participant présent plus mandats (oui j'ai subi des AGs)
    AMHA le problème est le GROUP BY
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT
    Decisions.NumeroNiveau1,
    Decisions.NumeroNiveau2,
    Decisions.Description,
    Choix.Reponse
    FROM Decisions
    INNER JOIN Choix ON Decisions.Id_Assemblee = Choix.Id_Assemblee
    GROUP BY
    Decisions.NumeroNiveau1,
    Decisions.NumeroNiveau2,
    Decisions.Description,
    Choix.Reponse
    Je n'y vois aucun aggrégat (SUM,MAX et tuti quanti). IL me semble qu'il faudrait plutôt utilisé une clause WHERE ou un simple ORDER BY là,
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT
    Decisions.NumeroNiveau1,
    Decisions.NumeroNiveau2,
    Decisions.Description,
    Choix.Reponse,
    Id_Assemblee,
    Id_Decision,
    Id_Personne,
    FROM Decisions
    INNER JOIN Choix ON Decisions.Id_Assemblee = Choix.Id_Assemblee
    ORDER BY 1,2
    il manquait Id_Assemblee,Id_Decision,Id_Personne pour l'update

    le FDUPdateSQL devrait fonctionner (avant de passer au CacheUpdate faire un essai sans )



    P.S. Les grilles, j'utilise de moins en moins

  5. #5
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 535
    Par défaut
    Quand je disais pour aujourd'hui, ça voulait dire que je ne perdrai plus trop de temps sur ce sujet et qu'à défaut ça sera la méthode bourrin sur une seule table. :-)

    Je vais tenter la requête sans le group by pour voir ce que ça donne et je reviens pour donner le résultat.

    Merci déjà pour ton aide toujours précieuse

  6. #6
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 535
    Par défaut
    Alors, il y a du mieux , et même beaucoup de mieux.
    J'ai changé le champ pour le join en prenant IdDecision plutôt que IdAssemblee.
    Et là, j'ai les bonnes lignes qui s'affichent.

    Cette fois, je peux changer mes valeurs et elles s'enregistrent correctement à un détail près.
    Si je change le 1 sur plusieurs lignes consécutives par exemple en partant de la première en faisant par exemple:
    1
    2
    3
    4
    5
    6

    Quand je change de personne et que je reviens sur celle pour laquelle j'ai fait des modifs, ma liste se transforme en
    6
    2
    3
    4
    5
    6

    La dernière valeur saisie se reporte sur la première

    Je précise, le tout sans TFDUpdateSQL

  7. #7
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 535
    Par défaut


    C'est de ma faute. J'avais forcé une mise à jour avec une requête dans la Afterpost des votes et j'avais une coquille dans mon code.
    Cette fois, ça fonctionne impecc'

    Merci grand manitou

    surtout de m'avoir fait dégager le group by qui devait faire obstacle

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

Discussions similaires

  1. TFDQuery.Post ne met pas à jour mes données.
    Par Helianza dans le forum Composants FMX
    Réponses: 4
    Dernier message: 28/11/2019, 16h59
  2. "SELECT" + guillemets dans le WHERE et requestlive
    Par Nono23 dans le forum Bases de données
    Réponses: 2
    Dernier message: 16/09/2014, 13h57
  3. Réponses: 0
    Dernier message: 07/04/2014, 23h10
  4. Firedac et TFDQuery
    Par Papy214 dans le forum Langage
    Réponses: 2
    Dernier message: 27/11/2013, 18h40
  5. [ACCESS] Syntaxe SQL dans un TQuery avec Requestlive=True
    Par Unusual_FL dans le forum Bases de données
    Réponses: 2
    Dernier message: 28/06/2005, 11h51

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