|
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 !!!! |
| |
| |
| | | |
|
| | | | |
| | |
|