PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → [WD17] Table remplit avec tableau de Variable, récuprer l'indice
[WD17] Table remplit avec tableau de Variable, récuprer l'indice
Iniciado por 77001, 18,dic. 2012 13:44 - 7 respuestas
Miembro registrado
12 mensajes
Publicado el 18,diciembre 2012 - 13:44
Bonjour, j'ai un petit soucis pour récuperer l'indice d'une table lié à un tableau de variable.
J'ai un objet qui possède un tableau d'objet affiché dans une table (Table_Adresse).
Source parcourue : gclMonEntité.TabAdresse
Variable mémorisé : gclMonEntité.TabAdresse[n]

En sélectionnant une ligne je récupère donc un objet adresse, que j'associe à un objet local gclMonAdresse.
Ce qui donne gclMonAdresse = Table_Adresse

Ensuite je modifie mon objet, et je voudrais le réassigné dans mon tableau.
De cette facon gclMonEntité.TabAdresse[n] = gclMonAdresse cependant je ne connais pas l'indice n donc impossible de modifié mon tableau.

Merci de vote aide si vous avez une idée.
Cordialement Paul
Publicado el 18,diciembre 2012 - 15:58
Bonjour,
Au lieu d'utiliser un tableau d'objets, le plus simple est d'utiliser un
tableau d'objets dynamiques. Ainsi la table renvoie un pointeur vers l'objet
en question, et de fait toute modification se fera directement sur l'objet
du tableau, puisqu'il n'y aura plus de duplication.

Frédéric.

"EKYO" a écrit dans le message de groupe de discussion :
0582d335f0252882c30cfdb7c19bee70@news.pcsoft...


Bonjour, j'ai un petit soucis pour récuperer l'indice d'une table lié à un
tableau de variable.
J'ai un objet qui possède un tableau d'objet affiché dans une table
(Table_Adresse).
Source parcourue : gclMonEntité.TabAdresse
Variable mémorisé : gclMonEntité.TabAdresse[n]

En sélectionnant une ligne je récupère donc un objet adresse, que j'associe
à un objet local gclMonAdresse.
Ce qui donne gclMonAdresse = Table_Adresse

Ensuite je modifie mon objet, et je voudrais le réassigné dans mon tableau.
De cette facon gclMonEntité.TabAdresse[n] = gclMonAdresse cependant je ne
connais pas l'indice n donc impossible de modifié mon tableau.

Merci de vote aide si vous avez une idée.
Cordialement Paul
Publicado el 18,diciembre 2012 - 19:22
Il utilise déjà un tableau d'objet dynamique je pense, ton problème est de récupérer ton indice dans le tableau, notamment en cas de trie. La table se trie mais pas le tableau d'objet. 2 solutions soit on tri le tableau en même temps que la table soit tu fais une fonction dans ton objet entité qui va parcourir ton tableau d'objet adresse genre :

//Pour une suppression
PROCEDURE TableauSupprimeAdresse(ObjASupprimer)
i,NbLignes sont des entiers

NbLignes=Tabadresse..Occurrence
POUR i=1 A NbLignes
SI ObjASupprimer=Tabadresse[i] ALORS
TableauSupprime(TabAdresse,i)
RETOUR
FIN
FIN
Publicado el 19,diciembre 2012 - 10:38
Si c'est un tableau d'objets dynamiques (pas un tableau dynamique d'objets,
mais bien un tableau d'objets dynamiques, bref un tableau de pointeurs), il
n'a pas besoin de connaitre l'indice dans la table ni dans le tableau pour y
faire des mises à jour.
La table renvoie un POINTEUR vers l'objet courant. Donc la variable "pointe"
déjà vers le bon élément du tableau.
Le fait de faire une mise à jour sur la variable revient à la faire
directement sur l'élément du tableau.
Donc avec un tableau de pointeurs, c'est assez simple:
1. La table renvoie un pointeur vers l'objet correspondant à la ligne
sélectionnée
2. Les affectations sont donc faites directement dans le tableau
3. Pour mettre à jour le champ table, un simple TableAffiche suffit.

J'ai fait un test il y a quelques temps, pour voir ce qu'on peut tirer de la
POO en Windev. J'avais donc un tableau dynamique d'objets dynamiques, et un
table qui les affiche via le DataBinding.
Voici le code de double-clic de ma table, pour afficher une fenêtre qui
permet de mettre à jour la ligne en question:

pclArticleCourant est un Article dynamique
pclArticleCourant = TABLE_Table1

SI Ouvre(FEN_Fenêtre11,pclArticleCourant) ALORS
TableAffiche(TABLE_Table1,taCourantBandeau)
FIN

Aucun indice dans ce code, pas de notion de tri, de recherche... et ça
fonctionne.

Frédéric.
"Sylvain" a écrit dans le message de groupe de discussion :
0d4b40ce64d236edc3c4a02eb4087170@news.pcsoft...


Il utilise déjà un tableau d'objet dynamique je pense, ton problème est de
récupérer ton indice dans le tableau, notamment en cas de trie. La table se
trie mais pas le tableau d'objet. 2 solutions soit on tri le tableau en même
temps que la table soit tu fais une fonction dans ton objet entité qui va
parcourir ton tableau d'objet adresse genre :

//Pour une suppression
PROCEDURE TableauSupprimeAdresse(ObjASupprimer)
i,NbLignes sont des entiers

NbLignes=Tabadresse..Occurrence
POUR i=1 A NbLignes
SI ObjASupprimer=Tabadresse[i] ALORS
TableauSupprime(TabAdresse,i)
RETOUR
FIN
FIN
Miembro registrado
64 mensajes
Publicado el 19,diciembre 2012 - 13:11
Je suis entièrement d'accord avec toi pour récupérer un objet de la table et travailler dessus. Et aussi le fait qu'une modification de ton tableau d'objet + un tableaffiche va actualiser ta table. Par contre, le tableau d'objet pointe bien sur la table mais (sauf erreur de ma part) la table pointe pas du tout sur le tableau d'objet. C'est à dire que si tu supprimes une ligne de ta table elle ne va pas se supprimer dans ton tableau d'objet. Et c'est là tous le problème, du coup tu es obligé de savoir sur quelle ligne l'utilisateur a cliqué et pour ça il te faut l'indice de la ligne sélectionné. Et le problème se complique encore sur ta table a été triée (par ville par exemple), les indices de la table ne corresponde plus aux indice du tableau d'objet...


Frédéric DEMILLY a écrit dans le message de news <50d1745b$1@news.pcsoft.fr> :
Si c'est un tableau d'objets dynamiques (pas un tableau dynamique d'objets,
mais bien un tableau d'objets dynamiques, bref un tableau de pointeurs), il
n'a pas besoin de connaitre l'indice dans la table ni dans le tableau pour y
faire des mises à jour.
La table renvoie un POINTEUR vers l'objet courant. Donc la variable "pointe"
déjà vers le bon élément du tableau.
Le fait de faire une mise à jour sur la variable revient à la faire
directement sur l'élément du tableau.
Donc avec un tableau de pointeurs, c'est assez simple:
1. La table renvoie un pointeur vers l'objet correspondant à la ligne
sélectionnée
2. Les affectations sont donc faites directement dans le tableau
3. Pour mettre à jour le champ table, un simple TableAffiche suffit.

J'ai fait un test il y a quelques temps, pour voir ce qu'on peut tirer de la
POO en Windev. J'avais donc un tableau dynamique d'objets dynamiques, et un
table qui les affiche via le DataBinding.
Voici le code de double-clic de ma table, pour afficher une fenêtre qui
permet de mettre à jour la ligne en question:

pclArticleCourant est un Article dynamique
pclArticleCourant = TABLE_Table1

SI Ouvre(FEN_Fenêtre11,pclArticleCourant) ALORS
TableAffiche(TABLE_Table1,taCourantBandeau)
FIN

Aucun indice dans ce code, pas de notion de tri, de recherche... et ça
fonctionne.

Frédéric.
"Sylvain" a écrit dans le message de groupe de discussion :
0d4b40ce64d236edc3c4a02eb4087170@news.pcsoft...


Il utilise déjà un tableau d'objet dynamique je pense, ton problème est de
récupérer ton indice dans le tableau, notamment en cas de trie. La table se
trie mais pas le tableau d'objet. 2 solutions soit on tri le tableau en même
temps que la table soit tu fais une fonction dans ton objet entité qui va
parcourir ton tableau d'objet adresse genre :

//Pour une suppression
PROCEDURE TableauSupprimeAdresse(ObjASupprimer)
i,NbLignes sont des entiers

NbLignes=Tabadresse..Occurrence
POUR i=1 A NbLignes
SI ObjASupprimer=Tabadresse[i] ALORS
TableauSupprime(TabAdresse,i)
RETOUR
FIN
FIN
Publicado el 19,diciembre 2012 - 16:33
Effectivement, je n'avais pas vu le problème sous cet angle, puisque dans le
mail de départ d'EKYO il n'était pas fait mention de suppression, mais de
modification.
A mon avis, le plus "simple" est d'avoir un identifiant unique dans chaque
objet, et "d'afficher" cet identifiant dans une colonne masquée dans la
table.
En cas de suppression d'une ligne, il "suffit" alors de chercher l'objet
possédant cet identifiant.

Petite idée à tester (c'est capilotracté, mais bon): si on ajoute dans la
classe une propriété qui renvoie "objet", c'est à dire le pointeur sur
l'objet, et que via le databinding on associe cette propriété à une colonne
de la table, est-ce qu'on peut récupérer directement l'objet à partir d'une
ligne en particulier ?

Frédéric.

"Sylvain" a écrit dans le message de groupe de discussion :
302230e5993b4c0da439e0c82733381f@news.pcsoft...


Je suis entièrement d'accord avec toi pour récupérer un objet de la table et
travailler dessus. Et aussi le fait qu'une modification de ton tableau
d'objet + un tableaffiche va actualiser ta table. Par contre, le tableau
d'objet pointe bien sur la table mais (sauf erreur de ma part) la table
pointe pas du tout sur le tableau d'objet. C'est à dire que si tu supprimes
une ligne de ta table elle ne va pas se supprimer dans ton tableau d'objet.
Et c'est là tous le problème, du coup tu es obligé de savoir sur quelle
ligne l'utilisateur a cliqué et pour ça il te faut l'indice de la ligne
sélectionné. Et le problème se complique encore sur ta table a été triée
(par ville par exemple), les indices de la table ne corresponde plus aux
indice du tableau d'objet...


Frédéric DEMILLY a écrit dans le message de news <50d1745b$1@news.pcsoft.fr>
:
Si c'est un tableau d'objets dynamiques (pas un tableau dynamique
d'objets,
mais bien un tableau d'objets dynamiques, bref un tableau de pointeurs),
il
n'a pas besoin de connaitre l'indice dans la table ni dans le tableau pour
y
faire des mises à jour.
La table renvoie un POINTEUR vers l'objet courant. Donc la variable
"pointe"
déjà vers le bon élément du tableau.
Le fait de faire une mise à jour sur la variable revient à la faire
directement sur l'élément du tableau.
Donc avec un tableau de pointeurs, c'est assez simple:
1. La table renvoie un pointeur vers l'objet correspondant à la ligne
sélectionnée
2. Les affectations sont donc faites directement dans le tableau
3. Pour mettre à jour le champ table, un simple TableAffiche suffit.

J'ai fait un test il y a quelques temps, pour voir ce qu'on peut tirer de
la
POO en Windev. J'avais donc un tableau dynamique d'objets dynamiques, et
un
table qui les affiche via le DataBinding.
Voici le code de double-clic de ma table, pour afficher une fenêtre qui
permet de mettre à jour la ligne en question:

pclArticleCourant est un Article dynamique
pclArticleCourant = TABLE_Table1

SI Ouvre(FEN_Fenêtre11,pclArticleCourant) ALORS
TableAffiche(TABLE_Table1,taCourantBandeau)
FIN

Aucun indice dans ce code, pas de notion de tri, de recherche... et ça
fonctionne.

Frédéric.
"Sylvain" a écrit dans le message de groupe de discussion :
0d4b40ce64d236edc3c4a02eb4087170@news.pcsoft...


Il utilise déjà un tableau d'objet dynamique je pense, ton problème est de
récupérer ton indice dans le tableau, notamment en cas de trie. La table
se
trie mais pas le tableau d'objet. 2 solutions soit on tri le tableau en
même
temps que la table soit tu fais une fonction dans ton objet entité qui va
parcourir ton tableau d'objet adresse genre :

//Pour une suppression
PROCEDURE TableauSupprimeAdresse(ObjASupprimer)
i,NbLignes sont des entiers

NbLignes=Tabadresse..Occurrence
POUR i=1 A NbLignes
SI ObjASupprimer=Tabadresse[i] ALORS
TableauSupprime(TabAdresse,i)
RETOUR
FIN
FIN
Miembro registrado
197 mensajes
Publicado el 16,octubre 2019 - 14:36
Bonjour

je relance ce sujet car j'ai la même problématique.

J'ai une table rempli à partir d'un tableau d'objets, quand on modifie ça met à jour directement dans le tableau, c est top.

Pour la suppression, ça fonctionne quand l'user ne fait pas de tri sur la table.
Si il y a un tri, l'indice entre la table et le tableau ne correspondent pas.

Je pourrais dans une colonne cachée y mettre un indice permettant de faire le lien entre le tableau et la table.
J'aurais aimé avoir votre avis sur les différentes solutions possibles, ou mieux si il y a un automatisme dans windev où je suis passé à côté.

Merci
Miembro registrado
197 mensajes
Publicado el 16,octubre 2019 - 15:36