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

Lazarus Pascal Discussion :

Erreur dans une requête paramétrée [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre régulier
    Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 101
    Points : 80
    Points
    80
    Par défaut Erreur dans une requête paramétrée
    Bonjour à toutes et à tous.
    Ma configuration : Windows 10; Lazarus 2.0.6 sur FPC 3.0.4
    Le programme sert à manipuler des normes NF, EN et ISO.
    Un DataModule est créé dans le fichier programme par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.CreateForm(TModuleDonnees, ModuleDonnees);
    Ce DataModule est composé d'un TPQConnection et d'un TSQLTransaction qui sont initialisés grâce à cette procedure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TModuleDonnees.DataModuleCreate(Sender: TObject);
    begin
      ConnexionPQ.DatabaseName := 'aaaaaaa';
      ConnexionPQ.UserName := 'postgres';
      ConnexionPQ.HostName := 'localhost';
      ConnexionPQ.Password := 'xxxxxxx';
      //ConnexionPQ.Connected := true; Automatique lors d'un SQLQuery.Open
      ConnexionPQ.Transaction := TransactionSQL;
      TransactionSQL.DataBase := ConnexionPQ;
      //TransactionSQL.Active := true;  Automatique lors d'un SQLQuery.Open
    end;
    Jusque là tout fonctionne dans l'utilisation de ce module de données par d'autres fiches. Une nouvelle fiche sert à modifier le répertoire de sauvegarde des normes. Sur cette fiche sont déposés un TDBText, qui rappelle le répertoire actuel de sauvegarde à partir d'une requête dans la base de données (cela fonctionne), un TEdit où l'utilisateur précise le nouveau répertoire de sauvegarde et un TButton qui valide le changement et ferme la fiche. Voici le code de ce bouton sans le contrôle de la non nullité du TEdit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    RN := TSQLQuery.Create(nil);
      SN := TDataSource.Create(nil);
      RN.Database := ModuleDonnees.ConnexionPQ;
      SN.DataSet := RN;
      RN.UpdateSQL.Text := 'UPDATE s_ent.t_e_norme_nor SET nor_repertoire=:REP;';
      RN.Params.ParamByName('REP').AsString := ENouveauRepertoire.Text;
      SN.Enabled := true;
      RN.Active := true;
      RN.ExecSQL;
      ModuleDonnees.TransactionSQL.Commit;
      RN.Close;
      ModuleDonnees.TransactionSQL.Active := false;
      ModuleDonnees.ConnexionPQ.Connected := false;
      Close;
    La compilation s'effectue sans sourciller mais à l'utilisation l'erreur suivante surgit :
    Le projet Normes a levé une classe d'exception 'EDatabaseError' avec le message :
    Parameter "REP" not found.
    Erreur qui apparaît aussi en lançant le programme par Normes.exe.
    Votre aide est donc sollicitée pour résoudre ce problème et je vous remercie à l'avance de me dépanner.
    Michel.

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Bonsoir,
    Que vaut RN.Params.Count (ou équivalent) ?
    Et RN.Params[0].AsString := ENouveauRepertoire.Text; fonctionne-t-il ?
    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 !

  3. #3
    Membre régulier
    Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 101
    Points : 80
    Points
    80
    Par défaut
    Merci pour l'intérêt que tu portes à mon problème.
    Que vaut RN.Params.Count (ou équivalent) ?
    Il vaut 0 révélé par un ShowMessage après RN.UpdateSQL.Text :=
    RN.Params[0].AsString := ENouveauRepertoire.Text; fonctionne-t-il ?
    Cela soulève une erreur : List index(0) out of bounds
    Je vais essayer de ne plus créer SQLQuery par programmation mais en déposant le composant dans la fiche et je rends compte.
    Merci encore pour ton aide.
    Michel.

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Voici une piste qui a l'air solide : https://forum.lazarus.freepascal.org...?topic=17725.0.
    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 !

  5. #5
    Membre régulier
    Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 101
    Points : 80
    Points
    80
    Par défaut
    Bonjour.
    Je suis en train de suivre cette piste qui me montre que je n'ai rien compris aux TdataSet et TSQLQuery! Mais je m'accroche.
    Michel.

  6. #6
    Membre régulier
    Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 101
    Points : 80
    Points
    80
    Par défaut
    Bonjour.
    Maintenant cela fonctionne. Voici les modifications apportées, certaines sans conséquence et d'autres plus fondamentales.
    Sur la fiche, dépose d'un DBEdit (DBEReprtoire) et d'un bouton de sauvegarde/quitter (BtnSauvegarderQuitter).
    Procedure de création de la fiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TFicheChangerRepertoire.FormCreate(Sender: TObject);
    begin
      RR := TSQLQuery.Create(nil);
      SR := TDataSource.Create(nil);
      RR.Database := ModuleDonnees.ConnexionPQ;
      SR.DataSet := RR;
      RR.SQL.Text := 'SELECT nor_repertoire FROM s_ent.t_e_norme_nor;';
      RR.DataBase := ModuleDonnees.ConnexionPQ;
      RR.Active := true;
      SR.Enabled := true;
      DBERepertoire.DataSource := SR;
      DBERepertoire.DataField := 'nor_repertoire';
      AncienRepertoire := DBERepertoire.Field.Text;
    end;
    Procedure de l'évènement d'action sur le bouton :
    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 TFicheChangerRepertoire.BtnSauvegarderQuitterClick(Sender: TObject);
    begin
      RR.SQL.Text := 'UPDATE s_ent.t_e_norme_nor SET nor_repertoire = :REP;';
      RR.Params.ParamByName('REP').AsString := DBERepertoire.Field.Text;
      try
        RR.ExecSQL;
        ModuleDonnees.TransactionSQL.Commit;
        ShowMessage('Succès de la mise à jour');
      except on e: Exception do
        ShowMessage(e.Message);
      end;
      RR.Close;
      ModuleDonnees.TransactionSQL.Active := false;
      ModuleDonnees.ConnexionPQ.Connected := false;
      Close;
    end;
    J'ai utilisé le même composant TSQLQuery dans les deux procédures et c'est ce qui a tout changé. Ce que j'en déduis, c'est que le DataSet doit être ouvert par un "SELECT" avant d'utiliser un ExecSQL. Me trompe-je?
    Il ne me reste qu'à lancer cette requête :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE s_ent.t_e_norme_nor ALTER COLUMN nor_repertoire SET DEFAULT DBERepertoire.Field.Text;
    pour modifier la valeur par défaut de "nor_repertoire" et éviter de la taper lors d'une insertion de nouvelle norme.
    Michel.

  7. #7
    Membre régulier
    Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 101
    Points : 80
    Points
    80
    Par défaut
    Pas trop difficile cette fois-ci. Voici le code de l'unité :
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    unit Unite_NouveauRepertoire;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, Forms, Controls, Graphics, Dialogs, DBCtrls, StdCtrls,
      DBGrids, sqldb, db, IniFiles;
     
    type
     
      { TFicheChangerRepertoire }
     
      TFicheChangerRepertoire = class(TForm)
        BtnSauvegarderQuitter: TButton;
        DBERepertoire: TDBEdit;
        DBTAncienRepertoire: TDBText;
        LAncienRepertoire: TLabel;
        LRepertoireActuel: TLabel;
        procedure BtnSauvegarderQuitterClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
     
      public
     
      end;
     
      const
      C_Position = 'Position';
      C_Largeur = 'Largeur';
     
    var
      FicheChangerRepertoire: TFicheChangerRepertoire;
      INI: TINIFile;
      LargeurFiche: integer;
      RR, RN : TSQLQuery;
      SR, SN : TDataSource;
      AncienRepertoire, NouveauRepertoire : string;
     
    implementation
     
    {$R *.lfm}
     
    uses Unite_ModuleDonnees;
     
    { TFicheChangerRepertoire }
     
    procedure TFicheChangerRepertoire.FormCreate(Sender: TObject);
    begin
      INI  :=  TINIFile.Create('Normes.ini');
      try
        LargeurFiche := INI.ReadInteger(C_Largeur, 'LargeurFicheChangerRepertoire', 440);
      finally
        INI.Free;
      end;
      FicheChangerRepertoire.Left:= round((Screen.Width - LargeurFiche)/2);
      FicheChangerRepertoire.Height := 206;
      FicheChangerRepertoire.Width := LargeurFiche;
      RR := TSQLQuery.Create(nil);
      SR := TDataSource.Create(nil);
      RR.Database := ModuleDonnees.ConnexionPQ;
      SR.DataSet := RR;
      RR.SQL.Text := 'SELECT nor_repertoire FROM s_ent.t_e_norme_nor;';
      RR.DataBase := ModuleDonnees.ConnexionPQ;
      RR.Active := true;
      SR.Enabled := true;
      DBTAncienRepertoire.DataSource := SR;
      DBTAncienRepertoire.DataField := 'nor_repertoire';
      DBERepertoire.DataSource := SR;
      DBERepertoire.DataField := 'nor_repertoire';
      AncienRepertoire := DBERepertoire.Field.Text;
    end;
     
    procedure TFicheChangerRepertoire.BtnSauvegarderQuitterClick(Sender: TObject);
    begin
      if (DBERepertoire.Field.Text = '') then
         begin
           ShowMessage('Renseigner préalablement le nouveau répertoire');
           Exit;
         end;
      if DBERepertoire.Field.Text = AncienRepertoire then
         begin
           ShowMessage('Rien ne change');
           Exit;
         end;
      NouveauRepertoire := DBERepertoire.Field.Text;
      RR.SQL.Text := 'UPDATE s_ent.t_e_norme_nor SET nor_repertoire = :REP;';
      RR.Params.ParamByName('REP').AsString := DBERepertoire.Field.Text;
      try
        RR.ExecSQL;
        ModuleDonnees.TransactionSQL.Commit;
        ShowMessage('Changement du répertoire de stockage des normes effectué');
      except on e: Exception do
        ShowMessage(e.Message);
      end;
      RR.SQL.Text := 'ALTER TABLE s_ent.t_e_norme_nor ALTER COLUMN nor_repertoire SET DEFAULT :DEFAUT;';
      RR.Params.ParamByName('DEFAUT').AsString := NouveauRepertoire;
      try
        RR.ExecSQL;
        ModuleDonnees.TransactionSQL.Commit;
        ShowMessage('Mise à jour du répertoire par défaut effectuée');
      except on e: Exception do
        ShowMessage(e.Message);
      end;
      RR.Close;
      ModuleDonnees.TransactionSQL.Active := false;
      ModuleDonnees.ConnexionPQ.Connected := false;
      Close;
    end;
     
    end.
    Merci à Tourlourou pour son aide.

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

Discussions similaires

  1. Erreur dans une requète
    Par phoque.r dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/04/2007, 14h10
  2. #Erreur dans une requête avec une fonction personnalisée
    Par pguiheu dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 04/07/2006, 15h45
  3. [MySQL] Erreur dans une requête
    Par sagitarium dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 13/05/2006, 21h38
  4. [MySQL] Erreur dans une requête sql
    Par Goundy dans le forum PHP & Base de données
    Réponses: 37
    Dernier message: 30/01/2006, 16h08
  5. [VBA] Erreur dans une requête
    Par Damsou dans le forum Access
    Réponses: 31
    Dernier message: 21/06/2005, 17h04

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