PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Question concernant les classes (POO)
Question concernant les classes (POO)
Débuté par Monsieur Serge, 24 fév. 2021 05:24 - 7 réponses
Membre enregistré
213 messages
Popularité : +12 (12 votes)
Posté le 24 février 2021 - 05:24
Bonsoir / Bonjour,

Je poursuis mon passage vers les classes et je bloque sur un détail.

Pour tenter de faire simple:

1) Classe déclarée au niveau du projet
- Contient une structure "Liste" avec les rubriques requises (Ex: Liste de produits)
- Contient une structure "Dossier" avec les rubriques d'un dossier unique (Ex: Un produit)

- Contient une variable tableau de la structure "Liste" (Pour le data binding)
- Contient une variable liée à la structure "Dossier" (Pour le data binding)

- Contient une méthode pour charger la variable du tableau de "Liste"
- Utilisé pour charger la liste de tous les dossiers

- Contient une méthode pour charger la variable d'un "Dossier" unique.
- Utilisé pour charger un dossier


2) Fenêtre principale du projet
- Onglet dynamique, dont un volet statique
- Champ table en data binding sur la variable tableau "Liste"
- Fait un appel de la méthode "GetListe"
- Affiche la liste des enregistrements chargés par la méthode

Super, ça fonctionne.


3) Fenêtre interne avec contexte HFSQL indépendant
- Chaque instante est chargée dans son volet dynamique
- Déclare sa propre instance de la même classe (Sous un autre nom)
- Multiples champs en data binding sur la variable "Dossier"
- Fait un appel de la méthode "GetDossier"
- Affiche ce dossier

Je peux charger plusieurs dossiers indépendamment les uns des autres.
Super, ça fonctionne.


4) Mise à jour d'un dossier
- Je fais une mise à jour du dossier
- Sur validation sans erreur, appel de la méthode "SetDossier"
- Les changements sont bel et bien répercutés dans la base de données
- Visible en live, par exemple avec WDMap


5) Retour au volet statique
- Un changement de HVersion de la base de données est détecté
- Appel de la méthode "GetListe"
- TableAffiche(MaTable, taInit)

Super, c'est la réaction attendue.

Mais... le changement n'est pas répercuté.
Mon champ table affiche l'ancienne valeur.


----------
Si je quitte et que je recharge, alors le changement est visible.
Autre preuve que le changement a bien été enregistré dans la base de données.

J'ai même un SupprimeTout(TableauDeListe) dans la méthode GetListe.
Un debug me confirme que le tableau s'initialise et se recharge.


La même logique, "hors classe", fonctionne très bien.

Quelle est cette subtilité des classes qui me glisse entre les doigts ?
Qu'est ce que je ne comprends pas ?


Merci.

Serge

--
-----
Parfois, la logique est implacable...
Membre enregistré
283 messages
Popularité : +80 (92 votes)
Posté le 24 février 2021 - 10:21
Le problème doit se situer dans ta méthode GetListe, assure toi de récupérer les nouvelles données où sinon montre ton code qu'on regarde ça ensemble

--
Maître de la POO
Membre enregistré
213 messages
Popularité : +12 (12 votes)
Posté le 24 février 2021 - 23:37
Le problème vient d'une colonne combo du champ table de ma fenêtre principale.

J'y affiche la description selon la langue de l'utilisateur.
Descriptions que je devais rafraichir sur mise à jour de la base de données.

Bref, le produit # 123456 peut avoir une description en plus d'une langue
Si l'utilisateur modifie l'une de ces descriptions le combo doit le refléter.

La bonne nouvelle, c'est que ma classe est pleinement fonctionnelle.
Une étape importante dans ma migration.

8)

--
-----
Parfois, la logique est implacable...
Membre enregistré
213 messages
Popularité : +12 (12 votes)
Posté le 25 février 2021 - 00:57
Je profite de l'occasion pour une autre question.

Dans une classe "Set", avez-vous l'habitude d'englober vos transactions d'un "Quand exception dans" ?

HTransaction()
QUAND EXCEPTIONEXCEPTION DANS
...
HAjoute/HModifie
...
HTransactionFin()
...
FAIRE
HTransactionAnnule()
FIN

C'est ce que semble proposer PcShot.
https://doc.pcsoft.fr/fr-FR/?1000023384

Bon dev.

Serge

--
-----
Parfois, la logique est implacable...
Membre enregistré
213 messages
Popularité : +12 (12 votes)
Posté le 25 février 2021 - 00:57
Méthode "Set", et non une classe...
;)

--
-----
Parfois, la logique est implacable...
Membre enregistré
3 881 messages
Popularité : +227 (347 votes)
Posté le 25 février 2021 - 03:50
Bonjour,
On n'utilise plus QUAND EXECPTION DANS depuis longtemps, mais CAS EXECEPTION que l'on couple d'ailleurs avec CAS ERREUR

--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
213 messages
Popularité : +12 (12 votes)
Posté le 25 février 2021 - 04:54
Voroltinquo,

CAS EXCEPTION
https://doc.pcsoft.fr/fr-FR/?3034013

CAS ERREUR
https://doc.pcsoft.fr/fr-FR/?3034010

Je prends note et je prévois la lecture dès demain.

Merci pour la note.

Serge

--
-----
Parfois, la logique est implacable...
Membre enregistré
213 messages
Popularité : +12 (12 votes)
Posté le 01 mars 2021 - 02:38
CAS EXCEPTION / CAS ERREUR
Intéressant et moins intrusif que quand exception dans faire...
J'adopte.
:merci:


--------------------------------------------------
Une première question pour vous:

À l'initialisation du projet:
- Je déclare ma classe
- Je fais un HSurErreur("*", hErrTout, NomComposant.NomFenêtre)

En debug, HSurErreur() renvoi Vrai et malgré tout, ma classe refuse de s'y plier.
Dès que je force une erreur HFSQL j'ai le process automatique de Windev qui embarque.
;(

J'ai l'impression que ma classe me nargue...
Qu'est-ce que je ne comprends pas ?


--------------------------------------------------
Et une autre question:
Depuis ma Liste, double-clic, je charge un dossier dans son onglet dynamique.
Tout va bien.

L'utilisateur peut consulter / éditer / supprimer ce dossier.
Ou parcourir les dossiers sans devoir revenir à la liste.
Premier, Précédent, Suivant, Dernier
Tout va bien.

La méthode qui se charge du parcours est toute simple:
HLitPremier
HLitPrécédent
HLitSuivant
HLitDernier
HLitRecherchePremier (Pour le chargement initial)

Par contre, la "source" de ces différents "HLit" doit être hors méthode pour conserver le pointeur.
J'ai glissé l'initialisation de la source (HExécuteRequêteSQL) dans le constructeur.
Est-ce le bon endroit ?


Encore une fois, merci pour vos bons conseils.

Serge

--
-----
Parfois, la logique est implacable...