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 :

Mise a jour d'une table


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 450
    Par défaut Mise a jour d'une table
    N'ayant aucune expérience dans les bases de données, je vous expose mon problème qui va certainement vous paraître trivial.

    Application développée avec Delphi 11.3 Community en 32 bits pour windows en VCL. Base de données MySQL connexion avec les objets FireDac (fonctionne très bien).

    J'ai une table d'une base qui contient ID d'un objet pour s'y retrouver dans la base, 3 champs integer qui contiennent des notes de 0 à 20, un champ 'notetotale' que j'ai déjà calculé et un champ integer 'classement' que je veux remplir avec la place de l'objet dans le classement par rapport à notetotale .

    Je fais un FDQuery avec une commande SQL pour remplir cette table et je l'ordonne par rapport à 'notetotale'. Ca c'est bon.
    Je voudrais maintenant balayer le FDQuery pour calculer le classement et remplir le champ 'classement', je pense pouvoir le faire via FieldByName et/ou FieldValues.

    Mais là je n'aurai modifié que la table en mémoire et pas la table de la base (il me semble) comment faire pour enregistrer les modification dans la table ?

    Merci.
    Mon approche n'est peut-être pas la bonne...

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 450
    Par défaut
    Mon approche ne doit pas être la bonne car au premier essai d'écriture d'une place on me dit que mon ensemble de données n'est pas en mode Edition ou Insertion...

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 599
    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 599
    Billets dans le blog
    65
    Par défaut
    Si tu fournissais la structure de la table ?
    un champ 'notetotale' que j'ai déjà calculé et un champ integer 'classement'
    ces deux champs me choquent, c'est pour cela que j'en fais la demande.

    Notetotale c'est N1+N2+N3 donc pas la peine de la stocker.
    Il existe en MySQL des fonctions de fenêtrage ( RANK() OVER() ) qui permettrait l'obtention du classement

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    L'explication n'est pas forcément évidente à comprendre

    L'erreur c'est l'absence de Edit() ou Insert() qui provoquera une erreur sur la modification d'un champ

    Soit tu passes par Edit / FieldByName / Post (et cela utilise les mécaniques de mise à jour de FireDAC)
    Soit tu passes par un AUTRE SQLde type UPDATE SET WHRE s'utilise via ParamByName et non FieldByName


    Et effectivement, ce travail doit pouvoir se faire entièrement en SQL sans devoir coder de boucle en Delphi
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 450
    Par défaut
    La structure de la table est très simple :
    Nom : notesplus.png
Affichages : 330
Taille : 19,0 Ko

    Le total pourraient être calculé à la volée effectivement mais j'avance pas à pas !

    Je vais essayer de voir les fonctions RANK et OVER de Sergio, mais j'ai encore beaucoup de mal à créer mes commandes SQL.

    Edit / FieldByName / Post cela me rappelle des choses ce sera peut être ma solution.

    Merci, je verrai ça demain !!

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 599
    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 599
    Billets dans le blog
    65
    Par défaut
    C'est bien ce que je pensais, d'un point de vue administrateur de base de données, trois colonnes sont inutiles et même potentiellement peuvent être fausses !

    Ce premier SQL pour montrer comment obtenir deux de ces colonnes (totalcalcule, Ecart)
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT  Photo_id,note1,note2,note3,note1+note2+note3 AS totalcalcule,GREATEST(note1,note2,note3)-LEAST(note1,note2,note3) AS Ecart
    FROM notes
    - En lettres capitales, les mots clés
    AS, est optionnel, par contre nommer l'alias est fortement recommandé
    GREATEST
    LEAST

    Le Rang est un peu plus complexe (je maitrise peu MySQL et encore moins les fonctions de fenêtrage, quel que soit le SGBD)
    un petit essai s'impose, je n'ai pas tout à fait respecté les indications, mais bon, je maitrise mal l'outil HeidiSQL (écrit en Delphi ) utilisé. [Edit] utilisation de DBeaver pour coller plus à la demande

    Ci-dessous, un script comme je les aime pour proposer un test à quelqu'un :
    Code SQL : 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
     
    CREATE TABLE `notes` (
      `photo_id` int(11) NOT NULL AUTO_INCREMENT,
      `Note1` tinyint(4) DEFAULT 0,
      `Note2` tinyint(4) DEFAULT 0,
      `Note3` tinyint(4) DEFAULT 0,
      PRIMARY KEY (`photo_id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
    -- Nota bene : une table devrait toujours avoir un index primaire 
    COMMIT;
    -- j'utilise le fait d'avoir un autoincrément pour ne pas me soucier de photo_id
    INSERT INTO notes (Note1,Note2,Note3) VALUES
    	 (10,8,5),
    	 (5,8,3),
    	 (9,8,7);
    COMMIT;

    L'image écran confirme mes suppositions de départ (avant normalisation de la table
    Nom : Capture.PNG
Affichages : 313
Taille : 9,8 Ko

    enfin pas tout à fait puisque les lignes avec le meilleur totalcalcule sont en dernier, il suffit de jouer sur l'ORDER BY pour obtenir le résultat souhaité
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT 
      RANK() OVER (ORDER BY Totalcalcule DESC) AS place,
      photo_id,note1,note2,note3,note1+note2+note3 AS totalcalcule, 
      GREATEST(note1,note2,note3)- LEAST(note1,note2,note3) AS Ecart
    FROM notes
    Voilà comment, sans une ligne de code on aura, un classement toujours au point dès qu'une modification sera apportée à la table.

    Nom : Capture.PNG
Affichages : 304
Taille : 20,1 Ko
    * Image DBeaver

  7. #7
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 450
    Par défaut
    Merci Sergio pour ce petit cours de SQL. Je découvre ou redécouvre plein de choses.

    Concernant
    trois colonnes sont inutiles et même potentiellement peuvent être fausses !
    Je comprend ce que tu veux dire, mais cette base est locale, je suis le seul utilisateur et je suis sûr que les données ne seront pas modifiées pendant ma session.
    Je n'ai pas les bons reflexes pour les colonnes calculées.

    J'essaie de mettre ça en pratique !!

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

Discussions similaires

  1. Mise à jour d'une table
    Par smotte76 dans le forum Access
    Réponses: 2
    Dernier message: 31/10/2005, 18h13
  2. Mise à jour d'une table
    Par bath dans le forum Oracle
    Réponses: 5
    Dernier message: 19/10/2005, 12h01
  3. Mise à jour d'une table avec un fichier csv
    Par blackangel dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 26/05/2005, 14h46
  4. Réponses: 5
    Dernier message: 06/01/2005, 12h07
  5. mise à jour d'une table d'interbase sous delphi
    Par kouraichi35 dans le forum Bases de données
    Réponses: 2
    Dernier message: 19/10/2004, 13h09

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