cs_JoBleu
Messages postés91Date d'inscriptiondimanche 18 août 2002StatutMembreDernière intervention21 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és91Date d'inscriptiondimanche 18 août 2002StatutMembreDernière intervention21 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és91Date d'inscriptiondimanche 18 août 2002StatutMembreDernière intervention21 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és91Date d'inscriptiondimanche 18 août 2002StatutMembreDernière intervention21 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és91Date d'inscriptiondimanche 18 août 2002StatutMembreDernière intervention21 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és1221Date d'inscriptionjeudi 23 août 2001StatutMembreDerniè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és91Date d'inscriptiondimanche 18 août 2002StatutMembreDernière intervention21 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és91Date d'inscriptiondimanche 18 août 2002StatutMembreDernière intervention21 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és1221Date d'inscriptionjeudi 23 août 2001StatutMembreDerniè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és91Date d'inscriptiondimanche 18 août 2002StatutMembreDernière intervention21 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és1221Date d'inscriptionjeudi 23 août 2001StatutMembreDerniè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és91Date d'inscriptiondimanche 18 août 2002StatutMembreDernière intervention21 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és1221Date d'inscriptionjeudi 23 août 2001StatutMembreDerniè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és91Date d'inscriptiondimanche 18 août 2002StatutMembreDernière intervention21 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és5Date d'inscriptiondimanche 8 octobre 2006StatutMembreDerniè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és1221Date d'inscriptionjeudi 23 août 2001StatutMembreDerniè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és215Date d'inscriptionjeudi 24 octobre 2002StatutMembreDernière intervention 7 septembre 2007 11 juil. 2005 à 11:19
le .clone n'importe que la structure?
cs_Patrice99
Messages postés1221Date d'inscriptionjeudi 23 août 2001StatutMembreDernière intervention 9 septembre 2018 6 juil. 2005 à 15:29
19 déc. 2009 à 17:08
19 déc. 2009 à 17:00
19 déc. 2009 à 16:43
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.
19 déc. 2009 à 14:43
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 ?
19 déc. 2009 à 14:14
19 déc. 2009 à 13:52
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.
19 déc. 2009 à 13:18
19 déc. 2009 à 13:12
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 ?
19 déc. 2009 à 09:33
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.
18 déc. 2009 à 19:08
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.
18 déc. 2009 à 11:50
18 déc. 2009 à 11:11
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 ?
18 déc. 2009 à 08:38
> 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 ?
17 déc. 2009 à 15:47
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.
2 juil. 2007 à 22:38
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
11 juil. 2005 à 13:42
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.
11 juil. 2005 à 11:19
6 juil. 2005 à 15:29