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 :

[FIREDAC][SQLite] Petits problèmes à la suppression et à la lecture des données


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut [FIREDAC][SQLite] Petits problèmes à la suppression et à la lecture des données
    Bonjour, je suis entrain de m'exercer pour apprendre la gestion d'un BDD. Voila la structure de mon application test

    Nom : 2018-11-11_110918.jpg
Affichages : 587
Taille : 81,2 Ko

    Pour créer ma table j'ai utilisé FDQueryCreateTable avec la commande SQL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE IF NOT EXISTS tbl_categories ( 
     id INTEGER PRIMARY KEY AUTOINCREMENT,
     left_id SMALLINT UNSIGNED NOT NULL,
     right_id SMALLINT UNSIGNED NOT NULL,
     level SMALLINT UNSIGNED NOT NULL, 
     title VARCHAR(65) NOT NULL, 
     description VARCHAR(150) NOT NULL 
    );
    Puis clic droit et exécuter. Jusque la pas de soucis

    Pour insérer des données, le code SQL suivant :

    INSERT INTO tbl_categories (title, description, level, left_id, right_id) VALUES (:Title, :Description, :Level, :Left_id, :Right_id)Associer au bouton ajouter

    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 TfrmPrincipale.btnInsertClick(Sender: TObject);
    begin
      With FDQueryInsert do
      begin
        ParamByName('Title').AsString := Edit1.Text;
        ParamByName('Description').AsString := Edit2.Text;
        ParamByName('Level').AsInteger := 0;
        ParamByName('Left_id').AsInteger := 1;
        ParamByName('Right_id').AsInteger := 2;
        ExecSQL();
      end;
      FDQuerySelect.Close();
      FDQuerySelect.Open;
    end;
    jusque là ca va

    Nom : 2018-11-11_111414.jpg
Affichages : 563
Taille : 21,1 Ko

    Par contre lorsque je clic sur le bouton supprimer du BindNavigator
    1) L'item supprimé est toujours le premier de la liste et ce quelque soit celui qui est sélectionné dans le listview
    2) L'affichage du Listview n'est pas automatiquement mise à jour. (Même en cliquant sur le bouton refresh du BindNavigator)

    Je dois quitter et redémarrer l'application pour visualiser les changements

    Ensuite, la suppression n'est pas toujours prise en compte (comme sur la capture suivante Test 2, n'a pas été supprimé par exemple).
    Ensuite je ne sais pas pourquoi, d'un coup, les données ne veulent plus s'afficher alors que ma connexion est bien active et que le fichier est présent.

    Nom : 2018-11-11_112737.jpg
Affichages : 530
Taille : 25,8 Ko

    Nom : 2018-11-11_112810.jpg
Affichages : 511
Taille : 89,7 Ko


    Note : Pour le Binding, j'ai utilisé l'assistant. Dans les options de connexion j'ai la persistance des données active

    Ma question est donc qu'est ce j'ai oublié de faire ??? Je n'arrive pas à comprendre ce qu'il me manque.

    Merci d'avance

    Bon dimanche
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 657
    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 657
    Billets dans le blog
    65
    Par défaut
    Bonjour (ou plutôt re)

    Ta liste n'est pas synchronisée (synch <-> * ton bindsourceDB)
    C'est, à mon avis la cause de tes divers problèmes

    Attention : A ma souvenance lorsque tu vas faire cette liaison tu risques d'avoir un message te disant qu'il va écraser tes anciens liens, accepte puis vérifie

  3. #3
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Merci Serge

    Nom : 2018-11-11_121555.jpg
Affichages : 514
Taille : 16,3 Ko

    La suppression fonctionne maintenant et le ListView se synchronise. Mais au lancement de l'application le ListView reste vide.

    Nom : 2018-11-11_121625.jpg
Affichages : 496
Taille : 11,6 Ko

    Le BindNavigator ne s'active que lorsque je rajoute un nouvel élément et là Les données s'affichent

    Nom : 2018-11-11_122112.jpg
Affichages : 504
Taille : 23,4 Ko

    Ce qui est bizarre c'est qu'avec un autre test et une connexion MySql je n'ai pas rencontré ces soucis. Je vais comparer pour voir. Et je vais (re)lire quelques PDF que j'ai sous le coude.
    Je pense que je vais recommencer depuis le début, point par point cet après midi.

    Merci

    Bon appétit
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  4. #4
    Membre Expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Par défaut
    Bonjour

    Avec le bon lien entre TListView, TFDQuery et TBindNabvigator, tu ne devrais pas avoir ce soucis : la liste devrait el et bien se charger à l'ouverture de la table.

    As-tu fais un peu de Pascal dans ton source ou tout via l'IDE ?

  5. #5
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par pprem Voir le message
    Bonjour

    Avec le bon lien entre TListView, TFDQuery et TBindNabvigator, tu ne devrais pas avoir ce soucis : la liste devrait el et bien se charger à l'ouverture de la table.

    As-tu fais un peu de Pascal dans ton source ou tout via l'IDE ?
    Bonjour Patrick

    Tout par l'assistant le seul bout de code c'est celui du bouton "btnInsert"

    Citation Envoyé par SergioMaster Voir le message
    c'est donc bien ce que je pensais

    Vérifie que le autoactive est à true pour le lien (synchro)
    T'es le effectivement la propriété "Active" de mon "FBQuerySelect" n'était pas activée. Vu que je suis passé par l'assistant LiveBinding je n'y ai pas prêté attention. Surtout c'est que ça a marché au début et d'un coup plus rien. Je me demande quel composant ou quelle manipulation j'ai faite pour que cela modifie cette propriété entre deux.

    Il va falloir que je sois plus à l'affût de ce genre de petites choses.

    Merci encore
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 657
    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 657
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    la propriété "Active" de mon "FBQuerySelect" n'était pas activée
    je n'y avais pas vraiment fait allusion bien que j'y avais pensé cela me semblait trop évident.
    Je me demande quel composant ou quelle manipulation j'ai faite pour que cela modifie cette propriété entre deux.
    tu as du avoir le message quand tu as mis en synchronisation ta liste ? c'est certainement là qu'il y a pu y avoir désactivation de ta table il faudrait vérifier cette hypothèse

    je n'avais fait que répondre à la problèmatique LiveBindings maintenant il y a autre chose qui me "choque" ou plus exactement que tu peux améliorer.
    Tu utilises deux querys pour tes données , plus un rafraichissement dans ta partie code, il y a mieux et plus facile
    - Tu modifies le FDQuerySelect SELECT id,title, description, level, left_id, right_id FROM TBL_categories (on aura besoin de la colonne id)
    - tu ajoutes un FDUpdateSQL
    - Tu renseignes la propriété UpdateObject de FDQuerySelect avec FDUpdateSQL1
    - double clic ensuite sur le FDUpdateSQL et génère les commandes (sachant qu'ensuite tu peux modifier ces commandes de façon plus "personnelle")
    - ensuite plutôt que programmer le btnInsert , tu utilises l'évènement OnNewRecord pour initialiser les colonnes , donc plus besoin du bouton [Ajouter] le plus du bindnavigator suffit avec le bouton de validation pour confirmer ou non la saisie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure TForm23.FDQuery1NewRecord(DataSet: TDataSet);
    begin
      // plusieurs écoles pour cette partie 
        Dataset.FieldByName('Level').AsInteger := 0;
        Dataset.FieldByName('Left_id').AsInteger := 1;
        Dataset.FieldByName('Right_id').AsInteger := 2;
     
     // ou FdQuery1.FieldByName('Level')  
     // ou Dataset['level']
    end;
    maintenant, si tu tiens à passer par une requête Insert libre à toi mais avec le composant FDUpdateSQL tu as tout loisir d'utiliser les "commandes de table"
    FDQuery1. Edit, Post, Insert ou Append, Delete

    En fait, FDTable agit comme cela (sauf que c'est plus "figé"), un FDTable n'est qu'une requête SELECT * FROM et génére les SQL comme le générateur (image) le fait (bon cela dépend aussi de petites options upWhereKeyOnly, upWhereAll etc..). Dans un cas "simple" comme ce que tu nous montres le FDTable est tout aussi utilisable. Le couple FDQUery+FDUpdateTable (c'est valable aussi pour BDE, ZEOSDBO ...) est beaucoup plus intéressant dés que la Query est plus complexe (genre jointures de tables).

    Seule chose que je n'ai pas encore essayé avec Firedac (et qu'il semble possible de faire) une requête avec plusieurs commandes SQL

    Dernière chose, dans ton code pour le bouton [Ajouter]
    tu fais un refresh de la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      FDQuerySelect.Close();
      FDQuerySelect.Open;
    hypothèse à vérifier : mon "astuce" sur le lien LinkListControlToField1
    Avant la commande d'insertion tu mets LinkListControlToField1.Active:=False;(un équivalent à la commande VCL Query1.DisableControls mais uniquement pour le lien)

    [Edit] Au temps pour cette hypothèse, après essais, l'ensemble de données n'est pas rafraichi.
    En faisant les tests, un petit truc m'énervai : le bouton [+] du Navigateur génére un Insert et du coup, la nouvelle ligne se trouve au dessus de la ligne en cours, j'ai changer le comportement avec ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm23.BindNavigator1Click(Sender: TObject; Button: TNavigateButton);
    begin
    if Button=TNavigateButton.nbInsert then FDQuery1.Append;
    end;
    le code du bouton [Ajouter], je l'ai fait ainsi
    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 TForm23.BtnInsertSQLClick(Sender: TObject);
    begin
      with TFDQuery.Create(self) do
      begin
        Connection:=FDConnectionSQlite;
        SQL.Text:='INSERT INTO tbl_categories (title, description,'+
                       ' level, left_id, right_id) VALUES ('+QuotedStr('Insert')+
                       ','+QuotedStr('Description')+',0,0,1)';
        ExecSQL;
      end;
     //   FDQuery1.Active:=False;
     //   FDQuery1.Active:=True;
        FDQuery1.Refresh; // remplace les deux instructions 
        FDQuery1.Last; // se positionne sur l'enregistrement ajouté 
    end;

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 657
    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 657
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    La suppression fonctionne maintenant et le ListView se synchronise
    c'est donc bien ce que je pensais
    Mais au lancement de l'application le ListView reste vide.
    Vérifie que le autoactive est à true pour le lien (synchro)

    Je pense que je vais recommencer depuis le début, point par point cet après midi.
    simplement supprimer les liaisons et les refaire en commençant par la synchronisation devrait le faire

    cf aussi dans mon blog (LinkListControlToField1.Active:=True

    Bon appétit
    Merci, c'est fait

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

Discussions similaires

  1. Problème de suppression d'une base de données
    Par Khleo dans le forum Administration
    Réponses: 0
    Dernier message: 17/04/2014, 11h19
  2. [QtSql] Petit problème d'apostrophe dans une base de donnée
    Par Jiyuu dans le forum PyQt
    Réponses: 1
    Dernier message: 22/09/2011, 07h16
  3. Problème de suppression : Table en lecture seule
    Par DashRendar dans le forum Bases de données
    Réponses: 3
    Dernier message: 12/11/2007, 13h27
  4. Petit problème de suppression avec un requête
    Par Erakis dans le forum Requêtes
    Réponses: 8
    Dernier message: 12/10/2007, 15h54
  5. petit problème de suppression
    Par Anubis dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 15/03/2007, 08h53

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