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 :

[SQLite-Zeos] Sélection d'enregistrement [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 206
    Par défaut [SQLite-Zeos] Sélection d'enregistrement
    Bonjour à tous,
    Je souhaite faire une sélection sur une base de données SQLITE et pour cela j'utilise dans un formulaire* :
    - Un contrôle RadioGroup avec 3 options me permettant d'identifier et de choisir le champ qui fera l'objet de la sélection,
    - Un Tedit destiné à renseigner la valeur du critère de sélection (chaîne de caractères),
    - Une base gérée par Zeos (que je peux parcourir sans problèmes) avant de me lancer dans le processus de sélection (TZConnection ZC_Stock, TZQuery ZQ_Stock, DTdatasource Dats_Stock).
    - Une série de contrôle TDB_Edit destiné à afficher la base de donnée et, après sélection, à afficher les résulats corespondant à cette sélection.
    J'ai programmé les lignes de code suivantes*:
    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
    procedure TFormProduit.BT_selectClick(Sender: TObject);
     
    var selchamp1 : String ;
    Var ValueRG : integer;
    Var SQLselect1 : String ;
    Var Nb_EnrSel : String;
    begin
     ValueRG := Integer(RG_choixsel.ItemIndex);
     Case  ValueRG of
     0 : selchamp1 := 'Produits' ;
     1 : selchamp1 := 'Designation' ;
     2 : selchamp1 := 'Categorie'  ;
     end ;
     Label7.caption :=  'N° ' + selChamp1 ;
    // construction de la variable contenant la requête SQL
       SQLselect1 := 'SELECT * from SProduit WHERE ' + selchamp1 + '=' +  QuotedStr(Ed_CritSelect.text) ;  //requête
     
     // exécution de la requête SQL
     Try
     ZQ_Stock.active := False ;
     ZQ_Stock.SQL.Clear ;
     ZQ_Stock.Datasource := Datas_Stock ;
     ZQ_Stock.SQL.text := SQLselect1 ;
     ZQ_Stock.active := True;
     
     
     ZQ_Stock.execSQL ;
     
     finally
      ZQ_Stock.free ;
     end;
    // affichage des résultats de la requête
    //Nb_EnrSel := intToStr(ZQ_Stock.recordcount);
    Label6.caption :=SQLselect1 ; //Nb_EnrSel + ' sélectionnés' ;
     
    // DBED_Produit.text := ZT_Stock.fieldbyname('Produits').asString;
     
    end;
    La construction de la requête a pour résultat (valeur de SQLselect1 :
    Select * from SPRODUIT (nom de la table) WHERE Produits (le nom du champ) = 'Toto' (la valeurs choisie du champ entrée dans le TEDIT
    .
    Lorsque je lance cette procédure, le logiciel se bloque et rien ne se passe. Impossible de localiser l'erreur commise. J'ajoute que la valeur Toto est entourée de simples quotes et non pas de doubles comme dans le gestionnaire de base SQLITE SQlite admin que j'utilise pour tester le résultat de mon code.
    Quelqu'un, en cette période de farniente national, aurait-il une piste ?

    Merci

    R.O.

  2. #2
    Membre expérimenté
    Profil pro
    au repos
    Inscrit en
    Février 2013
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : Saint-Pierre-Et-Miq.

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2013
    Messages : 161
    Par défaut
    hello,

    Essaie ceci :
    à la place de :
    - Open qu'avec des requêtes de type Select.
    - ExecSql qu'avec des requêtes de type Insert, Delete ou Update.

    Amicalement, Nullosse

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 206
    Par défaut
    Bonsoir,
    Merci pour la suggestion. Il y avait en plus d'autres erreurs de code mais cela a marché. Je coche donc la discussion comme "résolue".
    Mais pourquoi donc existe-il toutes ces subtilités dans le langage dans Lazarus ?
    entre un ExecSQL et un Open quelle est l'origine de la différence ?
    Merci encore

    R.O.

  4. #4
    Membre Expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 568
    Par défaut
    Salut

    ExecSQL est là pour exécuter un commande (INSER, UPDATE...) sans retour de données, donc ne convient pas à un SELECT.

    Open est là pour ouvrir un ensemble de données et donc à utiliser avec SELECT.

    Il n'y a pas de subtilité particulière à cela, ça marche pareil dans Delphi.

    En outre,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ZQ_Stock.active := True;
    est équivalent à @+

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  5. #5
    Membre Expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 568
    Par défaut
    Citation Envoyé par OR34a Voir le message
    Bonjour à tous,
    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
    procedure TFormProduit.BT_selectClick(Sender: TObject);
     
    var selchamp1 : String ;
    Var ValueRG : integer;
    Var SQLselect1 : String ;
    Var Nb_EnrSel : String;
    begin
     ValueRG := Integer(RG_choixsel.ItemIndex);
     Case  ValueRG of
     0 : selchamp1 := 'Produits' ;
     1 : selchamp1 := 'Designation' ;
     2 : selchamp1 := 'Categorie'  ;
     end ;
     Label7.caption :=  'N° ' + selChamp1 ;
    // construction de la variable contenant la requête SQL
       SQLselect1 := 'SELECT * from SProduit WHERE ' + selchamp1 + '=' +  QuotedStr(Ed_CritSelect.text) ;  //requête
     
     // exécution de la requête SQL
     Try
     ZQ_Stock.active := False ;
     ZQ_Stock.SQL.Clear ;
     ZQ_Stock.Datasource := Datas_Stock ;
     ZQ_Stock.SQL.text := SQLselect1 ;
     ZQ_Stock.active := True;
     
     
     ZQ_Stock.execSQL ;
     
     finally
      ZQ_Stock.free ;
     end;
    // affichage des résultats de la requête
    //Nb_EnrSel := intToStr(ZQ_Stock.recordcount);
    Label6.caption :=SQLselect1 ; //Nb_EnrSel + ' sélectionnés' ;
     
    // DBED_Produit.text := ZT_Stock.fieldbyname('Produits').asString;
     
    end;
    Il ne faut surtout pas libérer ta requête avec Free, en effet tu récupères les données puis tu libères l'objet requête et donc les données récupérées avec, autant ne rien faire...

    La libération immédiate de l'objet serait légitime avec un ordre de mise à jour (INSERT...) demandé à l'aide de ExecSQL qui ne produirait pas d'ensemble résultat. Je pense que ton code est une reprise mal adapatée d'un autre morceau de code.

    En outre, la libération d'un objet dans un procédure sans qu'il y ait eu d'allocation dans la même procédure est peut être douteux. Est-ce que ZQ_Stock est un objet placé en conception ?

    @+

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

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

Discussions similaires

  1. [CR 10] Sélection d'enregistrements à partir d'un résumé
    Par sylviefrfr dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 14/06/2006, 11h24
  2. Pb de sélection d'enregistrement
    Par fbu78 dans le forum Access
    Réponses: 1
    Dernier message: 04/05/2006, 23h16
  3. [CR9][SQL Server] forcer la sélection à 5 enregistrements
    Par __fabrice dans le forum SAP Crystal Reports
    Réponses: 6
    Dernier message: 02/11/2005, 11h20
  4. Sélection d'enregistrement parmis plusieurs identiques
    Par monnoliv dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 24/09/2005, 15h32
  5. Réponses: 7
    Dernier message: 19/10/2004, 22h40

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