PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Suppression dans une table multisélection
Suppression dans une table multisélection
Débuté par 43, 05 juil. 2005 11:39 - 14 réponses
Posté le 05 juillet 2005 - 11:39
Bonjour,

je suis en train de mettre en place une table multisélection sur une table qui au départ étée mono sélection.

Ainsi je veux avoir l'opportunité de pouvoir supprimer plusieurs lignes dan sma table.

Dans un premier temps je veux mettre en place la suppression d'une seule ligne.

Ma table est composé de X champs dont:
JBCODE chaine Clé Doublons //Nom de ma commande
JLNUMLIGNE entier Clé doublons //N° de ligne dans ma commande
JBCODEJLNUMLIGNE1 Clé composée Unique
//NoCommande est un champ contenant JBCODE

Lorsque je lance ma suppression sur la dernière ligne ou a un autre endroit, elle marche trés bien la première fois...

Ensuite pour X raisons elle me duplique la ligne 1 tout en me supprimant la ligne souhaitée....

Je vous fais passer mon code pour cette procédure qui tiens compte de la renumérotation des lignes de la commande:
*************************************************************************
// Déclaration des Variables
Num_Enr_Tmp est un entier
NumLigneEnSuppression est un entier
NbLignesAvantSuppr est un entier = TableOccurrence(LIGNE)
aa est entier = 0
// Mise en place du Sablier
Sablier(Vrai)
Num_Enr_Tmp = TableSelect(LIGNE)
NumLigneEnSuppression = LIGNE._JLNUMLIGNE
// Demande de Confirmation
SI OuiNon(Non,"Etes_vous sur de vouloir supprimer la ligne N°: " + LIGNE._JLNUMLIGNE + " ?") = Non ALORS
RETOUR
FIN
// Supprime la ligne
HLitRecherchePremier(WDJOB_LIGNE,IDWDJOB_LIGNE,LIGNE._IDWDJOB_LIGNE)
// On regarde si la ligne existe
SI PAS HTrouve(WDJOB_LIGNE) ALORS
Erreur("La ligne a supprimée est introuvable, veuillez recommencer l'opération !!!")
RETOUR
FIN
// Si elle existe on supprime
SI PAS HSupprime(WDJOB_LIGNE) ALORS
Erreur("Suppression impossible","",ErreurInfo(errComplet))
RETOUR
FIN
// Rafraichissement de la table
OuvreFille(Fen_OK,"Actualisation en cours")
// Actualisation
TableAffiche(LIGNE,taDébut)
// On acréemente de 1 pour trouver le premier enregistrement
HLitRecherchePremier(WDJOB_LIGNE,JBCODE,NoCommande)
TANTQUE HTrouve(WDJOB_LIGNE)
SI WDJOB_LIGNE.JLNUMLIGNE > NumLigneEnSuppression ALORS
WDJOB_LIGNE.JLNUMLIGNE = WDJOB_LIGNE.JLNUMLIGNE - 1
SI PAS HModifie(WDJOB_LIGNE) ALORS
Erreur("Erruer sur la renumérotation, veuillez l'effectuer à la main !!!")
GOTO Actualisation
FIN
FIN
HLitSuivant(WDJOB_LIGNE,JBCODE)
FIN
Posté le 05 juillet 2005 - 11:58
Bonjour,

J'ai un PB de même nature dans un champ Table.

Exemple :
Pour i = 1 a table..Occurence
Si ( condition )
Erreur( table.colonne) // Affiche en test la colonne
tableSupprime( table, i)
Fin
Fin

Dans ce cas, la ligne est supprimée, et l'affichage est réitéré ( sur la même ligne).

En ajoutant après tableSupprime i--;, ça fonctionne correctement... Pourtant, j'incrémente i dans la boucle, je devrait passer à la suite...

Cordialement,

C.AUBRY
Posté le 05 juillet 2005 - 16:24
En fait non, car le tablesupprime modifie le nombre de ligne de la table.
Par exemple, si la table contient 3 lignes:
1. Tu supprimes la ligne 1, la table ne contient plus que 2 lignes
2. Tu supprimes la ligne 2, la table ne contient alors plus qu'une ligne
3. Tu supprimes la ligne 3, qui n'existe plus => erreur

Donc quand tu supprimes une ligne d'une table, la ligne suivante récupère l'indice de la ligne supprimée, c'est pour celà qu'il faut décrémenter l'indice.

Le plus propre serait d'utiliser une boucle tantque:

NumLig est un entier = 1

TANTQUE NumLig <= table.occurence:
Si condition Alors
tablesupprime(table,NumLig)
Sinon
NumLig++
Fin
FIN

Voici un exemple de code qui supprimes les lignes sélectionnées dans une table multiselection:

NbrSelect = TableSelectOccurrence(TblFillesSelect)

POUR Compteur = 1 A NbrSelect
NumSelect = TableSelect(TblFillesSelect,1)
TableSupprime(TblFillesSelect,NumSelect)
FIN

En gros :
Je récupère le nombre de lignes sélectionnés
Dans la boucle:
Je récupère l'indice de la première ligne sélectionnée
Je la supprime
FIN


Frédéric.
Posté le 05 juillet 2005 - 18:12
Je viens d'essayer ta solution et malheureusement elle ne marche pas car j'ai toujours le même problème:


la ligne 1 se duplique !!!!!!

Je ne sais pas du tout à quoi c'est du car si je laisse la table en mono sélection se problème n'apparait pas !!!!

Or en multisélection, pour supprimer une seule ligne, ca bug !!!
Posté le 05 juillet 2005 - 18:39
Tu peux nous montrer ton code ?

Frédéric.
Posté le 05 juillet 2005 - 19:16
Voici mon code:

Je supprime la ligne voulu
J'actualise ma table
Je renumérote les lignes
J'actualise la table



PROCEDURE Suppression_Simple()
//************************************ Déclaration des Variables ********************************
Num_Enr_Tmp est un entier
NumLigneEnSuppression est un entier
NbLignesApresSuppr est un entier = TableOccurrence(LIGNE) - 1
aa est entier = 0
//*************************************** Mise en place du Sablier *******************************
Sablier(Vrai)
Num_Enr_Tmp = TableSelect(LIGNE)
NumLigneEnSuppression = LIGNE._JLNUMLIGNE
TableAjouteLigne(TblLigneASupprimer,LIGNE._JLNUMLIGNE)
// Demande de Confirmation
SI OuiNon(Non,"Etes_vous sur de vouloir supprimer la ligne N°: " + LIGNE._JLNUMLIGNE + " ?") = Non ALORS
RETOUR
FIN
// Supprime la ligne
HLitRecherchePremier(WDJOB_LIGNE,IDWDJOB_LIGNE,LIGNE._IDWDJOB_LIGNE)
// On regarde si la ligne existe
SI PAS HTrouve(WDJOB_LIGNE) ALORS
Erreur("La ligne a supprimée est introuvable, veuillez recommencer l'opération !!!")
RETOUR
FIN
// Si elle existe on supprime
SI PAS HSupprime(WDJOB_LIGNE) ALORS
Erreur("Suppression impossible","",ErreurInfo(errComplet))
RETOUR
FIN
// Rafraichissement de la table
OuvreFille(Fen_OK,"Actualisation en cours")
// Renumérotation
NumLigneEnSuppression
SI NumLigneEnSuppression <= NbLignesApresSuppr ALORS
POUR aa = (NumLigneEnSuppression + 1) A (NbLignesApresSuppr + 1)
HLitRecherchePremier(WDJOB_LIGNE,JBCODEJLNUMLIGNE1,HConstruitValClé(WDJOB_LIGNE,JBCODEJLNUMLIGNE1,NoCommande,aa))
SI PAS HTrouve(WDJOB_LIGNE) ALORS
Erreur("Impossible de renuméroter les lignes, veuillez le faire manuellement !!!")
GOTO Actualisation
FIN
WDJOB_LIGNE.JLNUMLIGNE = aa - 1
SI PAS HModifie(WDJOB_LIGNE) ALORS
Erreur("La modification de la ligne pendant la renumérotation est impossible, veuillez la faire manuellement !!!")
GOTO Actualisation
FIN
FIN
FIN
Actualisation:
// Actualisation
TableAffiche(LIGNE,taDébut)
// Calcul des totaux
Calcul_Cout_Prix()
Calcul_Pied()
// Sélection de la ligne en cours
TableSelectMoins(LIGNE)
SI Num_Enr_Tmp > TableOccurrence(LIGNE) ALORS
TableSelectPlus(LIGNE,TableOccurrence(LIGNE))
SINON
TableSelectPlus(LIGNE,Num_Enr_Tmp)
FIN
// Suppression du Sablier
Sablier(Faux)
// On ferme la fenetre d'attente
Ferme(Fen_OK)
Posté le 05 juillet 2005 - 20:01
Là, tu ne traite qu'une seule ligne:
Num_Enr_Tmp = TableSelect(LIGNE)

Variable non affectée: NbLignesApresSuppr

Normalement, le hlitrecherche qui précède la suppression est inutile. Dans le cas d'une table fichier, l'enregistrement courant du fichier HF est celui correspondant à la ligne courante de la table.

Et Puis des GOTO !!! Beurk ;)

Enfin sinon ce code à l'aire de marcher, est-ce que tu peux nous donner le code avec une sélection multiple ?

Frédéric.
Posté le 06 juillet 2005 - 11:28
Je ne l'ai pas encore fait dans le sens ou déjà pour un enregistrement ca marche pas, c'est pas la peine de faire quelque chose qui ne marchera pas meiux !!!!
Posté le 06 juillet 2005 - 11:42
Bonjour,

J'ai fait des essais, et j'obtient des résultat surprenant.

Soit une table avec 2 colonnes que je remplis par TableAjouteLigne().

Colonne1; colonne2
"AAAA",""
"BBBB", "titi"
"CCC", ""

Une méthode supprime qui texte si la colonne2 <> "", TableSupprime(table1, i) appelé par un menu contextuel.

Pour i = 1 A Table1..Occurence
TableSelectPlus(Table1, 1)
Effacer = Faux
Si Table1.Colonne2 <> "" Alors
Effacer = Vrai
Fin
TableSelectMoins(Table1, i)
Si Effacer = Vrai Alors
Erreur( Table1.Colonne1)
TableSupprime( Table1, i)
i--
Fin
Fin

Le problème est en fonction de la ligne du bandeau

Si je clique sur la ligne 2 ( BBB, titi) et que j'appelle par le menu contextuel ma méthode Supprimer
J'ai 2 messages par la commande Erreur() qui m'affiche "BBB"

Si je clique sur la première ligne ( AAA) et que j'apelle la méthode supprimer par le menu contextuel
J'affiche 1 message (Erreur) avec aucun texte.

Si je me positionne sur la 3eme ligne, je n'ai aucun message, et aucune ligne de supprimé

J'ai effectué la même manip avec une table remplie de 6 lignes avec seulement la ligne 5, colonne2 = "titi"

Dans ce cas, si je reste sur la ligne n° 5 et que je lance ma procédure Effacer, j'ai 5 messages.

Si je suis sur la 1er ligne, je n'ai qu'une fenêtre vierge.

J'ai aussi essayé en sélectionnant plusieurs lignes, là c'est plus grave, car même les lignes donc la colonne2 sont vierges sont supprimées.


Cordialement,

C.AUBRY
Posté le 06 juillet 2005 - 12:31
Ton code m'interpelle un peu car personnellement pour faire ce que tu veux faire, lors du TableSelectPLus(), à mon avis à la place de 1 il faut mettre i afin de changer de ligne de parcours et ne pas toujours rester sur la une !!!!

Je crois qu'il y a un problème sur les table multisélections car je ne vois pas du tout ou erreur il peut y avoir....

Je vais finir par y perdre mon latin !!!
Posté le 06 juillet 2005 - 13:05
Oui, erreur dans la recopie, j'ai bien i et non 1 dans mon test.

Pour ma part, je pense qu'il y a bien un problème avec les tables multi-sélection.

Dans une table mono, ça fonctionne correctement.

Cordialement,

C.AUBRY
Posté le 06 juillet 2005 - 13:17
Aurélien a raison, il y a un problème dans ton code.
Le plus simple, c'est de faire une boucle de ce type:

NbrSelect est le nombre de ligne sélectionnées
NumLig est l'indice de la ligne a traiter dans la table
NumSelect est le numéro de la ligne sélectionnée ( rien à voir avec l'indice de la ligne )

Par exemple, si je sélectionne les lignes 2 et 5 dans une table avec 10 lignes:
NbrSelect = 2
Pour la ligne 2, numlig = 2 et numselect = 1
Pour la ligne 5, numlig = 5 et numselect = 2

nbrselect = tableselectoccurence(Table1)
NumSelect est un entier = 1
POUR Compteur = 1 A NbrSelect
// Recherche de l'indice de la ligne sélectionnée
NumLig = TableSelect(Table1,NumSelect)
Si table..colonne1[NumLig] = ""
// Je supprime la ligne
tablesupprime(table1,numlig)
sinon
// Je passe à la ligne sélectionnée suivante
NumSelect++
Fin
FIN

De cette façon, j'ai traité toutes les lignes sélectionnées.

Frédéric.
Posté le 06 juillet 2005 - 13:21
Astu déjà demandé au support technique une info sur ce point....

Je crois que je vais être de leur envoyé un message....

Tiens moi au courant !!!
Posté le 06 juillet 2005 - 16:24
Je suis tout à fait d'accord avec toi et si tu regarde bien c'est ce que mon code fait pour la suppression d'un seul enregistrement.

Or le problème est là !!!!
Posté le 07 juillet 2005 - 16:06
Je viens de trouver le problème....

Dans les tables multisélection je pense que les tableenregistre crée des problème car je les ai remplacé par des Hmodifie et tout fonctionne correctement !!!!