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 :

Modifier ou Ajouter un enregistrement par une requête SQL


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2007
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 159
    Par défaut Modifier ou Ajouter un enregistrement par une requête SQL
    le code pour l'ajoute marche très bien si l'enregistrement n'existe pas on l'ajoute mais si l'enregistrement existe et différent on doit le maitre ajoure

    le code de modification ou de la mise ajour ne marche pas j'ai des erreurs de syntaxe c'est le code apres le ELSE

    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
    ZQuery1.SQL.Text:='INSERT INTO tblSystems(NAME,PROVIDERID,KEYINDEX,KEY,COMMENTS) VALUES (:pN,:pP,:pKI,:pK,:pC)';
    if not Ztable2.locate('Name;ProviderID;KeyIndex;key',VarArrayOf([System1,provider1,index1,key1]),[])
    then
    begin
                    // ajouter les données
    ZQuery1.Connection.StartTransaction;
    ZQuery1.ParamByName('pN').Value := System1;
    ZQuery1.ParamByName('pP').Value := provider1;
    ZQuery1.ParamByName('pKI').Value := index1;
    ZQuery1.ParamByName('pK').Value := key1;
    ZQuery1.ParamByName('pC').Value :=DateTimeToStr(now);
    ZQuery1.ExecSQL;
    end else
                 // Maitre ajour les données
    if Ztable2.locate('Name;ProviderID;KeyIndex,key',VarArrayOf([System1,provider1,index1,key1]),[])
    then if Ztable2.FieldByName('Name').Value <> key1
    then
    begin
    ZQuery1.close;
    ZQuery1.sql.clear;
    ZQuery1.SQL.Add('UPDATE tblSystems');
    ZQuery1.SQL.Add('SET KEY= :key1');
    ZQuery1.SQL.Add('WHERE Name = :System1 , ProviderID = :provider1 , KeyIndex = :index1');
    ZQuery1.ExecSQL;
    end;
    de l'aide svp et merci d'avance

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Tu ne renseignes pas les paramètres de ta query c'est normal que cela ne fonctionne pas (:key1, :system1, etc ...)
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  3. #3
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 940
    Billets dans le blog
    6
    Par défaut
    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
    if Ztable2.locate('Name;ProviderID;KeyIndex;key',VarArrayOf([System1,provider1,index1,key1]),[])
    then begin // update 
      if Ztable2.FieldByName('Name').Value <> key1
      then begin
        ZQuery1.close;
        ZQuery1.sql.clear;
        ZQuery1.SQL.Add('UPDATE tblSystems');
        ZQuery1.SQL.Add('SET KEY= :key1');
        ZQuery1.SQL.Add('WHERE Name = :System1 , ProviderID = :provider1 , KeyIndex = :index1');
        // il manque la définition des valeurs des paramètres ?
        ZQuery1.ExecSQL;
      end;
    end
    else begin // insert
      ZQuery1.Connection.StartTransaction;
      ZQuery1.SQL.Text:='INSERT INTO tblSystems(NAME,PROVIDERID,KEYINDEX,KEY,COMMENTS) VALUES (:pN,:pP,:pKI,:pK,:pC)';
      ZQuery1.ParamByName('pN').Value := System1;
      ZQuery1.ParamByName('pP').Value := provider1;
      ZQuery1.ParamByName('pKI').Value := index1;
      ZQuery1.ParamByName('pK').Value := key1;
      ZQuery1.ParamByName('pC').Value :=DateTimeToStr(now);
      ZQuery1.ExecSQL;
    end;
    Pour la syntaxe de la clause UPDATE, il faut sûrement plutôt
    UPDATE table SET a=1, b=2 WHERE k=key1
    ou
    UPDATE table SET a=1 WHERE k=key1 and n=name1 (aux parenthèses près)
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 660
    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 660
    Billets dans le blog
    65
    Par défaut
    De plus que le SQL est incorrect dans sa clause where!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ZQuery1.SQL.Add('UPDATE tblSystems');
    ZQuery1.SQL.Add('SET KEY= :key1');
    ZQuery1.SQL.Add('WHERE Name = :System1 AND ProviderID = :provider1 AND KeyIndex = :index1');

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 660
    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 660
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    De plus que le SQL est incorrect dans sa clause where!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ZQuery1.SQL.Add('UPDATE tblSystems');
    ZQuery1.SQL.Add('SET KEY= :key1');
    ZQuery1.SQL.Add('WHERE Name = :System1 AND ProviderID = :provider1 AND KeyIndex = :index1');
    je me cite , et puisqu'il faut mâcher le travail avant le execsql il ne faut pas oublier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ZQuery1.paramByName('Key1').asxxxx :=Key1
    ZQuery1.paramByName('System1').asxxxx :=System1
    ZQuery1.paramByName('Provider1').asxxxx :=Key1
    ZQuery1.paramByName('KeyIndex').asxxxx :=index1
    plutôt que d'utiliser des .Value , il vaut mieux mettre le type d'où mes asxxxx
    dans le code je crois voir qu'il s'agit uniquement de AsString;

    il y a encore une erreur dans le locate
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if Ztable2.locate('Name;ProviderID;KeyIndex;key',VarArrayOf([System1,provider1,index1,key1]),[])

  6. #6
    Membre confirmé
    Inscrit en
    Août 2007
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 159
    Par défaut
    @SergioMaster

    Merci j' ai corrigé exactement comme tu le dit il n y a plus d'erreur maintenant

    mais il ne met ajour aucun enregistrement ,j'ai mis des arrêt pour voir si il exécute les requête oui il les exécutée ,,peut être que le problème et dans les composants zeolib ?

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Par défaut
    Si tu es toujours avec SQLite, au lieu de faire un...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if Ztable2.locate ... then begin
      // SQL UPDATE
    end
    else begin
     // SQL INSERT
    end;
    ...tu peux simplifier avec un UPDATE suivi d'un INSERT du genre (je n'ai pas analysé tes requêtes en profondeur, il faut sûrement adapter un peu):
    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
     
    // Fais la mise à jour uniquement si l'enregistrement existe dans la BDD:
    ZQuery1.SQL.Clear;
    ZQuery1.SQL.Add('UPDATE tblSystems');
    ZQuery1.SQL.Add('SET KEY= :key1');
    ZQuery1.SQL.Add('WHERE Name = :System1 AND ProviderID = :provider1 AND KeyIndex = :index1');
    ZQuery1.paramByName('Key1').AsString := Key1
    ZQuery1.paramByName('System1').AsString := System1
    ZQuery1.paramByName('Provider1').AsString := Key1
    ZQuery1.paramByName('KeyIndex').AsString := index1
    ZQuery1.ExecSql;
     
    // Fais une insertion uniquement si l'enregistrement n'existe pas dans la BDD
    ZQuery1.SQL.Text:='INSERT INTO tblSystems(NAME,PROVIDERID,KEYINDEX,KEY,COMMENTS) VALUES (:pN,:pP,:pKI,:pK,:pC)';
    ZQuery1.SQL.Add('WHERE NOT EXISTS (');
    ZQuery1.SQL.Add(' SELECT 1 FROM tblSystems');
    ZQuery1.SQL.Add('  WHERE Name = :pN1 AND ProviderID = :pP1 AND KeyIndex = :pKI1 AND key = :pK1');
    ZQuery1.SQL.Add(')');
    ZQuery1.paramByName('pN').AsString := ...
    ZQuery1.paramByName('pP').AsString := ...
    ZQuery1.paramByName('pKI').AsString := ...
    ZQuery1.paramByName('pK').AsString := ...
    ZQuery1.paramByName('pN1').AsString := ...
    ZQuery1.paramByName('pP'1).AsString := ...
    ZQuery1.paramByName('pKI1').AsString := ...
    ZQuery1.paramByName('pK1').AsString := ...
    ZQuery1.ExecSQL;

  8. #8
    Membre confirmé
    Inscrit en
    Août 2007
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 159
    Par défaut
    j'ai modifier comme ça et j'ai toujours la même erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if Ztable2.locate('Name;ProviderID;KeyIndex,key',VarArrayOf([System1,provider1,index1,key1]),[])
    then if Ztable2.FieldByName('Name').Value <> key1
    then
    begin
    ZQuery1.close;
    ZQuery1.sql.clear;
    ZQuery1.SQL.Add('UPDATE tblSystems SET KEY= :QuotedStr(key1)WHERE Name = :QuotedStr(System1) , ProviderID = :QuotedStr(provider1) , KeyIndex = :QuotedStr(index1)');
    ZQuery1.ExecSQL;
    end;


  9. #9
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Avant de continuer je te conseil quand même de lire la section

    Débuter avec le SQL

    Puis de lire les tutos sur Delphi et les bases de donnes pour voir le fonctionnement des paramètres ou de chercher sur le forum, il y a une foule d'exemple (Paramètres que tu utilises dans la partie Insert de ton code)
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ZQuery1.SQL.Add('UPDATE tblSystems SET KEY= :QuotedStr(key1)WHERE Name = :QuotedStr(System1) , ProviderID = :QuotedStr(provider1) , KeyIndex = :QuotedStr(index1)');
    Faut pas mettre de code Delphi dans les requêtes-mêmes !

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

Discussions similaires

  1. Impossible d'ajouter des enregistrements via une requête
    Par roman33 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 05/06/2009, 21h20
  2. Modifier ou supprimer un enregistrement par une requête SQL
    Par afatdz dans le forum Bases de données
    Réponses: 6
    Dernier message: 29/09/2008, 09h01
  3. [ACCESS] Ajouter un enregistrement dans une requête multi-table
    Par access_balou dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 23/09/2008, 14h43
  4. Enlever l'unicité par une requète SQL
    Par philnext dans le forum Langage SQL
    Réponses: 6
    Dernier message: 25/06/2007, 14h22
  5. Réponses: 1
    Dernier message: 04/06/2007, 10h23

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