Bonjour les amis .
Je suis en train d'implémenter une classe Model pour me permettre de faire les opérations
de CRUD sans avoir à recoder les procédures.
Cette classe Model va déjà implémenter toutes ces opérations (CRUD).
De ce fait, à chaque fois que j'ai besoin de ces opérations (CRUD) dans une des classes de mon projet,
je vais tout simplement hérité de la classe Model et le tour est joué.
1. Implémentation de la classe ModelAbstrait
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 ModelAbstrait est une Classe FIN PROCÉDURE Constructeur() PROCÉDURE Destructeur() PROCÉDURE ABSTRAITE liste()
2. Implémentation de la classe ModelCollection
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 ModelCollection est une Classe hérite de ModelAbstrait m_tabListeModelDynamique est un tableau de objet dynamique FIN
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 PROCÉDURE Constructeur() PROCÉDURE Destructeur()
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 PROCÉDURE ajouterModel(pclUnModel est un objet dynamique) m_tabListeModelDynamique.Ajoute(pclUnModel) // Redéfinition de la méthode ModelAbstrait.liste PROCÉDURE liste() RENVOYER m_tabListeModelDynamique
3. Implémentation de la classe Model
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Model est une Classe m_clUnModelCollection est un ModelCollection GLOBAL PRIVÉ CONSTANT g_tLstModel est un tableau de objet dynamique g_nHVersion est un entier FIN
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 PROCÉDURE Constructeur() PROCÉDURE Destructeur()
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 PROCÉDURE liste() // renvoie un tableau (tous les enregistrements ) de type classe de l'objet en cours LOCAL nHVersion est un entier def est une Définition = RécupèreDéfinition(objet) // Récupération de la définition de l'objet en cours sNomClasse est une chaîne = def.Nom // Récupération du nom de la classe de l'objet en cours sNomfichier est une chaîne = Droite(sNomClasse, Taille(sNomClasse) - 1) nHVersion = HVersion({sNomfichier, indFichier}) SI PAS nHVersion > ::g_nHVersion ALORS RENVOYER ::g_tLstModel ::g_nHVersion = nHVersion TableauSupprimeTout(::g_tLstModel) // création du tableau de type de la classe de l'objet appelant CodeAExecuter est une chaîne = [ tabListe_ est une tableau de %1 RENVOYER tabListe_ ] CodeAExecuter = ChaîneConstruit(CodeAExecuter,def.Nom) ::g_tLstModel <- ExécuteCode(CodeAExecuter) // on remplit le tableau crée par des enregistrements de la table correspondante à la classe de l'objet appelant FichierVersTableau(::g_tLstModel,{sNomfichier, indFichier}) RENVOYER ::g_tLstModel
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 // Crée le nouveau objet ou modifie objet existant de la base de données PROCÉDURE actualiser() def est une Définition = RécupèreDéfinition(objet) sNomClasse est une chaîne = def.Nom sNomfichier est une chaîne = Droite(sNomClasse, Taille(sNomClasse) - 1) HLitRecherchePremier({sNomfichier, indFichier}, "ID" + sNomfichier, {objet,def..Variable[1]}) SI HTrouve({sNomfichier, indFichier}) ALORS MémoireVersFichier(objet,{sNomfichier, indFichier}) SI HModifie({sNomfichier, indFichier}) = Faux ALORS ErreurDéclenche(3,"Problème" + RC + HErreurInfo()) RENVOYER Faux FIN ToastAffiche("Modification effectuée avec succès.") SINON HRAZ({sNomfichier, indFichier}) MémoireVersFichier(objet,{sNomfichier, indFichier}) SI HAjoute({sNomfichier, indFichier}) = Faux ALORS ErreurDéclenche(3,"Problème" + RC + HErreurInfo()) RENVOYER Faux FIN ToastAffiche("Création effectuée avec succès.") FIN
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 // supprime l'objet en cours de la base de données PROCÉDURE supprimer() def est une Définition = RécupèreDéfinition(objet) sNomClasse est une chaîne = def.Nom sNomfichier est une chaîne = Droite(sNomClasse, Taille(sNomClasse) - 1) HLitRecherchePremier({sNomfichier, indFichier}, "ID" + sNomfichier, {objet,def..Variable[1]}) SI HTrouve({sNomfichier, indFichier}) = Vrai ALORS SI HSupprime({sNomfichier, indFichier})=Faux ALORS SI HErreurIntégrité()=Vrai ALORS TitreSuivant("Suppression interdite") Erreur("Suppression interdite suite à une violation d'intégrité.") RENVOYER Faux SINON TitreSuivant("Suppression interdite") Erreur("Suppression interdite suite à une autre cause que l'intégrité.") RENVOYER Faux FIN SINON TitreSuivant("Suppression réussie") Info("Suppression effectuée avec succès.") RENVOYER Vrai FIN SINON TitreSuivant("Information non trouvée") Erreur("L'information n'est pas dans la base des données.") RENVOYER Faux FIN
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 PROCÉDURE listeCritereWhere(sRubrique est une chaîne, vValeur est un Variant, sCondition est une chaîne = "=" ) // renvoie un tableau (tous les enregistrements ) de type classe de l'objet en cours LOCAL def est une Définition = RécupèreDéfinition(objet) // Récupération de la définition de l'objet en cours sNomClasse est une chaîne = def.Nom // Récupération du nom de la classe de l'objet en cours sNomfichier est une chaîne = Droite(sNomClasse, Taille(sNomClasse) - 1) // création du tableau de type de la classe de l'objet appelant CodeAExecuter est une chaîne = [ tabListe_ est une tableau de %1 RENVOYER tabListe_ ] CodeAExecuter = ChaîneConstruit(CodeAExecuter,sNomClasse) m_clUnModelCollection.m_tabListeModelDynamique <- ExécuteCode(CodeAExecuter) // Transfert la reférence au tableau sMarequete est une chaîne = [ SELECT * FROM %1 WHERE %2 %4 '%3' ] sMarequete2 est une chaîne = [ SELECT * FROM %1 WHERE %2 %4 '%3' ] sMarequete2 = ChaîneConstruit(sMarequete2, {sNomfichier, indFichier},sRubrique,vValeur, sCondition) sMarequete = ChaîneConstruit(sMarequete, {sNomfichier, indFichier},sRubrique,vValeur, sCondition) sdMonResultat est une Source de Données HExécuteRequêteSQL(sdMonResultat,sMarequete) FichierVersTableau(m_clUnModelCollection.m_tabListeModelDynamique,sdMonResultat) RENVOYER m_clUnModelCollection
4. UTILISATION
j'ai la classe Cours par exemple.
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 Mcours est une Classe <MAPPING=cours> hérite de Model // Le code se trouvant entre <MAPPING> et <FIN> est généré automatiquement. // Il sera effacé et recréé entièrement à chaque génération depuis le menu contextuel // du fichier dans l'explorateur de projet "..Regénérer la classe modèle". <MAPPING> m_nIDcours est un entier sur 8 octets <MAPPING=IDcours, clé unique> m_sTitre est une chaîne ANSI <MAPPING=titre> m_sProfesseur est une chaîne ANSI <MAPPING=professeur> <FIN> FIN PROCÉDURE Constructeur() PROCÉDURE Destructeur()
LE CODE QUI AFFICHE LA LISTE DES COURS
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 gtabLesTitresDesCours est un tableau de Mcours clGclUnTitreCours est un Mcours // j'ai tous les enregistrements du fichier Cours gtabLesTitresDesCours = clGclUnTitreCours:liste() // j'ai les enregistrements du fichier Cours répondant aux critères gtabLesTitresDesCours = clGclUnTitreCours:listeCritereWhere("IDcours", "4", "=").liste()
NB. ces deux lignes de code au dessus fonctionnent parfaitement
// Mon souci est d'enchainer les critères de séléction comme sur le code qui suit
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 gtabLesTitresDesCours = clGclUnTitreCours:listeCritereWhere("IDcours", "4", ">")... .listeCritereWhere("Titre", "Math", "=").liste()
je veux avoir quelque chose de pareil comme on le fait en Eloquent de Laravel
Donc on enchaine les méthodes where et whereNotIn
Code : Sélectionner tout - Visualiser dans une fenêtre à part $employes = Employe::where('Est_Actif', 1)->whereNotIn('id', [10,12,20])->get();
Partager