jeudi 2 janvier 2025

Comment configurer le composant SQLQuery(Lazarus) pour qui'il fonctionne comme un composant ADOTable(Delphi)

Dans ce tutoriel  nous allons voir comment configurer SQLQuery dans Lazarus pour qu'il fonctionne comme un composant ADOTable de Delphi

Voici les deux composants :



 

1. Dans la propriété "DataBase" du composant SQLQuery(Lazarus), on choisit ODBCConnection1 qui est connecté à la base données Microsof Access "Materiels_Informatique.accdb" (Voir comment se connecter à une base de données Access avec ODBCConnection1), ensuite :

 

Dans la propriété "Transaction" du composant SQLQuery(Lazarus), on choisit  SQLTransaction1


Dans la propriété "Database" du composant SQLTransaction, on choisit ODBCConnection1, et dans la propriété "Action" on choisit caCommit.



- Dans l’éditeur SQL de la propriété SQL on saisit la requête qui suit, avec quoi afficher toutes les lignes de la table "types" avec la procédure SQLQuery.Open;   :

SELECT * FROM types


 

- Dans l’éditeur SQL de la propriété InsertSQL on saisit la requête qui suit, avec quoi insérer des données dans la table "types" avec la procédure SQLQuery.Insert;  :

INSERT INTO types(lib_type) VALUES(:lib_type)


 

- Dans l’éditeur SQL de la propriété UpdateSQL on saisit la requête qui suit, avec quoi modifier les données de la table "types" avec la procédure SQLQuery.Edit;  :

UPDATE types SET id_type=:id_type lib_type=:lib_type 

WHERE id_type=:old_id_type

on ajoute le préfixe "OLD_" pour avoir la possibilité de modifier la valeur du champ clé primaire "num_id_type" comme :


 

- Dans l’éditeur SQL de la propriété DeleteSQL on saisit la requête qui suit, avec quoi supprimer des lignes de la table "types" avec la procédure SQLQuery.Delete;  :

DELETE FROM types WHERE id_type=:id_type


 

 2. Dans la propriété "Options" du composant SQLQuery(Lazarus), on met la valeur de "sqoKeepOpenOnCommit" à True, pour que SQLQuery reste activé après exécution des requêtes avec des instructions comme INSERT, UPDATE, DELETE au niveau du DataSet (SQLQuery) c'est à dire au niveau de l'ensemble de données chargé dans SQLQuery depuis la base de données, 

SQLQuery.Options:=[sqoKeepOpenOnCommit]; 

- Mettre la propriété "UsePrimaryKeyAsKey" à False, dans le cas d'une base de données Microsoft Access en cas d’erreurs.



3. Pour insérer, modifier ou supprimer un enregistrement, on utilise les procédures qui suit:

procedure TForm1.btn_ajouterClick(Sender: TObject);
begin
  SQLQuery.Insert;    //Pour insérer un nouvel enregistrement
end;

SQLQuery.Edit;    //Pour modifier un enregistrement

SQLQuery.Delete;    //Pour supprimer un enregistrement

Et pour valider les changement au niveau de la base de données après exécutions des instructions comme INSERT, UPDATE, DELETE :

Méthode 1 :  on peut utiliser les procédures qui suit avec un "Bouton Valider" par exemple:

procedure TForm1.btn_validerClick(Sender: TObject);
begin
  try
    SQLQuery.Post; //Appliquer les changements au niveau du "Dataset"
    SQLQuery.ApplyUpdates(); //Appliquer les changements au niveau de la base de données
    SQLQuery.Refresh;    //Actualiser pour recharger les nouveaux changement des données au niveau de la base de données

   Except on E:exception do
      ShowMessage(E.Message); 
//En cas d'erreur afficher le message
   end
end


Méthode 2 :  ou bien on peut ajouter ces procédures aux événements du composant SQLQuery "AfterPost" et "AfterDelete", et comme ça la mise à jours des données au niveau de la base de données se fera automatiquement après chaque ajout, modification ou suppression d'un enregistrement :


procedure TForm1.SQLQueryAfterPost(DataSet: TDataSet);
begin

  SQLQuery.ApplyUpdates(); //Appliquer les changements au niveau de la base de données après ajout ou modification
  SQLQuery.Refresh;    //Actualiser pour recharger les nouveaux changement des données au niveau de la base de données

end;

procedure TForm1.SQLQueryAfterDelete(DataSet: TDataSet);
begin

  SQLQuery.ApplyUpdates(); //Appliquer les changements au niveau de la base de données après suppression
  SQLQuery.Refresh;    //Actualiser pour recharger les nouveaux changement des données au niveau de la base de données

end; 

.