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 :

Problème UPDATE et Edit


Sujet :

Delphi

  1. #1
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 219
    Par défaut Problème UPDATE et Edit
    Bonjour à tous,
    J'ai un nouveau problème à vous soumettre. Contexte : BDD Sqlite gérée par Delphi 10.2 et contrôles Zeos.
    Tout le monde connaît l'instruction UPDATE :
    UPDATE table SET nom_colonne_1 = 'nouvelle valeur' WHERE condition
    Question : comment renseigner 'nouvelle valeur' lorsque cette valeur est le contenu d'une zone de saisie genre TEdit ou autre ?
    Pourquoi ce code ne fonctionne-t-il pas ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    With Datas.QCumul do
      begin
        SQL.Clear;
        SQL.Text := 'UPDATE tblCumul SET Total LIKE' + QuotedStr(edtMontant.Text + '%') + 'WHERE Num_compte = 9000'';
        ExecSql;
    end;
    Dernière minute : ce code-ci fonctionne très bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    With Datas.QCumul do
      begin
        SQL.Clear;
        SQL.Text := 'UPDATE tblCumul SET Total = ' + QuotedStr(edtMontant.Text) + 'WHERE Num_compte = 9000';
        ExecSql;
    end;
    Donc maintenant autre question : les montants doivent se cumuler dans Total au fur et à mesure des enregistrements. Comment faire ?
    Voilà c'est tout.
    Merci.
    Bonnes fêtes de fin d'année à tous

  2. #2
    Membre chevronné Avatar de der§en
    Homme Profil pro
    Bretagne
    Inscrit en
    Septembre 2005
    Messages
    998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bretagne
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 998
    Par défaut
    Regardes du côté des TRIGGERS: https://www.sqlite.org/lang_createtrigger.html ou en fonction de la structure de ta base, tu peux aussi regarder du côté des champs calculés !

  3. #3
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 982
    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 : 13 982
    Par défaut
    Si edtMontant contient le montant incremental et non le cumul, suffit de le faire ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'UPDATE tblCumul SET Total = Total +' + QuotedStr(edtMontant.Text) + 'WHERE Num_compte = 9000';
    un SQL comme celui-ci dessus sera similaire à celui que l'on définirait dans un TRIGGER

    Sinon manipuler des nombres en texte, cela peut être délicat en fonction du séparateur décimal

    Tu devrais utiliser des paramètres, une valeur venant d'un Edit peut être mal saisie, pire on pourrait faire une injection SQL comme '10 #', cela permet de supprimer le WHERE, ta compta serait totalement détruite par ce simple texte non contrôlé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SQL.Text := 'UPDATE tblCumul SET Total = Total + :pMontant WHERE Num_compte = 9000';
    ParamByName('pMontant').AsFloat := StrToFloat(edtMontant.Text); // ou StrToFloatDef,
    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

  4. #4
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 219
    Par défaut
    Merci ShaiLeTroll. Bizarrement j'avais trouvé la 1ère solution qui fonctionne parfaitement.
    Je n'ai pas encore essayé la solution avec les paramètres. J'arrête là pour ce soir.
    Cordialement et bonnes fêtes

  5. #5
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 569
    Billets dans le blog
    65
    Par défaut
    Bonjour,
    Toujours privilégier, même en SQLite et donc mono-utilisateur, l'utilisation de paramètres.

    Par contre, j'aurais à redire sur le fait que la colonne soit un string au lieu d'être NUMERIC.
    Pourquoi ? Simple, imaginons que tu veuilles faire un SELECT * FROM TABLCUMUL ORDER BY pMontantet j'ai aussi à redire sur cette table qui, AMHA, n'a pas sa place dans la BDD. Le cumul des montants, à mon avis, c'est la somme des versements/opérations, donc un
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT SUM(Montant) FROM tblVersements where Num_compte = 9000
    ou encore, ce SQL
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT NUM_COMPTE,SUM(Montant) FROM tblVersements GROUP BY NUM_COMPTE
    qui serait l'équivalent de TablCumul

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/06/2009, 00h25
  2. update une ligne de gridview sans passer par edit
    Par pseudo88 dans le forum ASP.NET
    Réponses: 8
    Dernier message: 16/03/2009, 12h52
  3. Un EDIT/UPDATE me crée des doublons
    Par apprenti46 dans le forum VBA Access
    Réponses: 2
    Dernier message: 29/09/2008, 13h58
  4. SQL Mise à jour ou UPDATE/EDIT
    Par Jeannot45 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 25/10/2007, 12h59
  5. IBdataset edit, delete, update :help:
    Par nek_kro_kvlt dans le forum Bases de données
    Réponses: 2
    Dernier message: 05/10/2006, 14h55

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