Supprimer plusieurs lignes dataset selon certains critères

Jojo092 Messages postés 136 Date d'inscription samedi 24 septembre 2005 Statut Membre Dernière intervention 12 avril 2013 - 1 avril 2011 à 15:57
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 - 5 avril 2011 à 10:23
Bonjour à tous,

j'ai un souci avec la gestion de mes lignes dans un dataset. Alors peut-être que mon problème est "bateau", mais là, ça fait un moment que je me triture le cerveau...

Bref, voilà mon souci : J'ai un DataSet qui ne contient qu'une seule table avec plusieurs colonnes, et bien sûr plusieurs enregistrements. Une des colonnes est un numéro. Je dois aller vérifier si ce numéro existe dans une table d'un BDD, et jusque là pas de problème. Là où ça me pose problème c'est lorsque je dois supprimer toutes les lignes du dataset contenant ce numéro s'il n'existe pas dans la base...

Jusqu'à présent, je faisais une suppression ligne par ligne, mais n'y a-t-il pas un moyen de faire une suppression en masse selon un critère ?

Merci d'avance pour vos réponses.

Bonne journée.

5 réponses

Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
1 avril 2011 à 17:14
Parfois un petit bout de code en dit plus qu'un long discours
Dim Table As New DataTable
        Table.Columns.Add(New DataColumn("truc", System.Type.GetType("System.Int16")))
        Table.Columns.Add(New DataColumn("bidule", System.Type.GetType("System.String")))
        For Compteur As Integer = 1 To 100
            Dim Ligne As DataRow = Table.NewRow
            Ligne.Item("truc") = Compteur
            Ligne.Item("bidule") = "bidule" & Compteur
            Table.Rows.Add(Ligne)
        Next
        Debug.Print(Table.Rows.Count)
        'C'est cette partie qui t’intéresse 
        Dim Selection() As DataRow
        Selection = Table.Select("truc IN (10,20,30,40)")
        For Each ligne In Selection
            ligne.Delete()
        Next
        'Voila fini ^^
        Debug.Print(Table.Rows.Count)




Amicalement
1000 recherches sur Google = 1Km de voiture en CO² (réfuté par Google )
1000 recherches sur Forestle = 100 m² de forêt tropicale sauvé .
Surfez écolo
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
1 avril 2011 à 17:16
Haaaaaaaa j'ai peut être mal lut la question en faite
Que veut tu dire par "une suppression en masse" ?

Amicalement
1000 recherches sur Google = 1Km de voiture en CO² (réfuté par Google )
1000 recherches sur Forestle = 100 m² de forêt tropicale sauvé .
Surfez écolo
0
Jojo092 Messages postés 136 Date d'inscription samedi 24 septembre 2005 Statut Membre Dernière intervention 12 avril 2013
4 avril 2011 à 09:50
Salut, merci pour avoir répondu à mon message aussi rapidement. Voilà ce que j'appelle "suppression de masse" : imaginons que par exemple j'ai une DataTable contenue dans un DataSet, avec les colonnes suivantes : "numéro", "truc", "bidule". Dans ces colonnes j'ai les données suivante :

0398;truc1;bidule1
0398;truc2;bidule2
0398;truc3;bidule3
0398;truc4;bidule4
1039;truc5;bidule5

Comme je l'ai dit, je dois rechercher si ce numéro existe dans la base de données. Par exemple, si 0398 n'existe pas, je dois supprimer l'enregistrement de la DataTable. Donc, je me disais qu'au lieu d'aller rechercher X fois pour le même numéro, supprimer tous les enregistrements avec comme numéro 0398.

J'espère que j'ai été clair dans mon explication, sinon n'hésite pas à me redemander des explications.

Bonne journée.
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
5 avril 2011 à 09:58
Le petit code que je t'es envoyer sur mon 1ér message fait un peut sa :
Cherche une fois toute les ligne avec la donnée truc.
Supprime (une par une, je ne sait pas faire directement toute les lignes mais sa doit être possible) toutes les lignes retournées.
Avec ton exemple sa donnerais :
        'Création de la table
        Dim Table As New DataTable("table1")
        Table.Columns.Add(New DataColumn("numéro", System.Type.GetType("System.Int16")))
        Table.Columns.Add(New DataColumn("truc", System.Type.GetType("System.String")))
        Table.Columns.Add(New DataColumn("bidule", System.Type.GetType("System.String")))
        'Remplissage de la table
        For Compteur As Integer = 1 To 5
            Dim Ligne As DataRow = Table.NewRow
            Select Case Compteur
                Case 1, 2, 3, 4
                    Ligne.Item("numéro") = 398
                Case 5
                    Ligne.Item("numéro") = 1039
            End Select
            Ligne.Item("truc") = "truc" & Compteur
            Ligne.Item("bidule") = "bidule" & Compteur
            Table.Rows.Add(Ligne)
        Next
        Debug.Print(Table.Rows.Count & " Ligne(s)") '<- 5 Ligne(s)

        'Ici j'ai exactement la même table que dans ton exemple
        '------------------------------------------------------
        Dim Selection() As DataRow 'Tableau de lignes pour stocker la sélection
        Selection Table.Select("numéro " & 398) 'Sélectionne les lignes
        For Each Ligne As DataRow In Selection 'Pour toutes les lignes sélectionnées
            Ligne.Delete() 'Retire la ligne de la table
        Next
        '------------------------------------------------------

        'Si non tu peut aussi faire sa :
        '------------------------------------------------------
        For Each Ligne As DataRow In Table.Select("numéro = " & 398)
            Ligne.Delete()
        Next
        '------------------------------------------------------
        Debug.Print(Table.Rows.Count & " Ligne(s)") '<- 1 Ligne(s)


Les deux boucle ci dessus font exactement la même chose. Sauf que la 1ère stocke le tableau puis le parcours. Alors que la seconde parcours directement le tableau.

Il existe peut être mieux mais je ne sait faire que comme sa personnellement.

Si tu à plusieurs "numéro" à chercher en même temps, tu peut aussi utiliser l'opérateur IN (dans mon 1er message)

Amicalement
1000 recherches sur Google = 1Km de voiture en CO² (réfuté par Google )
1000 recherches sur Forestle = 100 m² de forêt tropicale sauvé .
Surfez écolo
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
5 avril 2011 à 10:23
Je crois avoir compris ton problème
En faite ton problème est de trouver quel numéro n'existe pas dans ta seconde table.

La solution est d'utiliser le Link pour extraire tout les numéro de ton dataset de façon unique. (Dans ton exemple sa retournerais "0398" et "1039")

Il te reste ensuite à faire un :
select distinct ... from ... where numéro not in (<Les codes extraient/>)

Et ainsi avoir la liste des numéro à supprimer de ton dataset.
Reste plus qu'à supprimer les lignes contenant ces numéro de ton dataset

Si c'est bien sa dit le moi et je t'aiderais link (je sait plus comment faire là tout de suite mais je sait que c'est pas tout simple comme truc. Mais puissant, tu peut utiliser ton dataset un peut comme si c'était un sgbd)
Par contre je n'aurais pas le temps de t'aider là dessus aujourd'hui

L'idéale aurais été que tes deux tables soit en base de données comme sa une simple requête et c'était fini

Si non tu peut également extraire tout les numéro existant dans ta seconde table ("select distinct ... from ...") et faire un select "NOT IN" dans ta 1ère table.

Table.Select("numéro = NOT IN (" & 1039
 & "," & 1 & ")"

Cette ligne de code sélectionne toute les ligne de la table où le numéro n'est pas 1039 ou 1

Amicalement
1000 recherches sur Google = 1Km de voiture en CO² (réfuté par Google )
1000 recherches sur Forestle = 100 m² de forêt tropicale sauvé .
Surfez écolo
0
Rejoignez-nous