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 :

Problème avec TSQLQuery : Field not found [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Biologiste
    Inscrit en
    Février 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Biologiste
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Février 2012
    Messages : 6
    Points : 8
    Points
    8
    Par défaut Problème avec TSQLQuery : Field not found
    Bonsoir à tous,

    Je suis un utilisateur de C++ mais j'ai besoin de développer un projet particulier avec Lazarus. J'avais programmé aussi il y a plusieurs années avec Delphi mais j'ai du mal à me remettre au Pascal. Je rencontre un problème avec le composant TSQLQuery qui me donne une erreur de type "SQLQuery: Field not found" après un second affichage de la forme. La partie du code de l'évènement OnShow de la forme est le suivant:

    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
     
    procedure TProcForm.FormShow(Sender: TObject);
    begin
      If GetNumRecords =0 then
      begin
        if MessageDlg('Avertissement','La table des processus est vide !, Voulez-vous saisir des données ?',mtWarning,[mbYes,mbNo],0)=MrNo
           then
              begin
              SetDataChanged(false);
              ActivateProcFormComponents(false);
              Close;
              end;
      end;
     
       With DataModuleDoc.ProcSQLQuery do
       begin
       Close;
       SQL.Text:='Select * from processus order by IDPROC';
       CodeDBEdit.DataField:='CODEPROC';
       CodeNameDBEdit.DataField:='NAMEPROC';
       ProcDescDBMemo.DataField:='PROCCOMMENT';
       Open;
       First;
       end;
     
       SetDataChanged(false);
    A la première vue de la forme pas d'erreur mais si l'on ferme cette forme et que l'on redemande son ouverture j'obtiens un message d'erreur "ProcSQLQuery: Field "CODEPROC" not found".

    Merci d'avance pour vos commentaires

    Bonne soirée à tous

    Biobytes

  2. #2
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    Bonjour

    Je ne pense qu'il ne faut pas assigner DataField.
    Cela est fait automatiquement quand la requête est préparée (ou ouverte).

    Aussi, on déconseille, en général, les requêtes avec SELECT * car si les champs changent cela peut donner des erreurs difficiles à détecter.
    Il faut donc mieux nommer les champs, mais ce n'est pas obligatoire.

    Mais où récupères-tu le résultat de la requête ? Ce n'est pas là qu'il y a une erreur ?
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Biologiste
    Inscrit en
    Février 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Biologiste
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Février 2012
    Messages : 6
    Points : 8
    Points
    8
    Par défaut Suite problème TSQLQuery
    Citation Envoyé par tintinux Voir le message
    Bonjour

    Je ne pense qu'il ne faut pas assigner DataField.
    Cela est fait automatiquement quand la requête est préparée (ou ouverte).

    Aussi, on déconseille, en général, les requêtes avec SELECT * car si les champs changent cela peut donner des erreurs difficiles à détecter.
    Il faut donc mieux nommer les champs, mais ce n'est pas obligatoire.

    Mais où récupères-tu le résultat de la requête ? Ce n'est pas là qu'il y a une erreur ?
    Bonsoir Tintinux,

    Merci bcp pour ta réponse.

    J'ai suivi ton conseil et supprimé les assignations des DataField. Après de multiples tâtonnements, je me suis aperçu que le problème provient d'une requête "Select Count(*) from processus" que j'ai affecté au même composant ProcSqlQuery dans une fonction privée (GetNumRecords) de TProcForm qui devait me permettre de connaître le nombre d'enregistrements dans la base MySQL et donc de savoir si la table est vide.

    J'ai donc supprimé cette fonction et l'affectation "Select Count(*) from processus" à la requête. J'ai cependant entré les noms de champs dans la propriété DataField des composants d'affichage (DBEdit et DBMemo) à l'aide de l'inspecteur d'objet. Le code corrigé devient donc:

    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 TProcForm.FormShow(Sender: TObject);
    begin
       ActivateProcFormComponents(true);
     
       With DataModuleDoc.ProcSQLQuery do
       begin
       SQL.Clear;
       SQL.Text:='Select * from processus order by IDPROC';
       Open;
       end;
     
       SetDataChanged(false);
    end;
    Sais-tu par expérience si Lazarus connaît des problèmes pour gérer les requêtes SQL du type Select Count(*) ?

    Merci d'avance pour tes commentaires

    A+
    Biobytes

  4. #4
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    Sais-tu par expérience si Lazarus connaît des problèmes pour gérer les requêtes SQL du type Select Count(*)
    Non, je ne connais aucun problème

    Pour info, afin d'éviter 2 requêtes il est possible de tester comme ça, s'il est utile de faire quelque chose quand la requête ne retourne rien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ProcSQLQuery.Open ;
    if not ProcSQLQuery.Eof then
       While not ProcSQLQuery.Eof do
          begin
          Action ;
          Next ;
          end
    else
       AutreAction ;
    Mais quel est ton souci maintenant ? Toujours le même message ou un autre ?

    Si c'est le même, et que le champ DbEdit est bien lié à la bonne requête, c'est que la table ne contient pas de champ CODEPROC.
    Vérifie en essayant d'afficher après ouverture de la requête, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ShowMessage ( ProcSqlQuery.FieldByName('CODEPROC').AsString );
    ShowMessage ( ProcSqlQuery.Fields[0].AsString );
    ShowMessage ( ProcSqlQuery.Fields[0].FieldName );
    Si tu donnes tout le code, il sera plus facile de t'aider !
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Biologiste
    Inscrit en
    Février 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Biologiste
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Février 2012
    Messages : 6
    Points : 8
    Points
    8
    Par défaut TSQLQuery et Field not found [Résolu]
    Bonsoir Tintinux,

    Merci pour le snippet de la requête qui ne retourne rien.

    Maintenant je n'ai plus aucun message d'erreur et tout fonctionne parfaitement bien jusqu'à maintenant . Je marque donc le fil de discussion comme résolu.

    La solution était de supprimer la fonction privée qui lançait la requête "Select Count(*) from processus" au moment du OnShow de la fenêtre qui lance la requête "Select * from processus order by IDPROC" afin de remplir les DBEdit et le DBMemo.

    Je ne sais pas pourquoi mais ça marche.

    Encore merci pour ton aide

    Cordialement
    Biobytes

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

Discussions similaires

  1. [CR 2008] Problème avec Parameter Fields
    Par tendre_amie007 dans le forum Débuter
    Réponses: 1
    Dernier message: 25/05/2009, 22h10
  2. Réponses: 3
    Dernier message: 10/04/2009, 17h29
  3. Problème Java RMI - Stubs Not Found
    Par mamatt dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 29/01/2009, 12h57
  4. Problème avec TSQLQuery-DbExpress
    Par patrickSan dans le forum Bases de données
    Réponses: 2
    Dernier message: 13/03/2007, 09h36
  5. Problème avec ADOQuery.Fields[].Value
    Par Gaadek dans le forum Bases de données
    Réponses: 3
    Dernier message: 12/07/2006, 10h28

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