FILTRER UN DATASET VIA UN DATAVIEW.ROWFILTER PUIS LE SAUVER EN XML

cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018 - 6 juil. 2005 à 15:29
cs_JoBleu Messages postés 91 Date d'inscription dimanche 18 août 2002 Statut Membre Dernière intervention 21 février 2015 - 19 déc. 2009 à 17:08
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/32544-filtrer-un-dataset-via-un-dataview-rowfilter-puis-le-sauver-en-xml

cs_JoBleu Messages postés 91 Date d'inscription dimanche 18 août 2002 Statut Membre Dernière intervention 21 février 2015
19 déc. 2009 à 17:08
Ah au fait encore une chose : merci à Patrice, sans qui je n'aurais probablement pas trouvé.
cs_JoBleu Messages postés 91 Date d'inscription dimanche 18 août 2002 Statut Membre Dernière intervention 21 février 2015
19 déc. 2009 à 17:00
Ah au fait ça y est j'ai envoyé le retour à Microsoft.
cs_JoBleu Messages postés 91 Date d'inscription dimanche 18 août 2002 Statut Membre Dernière intervention 21 février 2015
19 déc. 2009 à 16:43
J'ai trouvé !
Le bug du constructeur DataView à quatre paramètres se situe au niveau de l'aide.
On demande une chaîne de caractères en deuxième posision pour préciser le filtre, donc, intuitivement, on se dit que si on ne veut pas mettre de filtre il faut y mettre une chaîne vide. Si on fait ça, le tri ne fonctionne pas. Il faut mettre null, et oublier tout le reste.
cs_JoBleu Messages postés 91 Date d'inscription dimanche 18 août 2002 Statut Membre Dernière intervention 21 février 2015
19 déc. 2009 à 14:43
Bon, ce n'est pas tout-à-fait ça.
Nous avons utilisé des constructeurs différents, et le comportement de la DataView est différent selon le constructeur utilisé. Si je ne m'abuse tu t'es surtout intéressé au filtre, ce qui fait que les particularités concernant le tri ne t'ont pas perturbé.
Apparemment, la (ou en tout cas une) bonne tactique pour trier une table consiste à déclarer la DataView avec juste en premier argument le clône de la table, pour chaque enregistrement créer une occurrence de la DataView par AddNew, copier les valeurs de chaque champ sur cette nouvelle occurrence, et pour finir, après cette boucle, initialiser la propriété Sort de la DataView. Dans le test que j'ai rapidement fait je n'ai renseigné que le champ qui sert au tri, mais ça me paraît une voie prometteuse.
ça laisserait entendre un bug au niveau du constructeur de DataView comportant directement un champ de tri ?
cs_JoBleu Messages postés 91 Date d'inscription dimanche 18 août 2002 Statut Membre Dernière intervention 21 février 2015
19 déc. 2009 à 14:14
Bon, si je comprends bien on ne peut pas programmer pareil les deux versions, alors ...
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
19 déc. 2009 à 13:52
Dans mon exemple le dvFiltre contient bien les éléments de la table : le .Count les compte, et le .Item permet d'accéder à chaque drv. Et pour chaque drv, il y a encore un .Item pour accéder à chaque champ cette fois.
Le pb que tu as c'est juste de trier les éléments ? Je ne sais pas si ta méthode pour trier est la bonne ou pas, ça me parait bizarre quand même.
cs_JoBleu Messages postés 91 Date d'inscription dimanche 18 août 2002 Statut Membre Dernière intervention 21 février 2015
19 déc. 2009 à 13:18
Quant à une raison de ne pas migrer, j'en vois une : il reste 10,3 Go sur mon disque dur, en dessous de 10 la machine se fige (oh, au fait, il est temps que je fasse du ménage).
cs_JoBleu Messages postés 91 Date d'inscription dimanche 18 août 2002 Statut Membre Dernière intervention 21 février 2015
19 déc. 2009 à 13:12
Oui, je cherchais un exemple qui fonctionne, c'est comme ça que je suis arrivé ici :)
Bon là c'est sur le plan conceptuel que j'ai du mal à accrocher, alors forcément pour l'exemple c'est peut-être prématuré : le dv.Count, n'est-il pas supposé être à zéro, une fois la ligne validée ? Or tu parcours la collection, ce qui laisse entendre que tu t'attends à ne pas la trouver vide.
Dans la fenêtre immédiate, je vois quelque chose d'intéressant :
? dv.Item[0]
'System.Data.DataView' does not contain a definition for 'Item'
ça commence bien, déjà :)
ça laisse entendre que Item est l'objet qu'on adresse ainsi :
? dv[0]
'dv[0]' threw an exception of type 'System.IndexOutOfRangeException'
base {System.SystemException}: {"L'index 0 est négatif ou supérieur au nombre de lignes."}

Ah oui mais encore s'agit-il de l'appeler lorsque dv.Count n'est pas à zéro, donc juste après le AddNew :
? dv.Count
0x00000001
? dv[0]
{System.Data.DataRowView}
DataView: {System.Data.DataView}
IsEdit: true
IsNew: true
Row: {System.Data.DataRow}
RowVersion: Current
Bon, là, déjà, on a des trucs. Enfin ... on en a un. Celui qu'on vient de créer.
Mais ça ne me donne pas accès aux enregistrements qui existaient avant, qui, eux, sont accessibles dans dv.Table, mais dans l'ordre de création.
Vous avez dit serpent qui se mord la queue ?
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
19 déc. 2009 à 09:33
Non, j'ai pour habitude de poster des sources qui tournent en prod., et non simplement des élucubrations qui me passent par la tête.
Le for each utilise la propriété par défaut je crois pour trouver la collection Item.
Avec VB 2008, l'intellisense fonctionne (je crois qu'il n'existe aucune raison particulière de rester en 2005 : ça serait temps de migrer). La propriété Item est également dans l'aide de VB 2008 : c'est une propriété indexée (Items n'existe donc pas).
Ta déclaration de DataView dv est correcte : en fait elle utilise comme paramètre du constructeur du DataView un DataTable : j'ai vérifié dans l'aide, un tel constructeur existe bien, et aussi avec 4 paramètres comme tu l'as fait, alors qu'est-ce qui ne va pas ?
En fait la manipulation des Datasets, Datatables et consort n'est pas complètement intuitive, mais elle est logique après coup : un conseil : lorsque tu butes sur l'écriture d'un code, cherche des exemples qui fonctionnent pour t'en inspirer, c'est comme ça que je fais, car parfois moi aussi je n'arrive pas à écrire directement du code, ce n'est pas si évident que cela.
cs_JoBleu Messages postés 91 Date d'inscription dimanche 18 août 2002 Statut Membre Dernière intervention 21 février 2015
18 déc. 2009 à 19:08
Ah, tu es en train de m'expliquer que ton code a besoin d'une retouche ? :)
Bon, je regarde ça. Mais je suis un peu désorienté par une chose : l'aide de DataView fait effectivement apparaître une propriété Item, mais l'Intellisense ne me le fait pas apparaître, sur ma DataView, dv.
Elle est déclarée comme suit, tu y comprends quelque chose ?
Au fait je me demande si on n'aurait pas carrément besoin d'une collection Items, mais comme ça on ne le trouve ni dans l'Intellisense ni dans l'aide, j'ai l'impression de faire fausse route.

ds.Tables[0].DefaultView.Sort = "DateCible";
foreach (DataRow r in ds.Tables["tabRepet"].Rows)
{
int ervalle = (int)r["repIntervalle"];
dt.Rows.Add(r["repIntitule"], r["repDate"], r["repIntervalle"], (long)((DateTime)r["repDate"]).AddDays(ervalle).Ticks);
}
DataView dv = new DataView(dt, "", "DateCible", DataViewRowState.ModifiedOriginal);
dv.Table.DefaultView.Sort = "DateCible";

Pour info, au départ le champ repDate était de type date, et comme je n'arrivais pas à trier je craignais qu'il s'agisse d'un problème de tri de dates, c'est pour ça que j'ai converti en long. De toute façon si je ne m'abuse ça donne le même ordre.

Il y a bien System.Data dans les références du module.
Je travaille sous .Net 2 avec VS 2005.
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
18 déc. 2009 à 11:50
Ha je comprends maintenant. En fait c'est la propriété Item : c'est là où se trouve la collection de DataRowView.
cs_JoBleu Messages postés 91 Date d'inscription dimanche 18 août 2002 Statut Membre Dernière intervention 21 février 2015
18 déc. 2009 à 11:11
En fait c'est surtout du tien que je parlais :
For Each dvr As DataRowView In dvFiltre
Si il n'y a pas de DataRowView dans dvFiltre, il ne va rien se passer pas vrai ?
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
18 déc. 2009 à 08:38
Il arrive que je demande des infos complémentaires directement à la personne qui pose une question, et parfois elle ne me répond pas : je ne me souviens plus si c'est le cas ici (je reconnais avoir aussi zappé des questions mais pas beaucoup je crois).

> quand j'ai défini une DataView elle ne comporte pas de DataRowView, toutes ses données sont dans sa table

Exact : pas de DataRowView dans DataView, c'est normal.

> Quand j'ai voulu ajouter des éléments par DataRowView, le DataView.Count redescend à 0 dès que je valide le DataRowView par EndEdit().

Une vue ne sert pas à ajouter des éléments, par contre on peut importer des données dans une dataTable via une vue. Je ne sais pas trop pour ta question, mais je pense qu'il faut bien distinguer les vues des données. Tu peux peut etre envoyer un bout de code par mail, pour que je voie ce qui ne va pas ?
cs_JoBleu Messages postés 91 Date d'inscription dimanche 18 août 2002 Statut Membre Dernière intervention 21 février 2015
17 déc. 2009 à 15:47
Le sujet est inusable. On en parle beaucoup et pas toujours utilement. ça a l'air pas mal et surtout simple, mais pour ma part j'ai un souci : quand j'ai défini une DataView elle ne comporte pas de DataRowView, toutes ses données sont dans sa table. Quand j'ai voulu ajouter des éléments par DataRowView, le DataView.Count redescend à 0 dès que je valide le DataRowView par EndEdit(). Donc la collection DataRowView in dvFiltre ne retourne pas d'élément. Créer un tableau de DataRowView ne m'a pas paru évident de par l'absence de constructeur, et je ne suis pas bien certain que ce soit la bonne voie.
C'est où que j'ai loupé un truc ?
Aïe, je sens que ma question va dans le même sens que celle d'Aiglon, qui n'a guère eu de chance il y a deux ans et demi.
aiglon2006 Messages postés 5 Date d'inscription dimanche 8 octobre 2006 Statut Membre Dernière intervention 9 avril 2008
2 juil. 2007 à 22:38
salut;
si vous pouvez maider a eviter les doublons par le code avant de faire un ajout ds la base de données.
je sais bien qu je doi utiliser "dataview" mai je sais pa comment je peut travailler avec.
et merci d'avance
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
11 juil. 2005 à 13:42
Oui c'est cela.

Note : on peut utiliser la même technique pour recharger un unique DataSet à partir de 2 fichiers xml filtrés de façon complémentaire. En l'occurrence j'avais des messages communs à sauver dans un fichier unique et des messages spécifiques à plusieurs clients à sauver dans des fichiers distincts, et j'ai utilisé un simple booléen pour distinguer les 2 cas (spécifique ou pas). Grace à ce système j'ai pu conserver le reste du code identique avec un DataSet unique.
cs_Benouille Messages postés 215 Date d'inscription jeudi 24 octobre 2002 Statut Membre Dernière intervention 7 septembre 2007
11 juil. 2005 à 11:19
le .clone n'importe que la structure?
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
6 juil. 2005 à 15:29
Note : La source n'est pas de moi.
Rejoignez-nous