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 :

Modifier ou supprimer un enregistrement par une requête SQL


Sujet :

Bases de données Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 17
    Points : 11
    Points
    11
    Par défaut Modifier ou supprimer un enregistrement par une requête SQL
    Bonjour;

    Toujours dans la suite de mon TP qui consiste à établir des opérations d'insertion,modification et suppression par des requêtes SQL, j'ai réussi avec l'insertion bien qu'il reste un tout petit problème c'est comment utiliser les dbecits à la place des edits, j'ai tenté à faire une modification et suppression dont voici les prgs :

    Modification :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Procedure TForm1.BitBtn2Click(Sender: TObject);
    begin
    query2.close;
    query2.sql.clear;
    query2.sql.add('update etudient');
    query2.SQL.add('set(code= '+ edit1.text + ',nom= ' + quotedstr(edit2.text) + ',  Date_N = '+ quotedstr(maskedit1.text) + ')');
    query2.SQL.add('where code= '+ edit1.text+'');
    ce que je fais, c'est d'abord cliquer sur le bouton modifier (BitBn2), faire les modifications, ensuite valider en cliquant sur le bouton de l'insertion

    insertion :

    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
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    with query1 do
    begin
    close;
     
     query1.sql.clear;
    query1. sql.add('insert into etudient(code,nom,Date_N) values(' + edit1.text + ',' + quotedstr(edit2.text) + ', ' + quotedstr(maskedit1.text) + ' )');
     try
          ExecSQL;
        except
     
           showmessage('cet enregistrement existe déjà');
     end;
     end;
     end;
    ça ne marche pas, en validant avec le bouton d'insertion, message d'erreur 'violation de clé'.
    non plus aussi

    suppression :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.Button2Click(Sender: TObject);
    begin
    query3.close;
    query3.SQL.clear;
    query3.SQL.add('delete from etudient');
    query3.SQL.add('where code='+edit1.text+'');
    end;
    Merci de votre aide

  2. #2
    Membre confirmé
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Février 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : Belgique

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

    Informations forums :
    Inscription : Février 2006
    Messages : 537
    Points : 460
    Points
    460
    Par défaut
    Bonjour,
    il me semble que tu oublies de doubler les '.

    si la requete sql = where code= 'truc';

    alors dans Delphi tu dois mettre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    query3.SQL.ADD('where code= '''+edit1.text+'''');
    Meme chose pour l'insert.

    André
    Ils ne savaient pas que c'était impossible, alors ils l'ont fait !

  3. #3
    Membre confirmé
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Février 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : Belgique

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

    Informations forums :
    Inscription : Février 2006
    Messages : 537
    Points : 460
    Points
    460
    Par défaut
    Résolu ???

    ???
    Ils ne savaient pas que c'était impossible, alors ils l'ont fait !

  4. #4
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 421
    Points : 5 820
    Points
    5 820
    Par défaut
    salut

    le dbedit sont connecte a un datasource qui lui est en liaison avec un dataset
    se dataset doit etre connecte a un tupdatesql
    dans lesquelle tu definie tes differente requete (insertion ,modification,suppression)

    ca c'est pour le dbedit
    sinon pour ton probleme de requette

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    Procedure TForm1.QueryExec(AQuery : TQuery;cmd,StrErreur : String)
    begin
    with AQuery do
    begin
      if Active Then
      begin
        close;
        sql.clear;
        sql.ADD(cmd);
     try
          ExecSQL;
     except
        if trim(StrErreur) <> '' Then
          showmessage(StrErreur);
      end;
    end;
     
     
    Procedure TForm1.BitBtn2Click(Sender: TObject);
    var
      St : String;
    Const 
       CstUpdEtud = 'update etudient set nom= %1:s ,Date_N = %2:s where code=%0:s  ';
    begin
     St := format(CstEtud,[edit1.text ,quotedstr(edit2.text),quotedstr(maskedit1.text)]);
      QueryExec(query2,St,'');
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
     Const 
       CstInsEtud = 'insert into etudient(code,nom,Date_N) values(%0:s,%1:s,%2:s)';
    var st : String;
    begin
     st := Format(CstInsEtud,[edit1.text,quotedstr(edit2.text),  quotedstr(maskedit1.text) ]);
    QueryExec(query1,St,'cet enregistrement existe déjà');
    end;
     
     
    procedure TForm1.Button3Click(Sender: TObject);
     Const 
       CstDelEtud = 'delete from etudient where code=%s';
    begin
     st := Format(CstDelEtud,[edit1.text]);
     QueryExec(query3,St,'');
    end;
    Sinon ton probleme est du au espace que tu oubli en debut ou fin de ligne definissant tes requettes

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Bonjour à tout le monde;
    Je m'excuse de ne pas avoir repondu ces 2 derniers jours, apparamment c'est reglé pour quelques points, pour d'autres non

    Donc pour l'insertion j'ai tenté d'utiliser les dbedits à la place des edits
    mon prg est le suivant :
    insertion :
    insertion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    with query1 do
    begin
    close;
     
    query1.sql.clear;
    query1. sql.add('insert into etudient(code,nom,Date_N) values( + dbedit1.text + , + dbedit2.text + , + dbedit3.text + ) ');
    end;
    end;
    le programmed s'execute parfaitement, mais des que j'ajoute à la fin l'espression (try.......except), le prg compile sans problème mais à l'execution un message d'erreur 'utilisation incorrecte du mot clé" et le curseur pointe à l'exoression "ExecSQL"
    le pgr avec l''xpression (try.......except)

    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
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    with query1 do
    begin
    close;
     
    query1.sql.clear;
    query1. sql.add('insert into etudient(code,nom,Date_N) values( + dbedit1.text + , + dbedit2.text + , + dbedit3.text + ) ');
    try
    query1.ExecSQL;
    except
    showmessage('erreur');
    end;
    end;
    end.
    pour la modification :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.BitBtn2Click(Sender: TObject);
    begin
    query2.close;
    query2.sql.clear;
    query2.sql.add('update etudient');
    query2.SQL.add('set(code= + dbedit1.text + , nom = + dbedit2.text) + , Date_N = + dbedit3.text) + ');
    query2.SQL.add('where code= dbedit1.text ');
    end;
    C'est pareil comme à l'insertion, le programme s'execute parfaitement, mais si j'ajoute "try.......except" même message d'erreur qu'à linsertion

    pour la suppression, le prg n'a pas du tout marché

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     procedure TForm1.Button2Click(Sender: TObject);
    begin
    query3.close;
    query3.SQL.clear;
    query3.SQL.add('delete from etudient');
    query3.SQL.add('where code:= dbedit1.Text ');
    try
    query3.ExecSQL;
    except
    showmessage('erreur');
    end;
    end;
    end.
    J'ai besoin absolument de votre aide
    Merci à tout le monde

  6. #6
    Membre confirmé
    Avatar de JP.NUAGE
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 769
    Points : 542
    Points
    542
    Par défaut
    Si tu codifies :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    query3.SQL.add('where code:= dbedit1.Text ');
    il y a déjà un pb := c'est du Delphi, pas du SQL. Il manque peut être aussi un ; à la fin de la ligne.

    Enfin il me semble que cette requete va cherche la variable dbedit1.Text, or on ne peut pas avoir de point dans un nom de variable et je ne vois pas où tu l'as déclarée.

    Regarde de nouveau la réponse de andreditdd : inspire toi de sa syntaxe pour corriger la tienne.

    Et si tu as un quelque chose comme IBExpert, pourquoi ne pas tester ton code dans cet outil ? C'est un bon moyen de progresser. Maintenant ca c'est mon opinion

    Dernière minute : Regarde ici
    http://www.developpez.net/forums/d59...xe-sql-direct/ la réponse de ShaiLeTroll pour le passage de paramètres
    Ce qui se conçoit bien s'énonce clairement
    Et les mots pour le dire viennent aisément (Boileau)

  7. #7
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    il y a de nombreuses erreurs de syntaxe je ne reprendrais qu'un ou deux SQL pour exemple

    la première : Les 'Phrases SQL' sont mal construites , point d'arrêt juste après la construction te montrerais que le SQL n'est pas correct
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    query3.close;
    query3.SQL.clear;
    query3.SQL.add('delete from etudient');
    query3.SQL.add('where code='+QuotedStr(dbedit1.Text));
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    query2.sql.add('update etudient');
    query2.SQL.add('set code= '+QuotedStr(dbedit1.text) +' , nom = '+ QuotesStr(dbedit2.text) +' , Date_N = '+QuotedStr(dbedit3.text));
    query2.SQL.add('where code='+QuotedStr(dbedit1.text ));
    // commentaire supplémentaire ici quelque chose de bizarre dans
    //l'update pourquoi mettre code à jour avec la même valeur que celle de
    //recherche

    ceci n'étant valable uniquement pour des strings

    Deuxième point
    je présume que Code est numérique donc dans ce cas pas de QuotedStr
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    query3.SQL.add('delete from etudient');
    query3.SQL.add('where code='+dbedit1.Text);
    ou encore si cela vient d'une valeur numérique, par exemple un SpinEdit, là on doit faire l'opération inverse c'est à dire transformer la valeur numérique en string mais Sans guillemets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    query3.SQL.add('delete from etudient');
    query3.SQL.add('where code='+Inttostr(Spinedit.value));
    Troisième point les dates . alors là c'est beaucoup plus complexe puisque cela dépend beaucoup entre autres de la BDD et de son format . Cela a été maintes fois discuté sur le forum le mieux (qui n'est pas l'ennemi du bien ) c'est de passer par paramètres . je sais , c'est plus long à écrire , mais tellement plus efficace .

    un exemple :

    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
    19
    20
    21
    22
    23
     
    query3.close;
    query3.SQL.clear;
    query3.SQL.add('delete from etudient');
    query3.SQL.add('where code=:C');
    Query3.ParambyName('C').value:=dbEdit1.Text;
     
    //-----------------------------------------
     
    query2.sql.add('update etudient');
    query2.SQL.add('set code=:C , nom =:N , Date_N =:D'); query2.SQL.add('where code=:Z');
    Query2.ParambyName('C').value:=dbEdit1.Text;
    Query2.ParambyName('N').value:=dbEdit2.Text;
    Query2.ParambyName('D').value:=dbEdit3.Text;
    Query2.ParambyName('Z').value:=Edit4.Text; 
    // pourquoi Z (voir remarque plus haut)
    sinon 
    query2.sql.add('update etudient');
    query2.SQL.add('set nom =:N , Date_N =:D');
    query2.SQL.add('where code=:C');
    Query2.ParambyName('C').value:=dbEdit1.Text;
    Query2.ParambyName('N').value:=dbEdit2.Text;
    Query2.ParambyName('D').value:=dbEdit3.Text;
    Dernière remarque , l'utilisation des DBEdit et de leur valeur Text me fait frémir d'inquiétude enfin je ne vois pas le programme .....

    p.s. orthographique (ne le prends pas mal ) : Etudiant
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

Discussions similaires

  1. Modifier ou Ajouter un enregistrement par une requête SQL
    Par Night_Wolf1619 dans le forum Débuter
    Réponses: 31
    Dernier message: 06/11/2013, 15h34
  2. Format d'une date récupérée par une requête sql
    Par ZIED dans le forum Zend Framework
    Réponses: 4
    Dernier message: 24/03/2008, 23h17
  3. Enlever l'unicité par une requète SQL
    Par philnext dans le forum Langage SQL
    Réponses: 6
    Dernier message: 25/06/2007, 14h22
  4. Réponses: 1
    Dernier message: 04/06/2007, 10h23
  5. Réponses: 3
    Dernier message: 01/12/2006, 20h31

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