Partage
  • Partager sur Facebook
  • Partager sur Twitter

Trie de dates avec OleDB - Excel en C# - V.S

Sujet résolu
    13 avril 2021 à 9:08:16

    Bonjour à tous,

    je suis en train de développer un mini logiciel qui me permettra à moi et mon équipe de pouvoir rechercher dans un fichier Excel ( conséquent ) des clients que nous devons contacter grâce à des dates limites.

    - Ce que j’ai réussi : Grâce à OleDB et ses fonctions, j’ai réussi à pouvoir charger/afficher un fichier Excel sur un datagrid

    - Le problème : Ayant des difficultés dans un premier temps à bien comprendre les procédures dont je me suis servi pour afficher le fichier Excel en entier, je n’arrive pas à trouver de solutions pour pouvoir afficher seulement les lignes contenant des dates limites qui arrivent à leur fin.

    En gros : Il existe une colonne contenant des dates pour chaque individu, et j’aimerais pouvoir afficher seulement les individus qui « ont » une date proche de la date actuelle.

    Je vous remercie à tous pour le temps que vous m’accordez.

    • Partager sur Facebook
    • Partager sur Twitter
      13 avril 2021 à 10:18:43

      Si vous avez utilisé les méthodes "habituelles" (donc pas "afficher un fichier Excel" mais extrait des données tabulaires depuis le contenu d'un fichier Excel), vous devriez avoir toutes vos données dans des DataTable eux même dans un DataSet.

      La méthode traditionnelle pour leur appliquer un tri et/ou un filtrage, c'est via une DataView :

      https://docs.microsoft.com/fr-fr/dotnet/api/system.data.dataview?view=net-5.0

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        13 avril 2021 à 12:15:20

        Je repars de 0 alors pour être sûr de ne pas faire n’importe quoi.

        Essayons d’extraire les donnés Excel. 

        Je pense avoir trouver un post qui nous donne la méthode adéquate : 

        https://codes-sources.commentcamarche.net/source/43422-importer-une-feuille-excel-dans-une-datatable

        Clairement j’ai suivi les lignes inscrites pour mieux comprendre le code, j’ai copié collé cette fonction que j’appelle dans la méthode d’un bouton ( en gros quand je clique sur un bouton je voudrais que cette fonction s’exécute ).

        Mais une erreur apparaît me disant quand je compile m’indiquant que le fichier ne peut pas être ouvert, qu’il est déjà utilisé par quelqu’un d’autre ( or pas du tout, le fichier n’est pas ouvert ).

        Je vous remercie, et pardon d’avance si mon niveau n’est pas élevé sur ce langage, je suis en auto-learning pour le coup ..

        voici la partie du code qui nous intéresse :

        public partial class Form1 : Form
            {
                private static OleDbConnection connectionXLS = new OleDbConnection();
                private static OleDbCommand commandXLS = new OleDbCommand();
                private static OleDbDataReader readerRequete;
         
                /// <summary>
                /// Fonction qui lit un tableau dans un fichier xls et retourne une Datatable
                /// </summary>
                /// <param name="xlsFile">Chemin du fichier XLS</param>
                /// <param name="xlsSheet">Nom de la feuille</param>
                /// <returns>Retourne une DataTable</returns>
                public static DataTable excelToTable(String xlsFile, String xlsSheet)
                {
                    DataTable tableXls = new DataTable();
                    DataRow lineXls = null;
         
                    connectionXLS.ConnectionString = "Data Source=" + xlsFile + "; Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;";
                    commandXLS.Connection = connectionXLS;
                    commandXLS.CommandType = System.Data.CommandType.Text;
                    commandXLS.CommandText = "select * from [" + xlsSheet + "$];";
         
                    connectionXLS.Open();
                    readerRequete = commandXLS.ExecuteReader();
         
                    //On récupére le schema du datareader
                    DataTable schemaXls = readerRequete.GetSchemaTable();
         
                    //Création des colonnes de la datatable de retour via le schema du Datareader
                    for (int i = 0; i < schemaXls.Rows.Count; i++)
                    {
                        DataRow line = schemaXls.Rows[i];
                        String columnName = line["ColumnName"].ToString();
         
                        DataColumn column = new DataColumn(columnName);
                        tableXls.Columns.Add(column);
                    }
         
                    //On parcourt les lignes du datareader qu'on ajoute à la datatable
                    while (readerRequete.Read())
                    {
                        lineXls = tableXls.NewRow();
                        for (int i = 0; i < readerRequete.FieldCount; i++)
                        {
                            lineXls[i] = readerRequete[i];
                        }
         
                        tableXls.Rows.Add(lineXls);
                    }
         
                    readerRequete.Close();
                    connectionXLS.Close();
                    return tableXls;
                }
                public Form1()
                {
                    InitializeComponent();
                }
         
                private void Form1_Load(object sender, EventArgs e)
                {
         
                }
         
                private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
                {
                  //  dataGridView1.DataSource = result.Tables[comboBox1.SelectedIndex];
                }
         
                private void Ouverturecomplete_Click(object sender, EventArgs e)
                {
                    string chemin = "C:\\Users\\scoll\\Documents\\OuvertureExcel\\fichiertest";
                    string namefichier = "fichiertest";
         
                    excelToTable(chemin, namefichier);



        -
        Edité par SachaColl 13 avril 2021 à 13:30:00

        • Partager sur Facebook
        • Partager sur Twitter
          13 avril 2021 à 16:25:17

          Le dernier message à disparu ?
          • Partager sur Facebook
          • Partager sur Twitter
          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
            14 avril 2021 à 11:52:10

            PS : problème dernier message :


            Je repars de 0 alors pour être sûr de ne pas faire n’importe quoi.

            Essayons d’extraire les données Excel. 

            Je pense avoir trouver un post qui nous donne la méthode adéquate : 

            https://codes-sources.commentcamarche.net/source/43422-importer-une-feuille-excel-dans-une-datatable

            Clairement j’ai suivi les lignes inscrites pour mieux comprendre le code, j’ai copié collé cette fonction que j’appelle dans la méthode d’un bouton ( en gros quand je clique sur un bouton je voudrais que cette fonction s’exécute ).

            Mais une erreur apparaît me disant quand je compile m’indiquant que le fichier ne peut pas être ouvert, qu’il est déjà utilisé par quelqu’un d’autre ( or pas du tout, le fichier n’est pas ouvert ).

            Je vous remercie, et pardon d’avance si mon niveau n’est pas élevé sur ce langage, je suis en auto-learning pour le coup ..

            voici la partie du code qui nous intéresse :
             

            public partial class Form1 : Form
                {
                    private static OleDbConnection connectionXLS = new OleDbConnection();
                    private static OleDbCommand commandXLS = new OleDbCommand();
                    private static OleDbDataReader readerRequete;
             
                    /// <summary>
                    /// Fonction qui lit un tableau dans un fichier xls et retourne une Datatable
                    /// </summary>
                    /// <param name="xlsFile">Chemin du fichier XLS</param>
                    /// <param name="xlsSheet">Nom de la feuille</param>
                    /// <returns>Retourne une DataTable</returns>
                    public static DataTable excelToTable(String xlsFile, String xlsSheet)
                    {
                        DataTable tableXls = new DataTable();
                        DataRow lineXls = null;
             
                        connectionXLS.ConnectionString = "Data Source=" + xlsFile + "; Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;";
                        commandXLS.Connection = connectionXLS;
                        commandXLS.CommandType = System.Data.CommandType.Text;
                        commandXLS.CommandText = "select * from [" + xlsSheet + "$];";
             
                        connectionXLS.Open();
                        readerRequete = commandXLS.ExecuteReader();
             
                        //On récupére le schema du datareader
                        DataTable schemaXls = readerRequete.GetSchemaTable();
             
                        //Création des colonnes de la datatable de retour via le schema du Datareader
                        for (int i = 0; i < schemaXls.Rows.Count; i++)
                        {
                            DataRow line = schemaXls.Rows[i];
                            String columnName = line["ColumnName"].ToString();
             
                            DataColumn column = new DataColumn(columnName);
                            tableXls.Columns.Add(column);
                        }
             
                        //On parcourt les lignes du datareader qu'on ajoute à la datatable
                        while (readerRequete.Read())
                        {
                            lineXls = tableXls.NewRow();
                            for (int i = 0; i < readerRequete.FieldCount; i++)
                            {
                                lineXls[i] = readerRequete[i];
                            }
             
                            tableXls.Rows.Add(lineXls);
                        }
             
                        readerRequete.Close();
                        connectionXLS.Close();
                        return tableXls;
                    }
                    public Form1()
                    {
                        InitializeComponent();
                    }
             
                    private void Form1_Load(object sender, EventArgs e)
                    {
             
                    }
             
                    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
                    {
                      //  dataGridView1.DataSource = result.Tables[comboBox1.SelectedIndex];
                    }
             
                    private void Ouverturecomplete_Click(object sender, EventArgs e)
                    {
                        string chemin = "C:\\Users\\scoll\\Documents\\OuvertureExcel\\fichiertest";
                        string namefichier = "fichiertest";
             
                        excelToTable(chemin, namefichier);


            • Partager sur Facebook
            • Partager sur Twitter
              14 avril 2021 à 12:23:50

              Le code qui vous sert de référence est obsolète depuis au moins 15 ans mais pour ce que vous avez à faire, ça peut passer (mais franchement, la requête vulnérable aux SQL Injections, c'est vraiment mais vraiment pas top).

              Pensez à utiliser des références qui passent au moins des DataAdapter ( mais les ORM c'est bien aussi) et plus par ces cochonneries de DataReader.

              >quand je compile m’indiquant que le fichier ne peut pas être ouvert

              Vous êtes sur que c'est à la compilation ?

              Si oui, de quel fichier parlons-nous ?

              >qu’il est déjà utilisé par quelqu’un d’autre ( or pas du tout, le fichier n’est pas ouvert ).

              Si c'est à l'exécution et qu'on parle bien du fichier "fichiertest", le cas le plus fréquent, c'est l'auto-verrouillage du fichier (fichier déjà ouvert par le même programme).

              Comme vous n'utilisez pas l'instruction "using" pour protéger l'accès aux fichiers, il y a de grosses probabilité que c'est votre programme qui oublie de déverrouiller le fichier après utilisation.

              • Partager sur Facebook
              • Partager sur Twitter
              Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                14 avril 2021 à 13:38:31

                Honnêtement je ne vois pas comment assurer la sécurité du programme, à l'Université on ne m'a jamais enseigné comment assurer la sécurité de son programme ni ce qui était vulnérable ou non.

                Oui en effet c'est à l'exécution je me suis mal exprimé, nous parlons également du "fichiertest" : le programme se lance mais lorsque je clique sur le bouton qui contient la fonction, il y a ce problème. Mais alors dans ce cas, l'ancien code était à mon avis plus adapter.

                Je décide donc de reprendre l'ancien code qui présente des DataAdapter, qui évite aussi les DataReader, et qui utilise l'instruction "using" qui évite le verrouillage constant du fichier.

                Maintenant c'est bon, le fichier s'affiche correctement sur le datagrid, et si j'ai bien compris, on ne se contente pas seulement d'afficher le fichier excel, puisque les données du fichier sont extraits dans un DataSet ( dans le code "dat" ).


                Avant d'essayer de récupérer les dates de la colonne qui m'intéresse pour les comparer avec une date précise, pouvons nous clarifier ce code pour m'assurer que d'autres notions ne m'échappent pas ( comme la requête vulnérable aux SQL Injections ) ?

                Merci de partager vos connaissances

                            openFileDialog1.ShowDialog();
                            string fichiertest = openFileDialog1.FileName;
                            //string nom fichier = mycomputer.filesystem.currentdirectory + "//monfichier.xlsx";
                            DataSet dat = default(DataSet);
                            dat = new DataSet();
                            //délcaration et utilisation d'un OLeDBConnection
                            using (OleDbConnection Connexion = new OleDbConnection("Provider = Microsoft.ACE.OLEDB.12.0;" + "Data Source='" + fichiertest + "';" + "Extended Properties =\"Excel 12.0 XML;\""))
                 
                            {
                                Connexion.Open();
                                //déclaration du DataAdapter
                                //notre requête sélectionne toute les cellules de la feuille :
                                using (OleDbDataAdapter Adapt = new OleDbDataAdapter("select * from [Feuil1$]", Connexion))
                                {
                                    Adapt.TableMappings.Add("Table", "TestTable");
                                    //Chargement du Dataset
                                    Adapt.Fill(dat);
                                    dataGridView1.DataSource = dat.Tables[0];
                                }
                                //Fin de connexion
                                Connexion.Close();
                            }


                 

                • Partager sur Facebook
                • Partager sur Twitter
                  14 avril 2021 à 15:53:50

                  Ok, code bien plus simple et safe, grâce à l'utilisation l'utilisation des using, ligne 10 et 21 inutiles, voire dangereuses, supprimez les.

                  Ici, il n'y pas de constructions dangereuses de requêtes, donc safe. Si vous voulez "paramétrer" des requêtes, bin, utilisez des requêtes paramétrées (captain obvious inside).

                  Vous pouvez sortir la ligne 18 des using (après la ligne 22), pour réduire le temps où le fichier Excel est ouvert et donc réduire aussi le temps où une erreur peut foutre le Bronx dans les données.

                  >puisque les données du fichier sont extraits dans un DataSet

                  Oui, dans une DataTable contenu dans un DataSet, pour être plus précis.

                  >Avant d'essayer de récupérer les dates de la colonne qui m'intéresse pour les comparer avec une date précise

                  Comme vous faite des requêtes SQL pas "typées" (le * dans une requête SQL ne pose pas de problème de sécurité mais niveau maintenance et adaptabilité au changement, c'est vraiment pas top), tout ce que vous récupérez est peu ou prou des "objects". Vous pouvez vous coller vous-même tous les cast nécessaires par la suite, où faire confiance à vos composants de visualisation pour qu'ils affiches ces choses le mieux possible, mais ça serait quand même plus simple et safe d'utiliser un DataSet typée (donc avec DataTable/DataColumn/Relations défini à la compilation).

                  >comme la requête vulnérable aux SQL Injections

                  Dans le second code, il n'y a plus de vulnérabilités par SQL Injections car votre requête SQL n'est plus construite par concaténation de chaîne de caractères potentiellement influençable par un utilisateur.

                  Mais dans la première version du code, imaginez que le paramètre "xlsSheet" n'est plus en dur mais récupérer des noms des onglets du fichier Excel, et qu'un utilisateur taquin nomme un onglet '/*JeVeuxTeNiquer*/ toto]; DROP TABLE [USERS]; --", il se passe quoi ?

                  Si USERS est accessible via un DBLINK ou que c'est un onglet protégé du fichier Excel ? Bingo !!!

                  Votre dernier code a quand même une vulnérabilité au niveau du fait que le fichier lu est donné par l'utilisateur et qu'il peut contenir bien des choses qui peuvent "contaminer" la "vue" de l'utilisateur (qui n'est pas forcement l'auteur du fichier) et les données  "centrales" si les données du fichier Excel servent de sources primaires d'information.

                  Généralement, on utilise les systèmes de protection des connectionString intégrés à .NET pour éviter de choper tout et n'importe quoi dedans.

                  Pour le problème du filtrage, au lieu de donner une DataTable comme DataSource de "dataGridView1", utilisez une DataView sur cette DataTable (comme en passant la DataTable en paramètre du constructeur de la DataView) et configurez la propriété RowFilter de la DataView avec l'expression de ou des conditions qui vous intéresse :

                  https://docs.microsoft.com/fr-fr/dotnet/api/system.data.dataview.rowfilter?view=net-5.0

                  P.S.: Si l'expression de filtrage est complexe, il se peut que vous soyez obligé de basé par des DataSet/DataTable/DataColumn typés.

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                    14 avril 2021 à 17:30:02

                    Merci pour vos explications

                    >Ok, pour les lignes 10 et 21 éliminées car on a les using maintenant.

                    >J'ai pris compte de ce que vous m'avez dis et j'ai sorti des using les lignes 18 et 22.

                    >Effectivement la vulnérabilité principale viendrait du fait que ce soit l'utilisateur qui fournit le fichier, c'est un élément que je prendrai en compte du coup si ce nouveau outil sera utilisé par d'autres individus, pour le moment je me suis occupé de traiter les fichiers lus.

                    > Je vais me renseigner concernant les systèmes de protection des connectionString intégrés dans les prochains jours, merci.

                    > Le point que j'ai saisi serait pour appliquer mon filtre avec la propriété RowFilter :

                       nomDataview.RowFilter = "DatesLimites = DateActuelle";
                    Cependant, je vais chercher comment récupérer "DateActuelle".

                    >En revanche pour utiliser une DataView sur la DataTable je n'ai pas compris. 

                    En sachant que je voudrais que ce filtre s'applique en cliquant sur un bouton différent du bouton où est inscrit ce code ( c'est à dire private void OuvertureComplete va contenir tout le code jusqu'à là développé, mais private void Filtrage va contenir seulement le code permettant le filtrage du Datagrid ) il n'y a pas une erreur si je crée ma DataView dans le private void OuvertureComplete ?
                    Et sinon comment le disposer ?

                    > Pour finir quand vous employez le terme "utiliser une DataView sur cette DataTable", que voulez-vous dire exactement ?  
                       Je dois remplacer la ligne suivante de quelle manière ? "
                    dataGridView1.DataSource = dat.Tables[0];" 

                    • Partager sur Facebook
                    • Partager sur Twitter
                      14 avril 2021 à 21:01:05

                      >j'ai sorti des using les lignes 18 et 22.

                      Heu, non, c'est mettre le contenu de la ligne 18 APRÈS le contenu de la ligne 22 (la fin du using "le plus externe").

                      >outil sera utilisé par d'autres individus, pour le moment je me suis occupé de traiter les fichiers lus.

                      Si la sécurité n'est prise en compte dès le départ, il est quasi impossible de l'ajouter "correctement" après, vous êtes prévenu.

                      >je vais chercher comment récupérer "DateActuelle"

                      https://docs.microsoft.com/fr-fr/dotnet/api/system.datetime.now?view=net-5.0

                      Mais comme vous n'avez pas fortement typées vos DataTable, il y a des chances que les comparaisons spécifiées dans "RowFilter" se feront via référence ou pire, via ToString, et vous allez galérer pour rien si le format de date de votre machine/programme/thread est différent de celui e votre base de données. En spécifiant les types des colonnes, le DataAdapter a la possibilité de ce mettre d'accord sur un format pivot entre votre programme et le gestionnaire de base de données (ici, le moteur Jet en charge de lire votre fichier Excel).

                      Je le répète, typez vos DataColumn de vos DataTable.

                      Exemple de récupération d'une DataView "par défaut" d'une DataTable + contournement de certains problèmes de dates ici :

                      https://stackoverflow.com/questions/3584571/compare-dates-in-dataview-rowfilter

                      >En revanche pour utiliser une DataView sur la DataTable je n'ai pas compris.

                      Avez-vous lu et compris les exemples fournis dans la documentation de DataView et RowFilter dont j'ai indiqué les URLs ?

                      Mais l'usage de la "DefaultView" comme c'est fait dans la question de SO dont j'ai mis l'URL si avant devrait éviter de vous noyez sous les détails.

                      >filtre s'applique en cliquant sur un bouton différent du bouton où est inscrit ce code

                      Et ???

                      Vous pouvez changer la valeur de la propriété RowFilter de la Dataview source de données de votre DataGridView à n'importe quel moment. C'est votre composant qui se chargera de tout le reste (si vous passez par le DataBinding, aka utiliser sa propriété DataSource avec des sources "Observables", comme des DataSet/DataTable/DataView.

                      >il n'y a pas une erreur si je crée ma DataView dans le private void OuvertureComplete ?

                      Non, aucun problème, mais en utilisant la "DefaultView", vous n'avez même pas à la créer mais juste la configurer, via sa propriété "RowFilter".

                      >Et sinon comment le disposer ?

                      Si vous ne l'allouez pas, pas besoin de la "disposer".

                      Sinon, bin, une DataView, c'est exactement comme les autres objets "IDisposable", c'est votre architecture mise en place qui guiderait cela.

                      >"utiliser une DataView sur cette DataTable"

                      C'est aussi bien le fait de modifier la DefaultView d'une DataTable que de créer une DataView en passant en paramètre de son constructeur la DataTable. A la fin, c'est une DataView.

                      >Je dois remplacer la ligne suivante de quelle manière ? "dataGridView1.DataSource = dat.Tables[0];"

                      Soit vous n'avez qu'un seul critère de filtrage à appliquer à votre DataTable et donc vous pouvez vous servir de sa DefaultView.

                      Donc 

                      dataGridView1.DataSource = dat.Tables[0];

                      devrait fonctionner.

                      Si votre composant n'utilise pas directement la DefaultView, vous pouvez lui forcer la main :

                      dataGridView1.DataSource = dat.Tables[0].DefaultView;

                      Si vous voulez appliquer des filtres différents simultanément sur votre DataTable, vous pouvez créer une DataView dédiées et le code devrait ressembler à un truc du genre :

                      var dv = new DataView(dat.Tables[0]);
                      dv.RowFilter = " #....# = #" + DateTime.Now.toString(...)+ "#";
                      dataGridView1.DataSource = dv;
                      





                      • Partager sur Facebook
                      • Partager sur Twitter
                      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                        15 avril 2021 à 12:56:56

                        Question peut-être bête: pourquoi ne pas utiliser le filtrage propre à Excel ?

                        Sélection de la première ligne (les entêtes des colonnes) puis Menu Accueil > Trier et filter > Filtrer

                        Dans la colonne de tes dates , clique sur le bouton et choisir filtres chronologiques> Après et indiquer ta date limite

                        • Partager sur Facebook
                        • Partager sur Twitter
                          15 avril 2021 à 13:24:39

                          Bacelar : 

                          > Récupérer la date actuelle c’est bon

                          > Je veux bien typer les DataColumn des DataTable, en revanche si je veux typé les DataColumn il faut à tout prix créer la DataTable qui n’existe pas dans la DataSet, sinon DataColumn ne sera pas trouver, de plus si j’ajoute la DataTable à la DataSet a ce moment là le programme n’affiche plus le fichier Excel. 
                          J’ai loupé quelque chose que je n’ai sans doute pas compris ?

                          > Pour la DataView j’ai justement du mal à comprendre malgré la lecture, en revanche j’ai bien saisi l’idée grâce au lien que vous avez transmis ( c’est même ce que vous appliquez dans le code ci dessus )

                          Umfred : 

                          Parce que dans l’outil que j’essaye de mettre en place, je vais ajouter différentes fonctionnalité comme l’envoie d’un email « semi-automatique ».

                          En clair l’idée est de gagné du temps et de la « simplicité » en cliquant sur des boutons ...

                          • Partager sur Facebook
                          • Partager sur Twitter
                            15 avril 2021 à 17:51:55

                            Utilisez le Designer de DataSet typé, vous verrez que c'est très facile d'utiliser le DataSet+les DataTable+les DataColum qui sont spécifiés dans ce DataSet typé.

                            Il ne faut pas faire cela via le code, c'est inutilement complexe, peu visible/maintenable, et le "manque" de dynamisme n'a pas d'inconvénient car vos fichiers Excel sont sensés avoir un format fixe, non ?

                            >sinon DataColumn ne sera pas trouver

                            C'est que vous avez merdé au moment du Fill dans le DataAdapter, quand vous remplissez un DataSet typé, vous devez donnez la DataTable cible et non le DataSet.

                            >de plus si j’ajoute la DataTable à la DataSet a ce moment là le programme n’affiche plus le fichier Excel.

                            Idem, donnez la DataTable cible et non le DataSet lors de l'appel Fill du DataAdapter.

                            >J’ai loupé quelque chose que je n’ai sans doute pas compris ?

                            Oui, que le Fill d'un DataAdapter est à la base fait pour remplir une DataTable et non créer une DataTable dans un DataSet (il fait la création parce que c'est un cas d'usage pratique pour des POC).

                            >fonctionnalité comme l’envoie d’un email « semi-automatique ».

                            Attention a ne pas perdre du temps à réinventer des roues carrées. Des outils de publipostage qui prennent des fichiers Excel pour envoyer des mail, ça existe pas centaines.

                            • Partager sur Facebook
                            • Partager sur Twitter
                            Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                              16 avril 2021 à 11:22:35

                              > Ok j’ai réussi à tout reprendre correctement. J’ai bien une DataTable dans ma DataSet maintenant, et j’ai donné cette DataTable lors de l’appel Fill du DataAdapter. Tout s’affiche et tout est en ordre.

                              > Maintenant il faut que je type mes colonnes. Ok.

                              En revanche : si je type mes colonnes, je dois créer les nouvelles colonnes. Or je ne veux pas créer de nouvelles colonnes mais je souhaite récupérer les dates d’une certaine colonne ( deja inscrite dans le fichier Excel et qui s’affiche ). 

                              Mais alors, si je veux appliquer ce « filtre » des dates limites, je ne peux pas récupérer une colonne qui est déjà dans le fichier Excel ? 

                              Car lorsque j’essaye de détecter ma colonne qui effectivement n’existe pas dans la DataTable, mais bien dans le fichier Excel, alors à l’exécution ça me dit que effectivement, on ne trouve pas la colonne qui se nomme dateOut dans le fichier Excel.

                              Je vous transmet le code ( avec l’erreur dans les dernières lignes ).

                                private void Ouverturecomplete_Click(object sender, EventArgs e)
                                      {
                                          openFileDialog1.ShowDialog();
                                          string fichiertest = openFileDialog1.FileName;
                                          //string nom fichier = mycomputer.filesystem.currentdirectory + "//monfichier.xlsx";
                               
                                          DataSet dat = default(DataSet);
                                          dat = new DataSet();
                                          DataTable datable = new DataTable();
                                          dat.Tables.Add(datable);
                               
                                          // Création de DataColumn + définition du type
                                          DataColumn column = new DataColumn("Dates Limites");
                                          column.DataType = typeof(string);
                               
                                          // Ajout de la colonne à la table
                                          datable.Columns.Add(column);
                               
                                          //délcaration et utilisation d'un OLeDBConnection
                                          using (OleDbConnection Connexion = new OleDbConnection("Provider = Microsoft.ACE.OLEDB.12.0;" + "Data Source='" + fichiertest + "';" + "Extended Properties =\"Excel 12.0 XML;\""))
                               
                                          {
                                             // Connexion.Open(); -> Non nécessaire
                                              //déclaration du DataAdapter
                                              //notre requête sélectionne toute les cellules de la feuille :
                                              using (OleDbDataAdapter Adapt = new OleDbDataAdapter("select * from [Feuil1$]", Connexion))
                                              {
                                                  Adapt.TableMappings.Add("Table", "TestTable");
                                                  //Chargement du Dataset
                                                  Adapt.Fill(datable);
                                              }
                                              //Fin de connexion
                                           //   Connexion.Close();
                                          }
                                          //dataGridView1.DataSource = dat.Tables[0].DefaultView;
                                          dataGridView1.DataSource = dat.Tables[0].DefaultView;
                               
                                          var dv = new DataView(dat.Tables[0]);
                               
                                          string Datetest = DateTime.Now.AddMonths(-1).ToString("dd-MM-yyyy");
                                          dv.RowFilter = " Dateout = Datetest"; // ERREUR IMPOSSIBLE DE TROUVER LA COLONNE DATEOUT
                                          dataGridView1.DataSource = dv;
                               
                                      }


                               

                              • Partager sur Facebook
                              • Partager sur Twitter
                                16 avril 2021 à 19:28:55

                                Vous vous obstiné à créer les DataSet/DataTable/DataColumn à la main plutôt que via le Designer, pourquoi ?

                                Pourquoi la ligne 7 ?

                                Si le titre de la colonne DataColumn et le titre de la colonne sous Excel sont les mêmes, DataAdapter devrait utiliser cette colonne dans la DataTable et non en créer une supplémentaire. (ou il y a l'équivalent pour les colonnes du "TableMapping" que vous avez utilisé ligne 28, mais pour les colonnes).

                                Ligne 14 : pourquoi string et non "DateTime?" ?

                                Les Ligne 13 et 14 peuvent être fusionnées en utilisant le bon constructeur.

                                Si vous n'êtes pas sûr du type récupéré par le DataAdapter, il peut s'avérer pratique de passer par des string, mais ça complexifie un peu l'expression à mettre dans RowFilter. C'était pour éviter cette complexité que je vous ai incité à typer vos colonnes.

                                Ligne 17 : il faut ajouter autant de colonne dans la DataTable qu'il y a de colonne dans le fichier Excel (les colonnes remontées avec "select *").

                                Ligne 36 : Je suis pas sûr, mais je pense qu'il vaudrait mieux assigner "DataSource" APRES avoir configuré la DefaultView.

                                Après lecture des ligne 38 à 42, soit vous utilisez la DefaultView, en la configurant AVANT de l'assigner à DataSource, soit vous créez une DataView dédiée, comme vous le faite aux ligne 38 à 42. Je vous conseille d'utiliser la DefaultView si vous n'utilisez pas cette Table pour un autre affichage. Si vous vous en servez comme source pour plusieurs affichage et que le filtrage est différent pour chacun de ces affichages, passer par des DataView dédiées et non la DefaultView sera pertinent.

                                DefaultView ou DataView dédiée, la configuration sera faite de la même manière. La DefaultView EST une DataView.

                                Pour l'erreur ligne 41, utilisez le débogueur pour voir les noms des colonnes dans la DataTable. Il faut que les noms dans l'expression mise dans RowFilter "matche" parfaitement avec le nom de la colonne que l'on veut utiliser.

                                Vous ne pouvez pas utiliser le "nom"/identifiant d'une variable (encore moins locale) dans l'expression assignée à RowFilter. Vous pouvez utiliser la valeur d'une variable, qui sera calculé au moment de l'évaluation de la chaîne de caractère.

                                dv.RowFilter = $"[Dateout]=#{Datetest}#";

                                (Attention syntaxe valide pour C#6 ou supérieur.)

                                Pour des exemples simples d'usage de RowFilter :

                                https://www.csharp-examples.net/dataview-rowfilter/

                                >Or je ne veux pas créer de nouvelles colonnes mais je souhaite récupérer les dates d’une certaine colonne ( deja inscrite dans le fichier Excel et qui s’affiche ).

                                Il faut comprendre que l'emplacement "réels" des données est dans le DataSet. Le fichier Excel n'est qu'une source de données quelconque, comme un fichier texte ou une base de données relationnelles, etc...

                                Le but, c'est de récupérer toutes les informations dans un DataSet, de faire l'application des règles métiers en utilisant le DataSet comme base de données et d'utiliser les DataView pour mettre en forme les données pour l'affichage à l'utilisateur final ou pour l'application d'autres règles métiers.

                                Ici, Excel, n'est qu'une source de données. Si vous avez besoin d'Excel pour autre chose qu'une source primaire d'information, c'est qu'on se plante d'outils depuis le début.

                                >on ne trouve pas la colonne qui se nomme dateOut dans le fichier Excel.

                                Il y a peut-être un problème d'encodage des caractères. Utilisez le débogueur pout déterminer le titre des colonnes, après le "Fill" da la DataTable.

                                • Partager sur Facebook
                                • Partager sur Twitter
                                Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                                  19 avril 2021 à 9:05:11

                                  >Je ne savais pas qu‘on pouvait les créer à partir du Designer, et je suppose que c’était la raison de mon inquiétude concernant leur utilisation dans d’autres « boutons » virtuels.

                                  >Effectivement on peut sortir la ligne 7, j’avais seulement suivis la syntaxe.

                                  >La ligne 7 est nécessaire dans la syntaxe je suppose, car sinon il y a une erreur lors de la compilation.

                                  >Pour le titre de la colonne c’est bon , je lui ai assigné le même titre que dans le fichier excel et effectivement il utilise la colonne existante déjà dans le fichier excel au lieu d’en créer une autre.

                                  > Car je créer une variable string ( puisque dans l’expression on le convertit avec .ToString ) pour récupérer l’heure actuelle et ne pas me retrouver avec une énorme ligne lors du filtre

                                  >Je vais chercher pour la ligne 13 et 14 du coup

                                  >J’ai rajouté l’ensemble de mes colonnes excel maintenant

                                  >Ligne 36 j’ai donc configurer la DefaulView avant d’assigner « DataSource », je vais faire quelques recherches à ce sujet aussi

                                  >Pour l’erreur ligne 41, c’est réglé partiellement car maintenant que j’ai assigné le bon nom à la colonne dateOut, la colonne du fichier est bien prise en compte, seulement une erreur maintenant affiche que « la chaîne n’a pas été reconnue comme DateTime valide ».

                                  Mais théoriquement, vu que ma colonne du fichier excel je l’ai typé en string, et que ma variable DateTime est aussi en string, la compilation n’est pas censé fonctionné ? 

                                  > J’ai bien repris aussi à la syntaxe de la ligne du RowFilter qui effectivement n’était pas bonne

                                  Je vous remercie pour votre grande aide

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    19 avril 2021 à 14:17:52

                                    @SachaColl Bonjour, je viens de retirer des spams votre dernier message si cela arrive encore vous pouvez poster dans ce sujet Si votre message est considéré comme spam

                                    La modération

                                    (Je réactive  également le troisième message de ce sujet. )

                                    -
                                    Edité par AbcAbc6 19 avril 2021 à 14:20:23

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      19 avril 2021 à 15:22:40

                                      Je vous remercie

                                      -
                                      Edité par SachaColl 19 avril 2021 à 15:23:23

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        19 avril 2021 à 15:40:27

                                        >La ligne 7 est nécessaire dans la syntaxe je suppose, car sinon il y a une erreur lors de la compilation.

                                        Il faut fusionner les ligne 7 et 8.

                                        DataSet dat = new DataSet();

                                        Mais si vous utilisez les DataSet typés, vous devez remplacer "DataSet" par votre type de DataSet.

                                        >Car je créer une variable string ( puisque dans l’expression on le convertit avec .ToString ) pour récupérer l’heure actuelle et ne pas me retrouver avec une énorme ligne lors du filtre

                                        C'est justement pour avoir des expressions concises (donc sans ToString) et typées que vous devriez utiliser "les bons types".

                                        >Je vais chercher pour la ligne 13 et 14 du coup

                                        DataColumn column = new DataColumn("Dates Limites", typeof(string));

                                        ou

                                        DataColumn column = new DataColumn("Dates Limites", typeof(DateTime?));

                                        >Pour l’erreur ligne 41, c’est réglé partiellement

                                        Code et message d'erreur, SVP.

                                        >et que ma variable DateTime est aussi en string, la compilation n’est pas censé fonctionné ?

                                        Si, mais il y a peut-être encore des traces d'un DateTime quelque part (ce que je vous conseille quand même, parce que arithmétiques des dates à partir de chaînes de caractères, c'est très galère).

                                        Code et message d'erreur complet, SVP. Et envisagez sérieusement à utiliser des "DateTime?" plutôt que des "string".

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                                          19 avril 2021 à 16:28:06

                                          Avec le code ci-dessous :

                                          >Ligne 13/14 modifiée : Si je met typeof(DateTime?) pour les colonnes, l’erreur « System.NotSupportedException : DataSet ne prend pas en charge System.Nullable<> s’affiche pendant l’execution.

                                          Cependant en mettant typeof(string) cela fonctionne pour cette partie du code.

                                          >Avant dernière Ligne dv.RowFilter : Erreur de syntaxe : opérande manquant après l’opérateur '16', pendant l’exécution aussi.

                                          openFileDialog1.ShowDialog();
                                                      string fichiertest = openFileDialog1.FileName;
                                           
                                                      DataSet dat = new DataSet();
                                                      // ANICENNE VERSION :
                                                                   //  DataSet dat = default(DataSet);
                                                                   //  dat = new DataSet();
                                           
                                                      // CREATION DataTable :
                                                      DataTable datable = new DataTable();
                                                      dat.Tables.Add(datable);
                                           
                                                      // Création de DataColumn + définition du type :
                                                      DataColumn column = new DataColumn( "dateOut", typeof(string)); // COLONNE QUI NOUS INTERESSE
                                                      DataColumn column2 = new DataColumn("COST PLT");
                                                      DataColumn column3 = new DataColumn("OF");
                                                      DataColumn column4 = new DataColumn("Année Fabrication");
                                                      DataColumn column5 = new DataColumn("Conf ou non");
                                                      DataColumn column6 = new DataColumn("Datein");
                                                      DataColumn column7 = new DataColumn("Serial Number");
                                                      DataColumn column8 = new DataColumn("Client");
                                                      DataColumn column9 = new DataColumn("Charges");
                                                      DataColumn column10 = new DataColumn("Emploie");
                                                      DataColumn column11 = new DataColumn("Type");
                                                      DataColumn column12 = new DataColumn("Modèle");
                                                      DataColumn column13 = new DataColumn("Constructeur");
                                           
                                                      //   column.DataType = typeof(string);
                                           
                                                      // Ajout des colonnes à la table
                                                      datable.Columns.Add(column13);
                                                      datable.Columns.Add(column12);
                                                      datable.Columns.Add(column11);
                                                      datable.Columns.Add(column10);
                                                      datable.Columns.Add(column9);
                                                      datable.Columns.Add(column8);
                                                      datable.Columns.Add(column7);
                                                      datable.Columns.Add(column6);
                                                      datable.Columns.Add(column);
                                                      datable.Columns.Add(column5);
                                                      datable.Columns.Add(column4);
                                                      datable.Columns.Add(column3);
                                                      datable.Columns.Add(column2);
                                           
                                           
                                                      //délcaration et utilisation d'un OLeDBConnection
                                                      using (OleDbConnection Connexion = new OleDbConnection("Provider = Microsoft.ACE.OLEDB.12.0;" + "Data Source='" + fichiertest + "';" + "Extended Properties =\"Excel 12.0 XML;\""))
                                           
                                                      {
                                                          // Connexion.Open(); -> Non nécessaire
                                                          //déclaration du DataAdapter
                                                          //notre requête sélectionne toute les cellules de la feuille :
                                                          using (OleDbDataAdapter Adapt = new OleDbDataAdapter("select * from [Feuil1$]", Connexion))
                                                          {
                                                              Adapt.TableMappings.Add("Table", "TestTable");
                                                              //Chargement du Dataset
                                                              Adapt.Fill(datable);
                                                          }
                                                          //Fin de connexion
                                                          //   Connexion.Close();
                                                      }
                                           
                                                      var dv = new DataView(dat.Tables[0]);
                                                      //dataGridView1.DataSource = dat.Tables[0].DefaultView;
                                           
                                           
                                                      //FILTRE :
                                                           // Test 1 :
                                                               //      string Datetest = DateTime.Now.AddMonths(-1).ToShortDateString("dd-MM-yyyy");
                                                               //   dv.RowFilter = $"[dateOut]=#{Datetest}#";
                                                               ////dv.RowFilter = " #....# = #" + DateTime.Now.toString(...) + "#";
                                                      dv.RowFilter = $"[dateOut] = {DateTime.Now.AddMonths(-1).ToString()}";
                                                      dataGridView1.DataSource = dv;



                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            19 avril 2021 à 19:47:21

                                            >System.NotSupportedException : DataSet ne prend pas en charge System.Nullable<>

                                            Ok, si la colonne peut être vide, on va se rabattre sur une "string" en attendant. (Il doit avoir un truc à base de DBNull mais j'ai plus ça en tête).

                                            https://stackoverflow.com/questions/23233295/dataset-does-not-support-system-nullable-in-export

                                            >Erreur de syntaxe : opérande manquant après l’opérateur '16'

                                            Normal, et les # que j'avais mis dans mon exemple, c'était pas pour faire de la décoration et les "..." s'était pour s'adapter au format "réel" des date dans votre fichier. (Bon le toString à la place du ToString, comment dire, je fais un peu trop e JAVA en ce moment :-° )

                                            En appelant "ToString" sans paramètre, vous allez prendre le format qui correspond la langue de votre thread : meilleur moyen de se retrouver avec un programme qui ne fonction que sur la machine du développeur (les nuits de pleins Lune). Déterminez le format concret des dates issus de votre fichier Excel et utilisez le paramètre de ToString pour que la valeur de retour ait le même format que celui du fichier Excel (en espérant qu'il n'y ait pas d'espace dans ce format, sinon, on espère que les # feront des petits miracles).

                                            Votre "{DateTime.Now.AddMonths(-1).ToString()}" a dû s'expandre en '16 Mars 2021 ...', la priorité des opérateur jouant, l'interpréteur de .NET n'a pas compris quel opérateur utiliser entre '16' et 'Mars'. Donc, vérifiez le format des dates récupérer depuis Excel (en espérant qu'il soit compatible avec une utilisation "facile" avec une expression "RowFilter_isable".

                                            C'est les inconvénients de ne pas avoir de typage fort sur les DataComumn.

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                            Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                                              20 avril 2021 à 14:25:30

                                              >Le format des dates depuis Excel est de la forme : jj/mm/yyyy

                                              >Voici ce que j'ai testé aujourd'hui : 

                                              dv.RowFilter = $"#[dateOut]# == #{DateTime.Now.AddMonths(-1).ToString()}#";   => ERREUR : La chaine n'a pas été reconnue en DateTime valide.

                                              - dv.RowFilter = $"#[dateOut]# == #{DateTime.Now.AddMonths(-1).ToString("dd/MM/yyyy")}#"  => ERREUR : La chaine n'a pas été reconnue en DateTime valide.

                                              dv.RowFilter = $"#[dateOut]# = #{DateTime.Now.AddMonths(-1).ToString("dd/MM/yyyy")}#"  => ERREUR : La chaine n'a pas été reconnue en DateTime valide.

                                              dv.RowFilter = $"[dateOut] = {DateTime.Now.AddMonths(-1).ToString("dd/MM/yyyy")}"  => ERREUR : Impossible d'effectuer une opération '=' sur System.String et System.int32

                                              dv.RowFilter = $"[dateOut] == {DateTime.Now.AddMonths(-1).ToString("dd/MM/yyyy")}"  => ERREUR : Erreur de syntaxe : opérande manquant avant l'opérateur '='.

                                              >Ça va finir par fonctionner à la fin héhé 🤣


                                              -
                                              Edité par SachaColl 20 avril 2021 à 16:24:25

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                20 avril 2021 à 15:47:32

                                                reprend les précédentes réponses de bacelar et si ton format de date est jj/mm/yyyy pourquoi tu formates ta date en dd-MM-YYYY (pourquoi des - à la place des / ??)
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  20 avril 2021 à 16:25:11

                                                  J'ai modifié ça, effectivement petite erreur de ma part mais ça n'a toujours pas résolu les erreurs qui restent là

                                                  UPDATE :

                                                  J'ai modifié le format des cellules de la colonne correspondant, je me suis aperçu que le format était "*dd/MM/yyyy" malgré le fait que la colonne affiche "dd/MM/yyyy".

                                                  Maintenant que j'ai modifié ce format j'ai toujours l'erreur "La chaine n'a pas été reconnue en tant que DateTime valide.

                                                   

                                                  -
                                                  Edité par SachaColl 20 avril 2021 à 17:08:05

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    20 avril 2021 à 17:40:21

                                                    Etes-vous sûr d'avoir besoin du "ToString" ?

                                                    Le nouveau code source, SVP.

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                    Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                                                      21 avril 2021 à 8:47:41

                                                      J’ai retiré le .ToString mais une erreur persiste « la chaîne n’a pas été reconnue en tant que DateTime valide ».

                                                      voici le code :

                                                      openFileDialog1.ShowDialog();
                                                                  string fichiertest = openFileDialog1.FileName;
                                                       
                                                                  DataSet dat = new DataSet();
                                                                  // ANICENNE VERSION :
                                                                               //  DataSet dat = default(DataSet);
                                                                               //  dat = new DataSet();
                                                       
                                                                  // CREATION DataTable :
                                                                  DataTable datable = new DataTable();
                                                                  dat.Tables.Add(datable);
                                                       
                                                                  // Création de DataColumn + définition du type :
                                                                  DataColumn column = new DataColumn( "dateOut", typeof(string)); // COLONNE QUI NOUS INTERESSE
                                                                  DataColumn column2 = new DataColumn("COST PLT");
                                                                  DataColumn column3 = new DataColumn("OF");
                                                                  DataColumn column4 = new DataColumn("Année Fabrication");
                                                                  DataColumn column5 = new DataColumn("Conf ou non");
                                                                  DataColumn column6 = new DataColumn("Datein");
                                                                  DataColumn column7 = new DataColumn("Serial Number");
                                                                  DataColumn column8 = new DataColumn("Client");
                                                                  DataColumn column9 = new DataColumn("Charges");
                                                                  DataColumn column10 = new DataColumn("Emploie");
                                                                  DataColumn column11 = new DataColumn("Type");
                                                                  DataColumn column12 = new DataColumn("Modèle");
                                                                  DataColumn column13 = new DataColumn("Constructeur");
                                                       
                                                                  //   column.DataType = typeof(string);
                                                       
                                                                  // Ajout des colonnes à la table
                                                                  datable.Columns.Add(column13);
                                                                  datable.Columns.Add(column12);
                                                                  datable.Columns.Add(column11);
                                                                  datable.Columns.Add(column10);
                                                                  datable.Columns.Add(column9);
                                                                  datable.Columns.Add(column8);
                                                                  datable.Columns.Add(column7);
                                                                 datable.Columns.Add(column6);
                                                                  datable.Columns.Add(column);
                                                                  datable.Columns.Add(column5);
                                                                  datable.Columns.Add(column4);
                                                                  datable.Columns.Add(column3);
                                                                  datable.Columns.Add(column2);
                                                       
                                                       
                                                                  //délcaration et utilisation d'un OLeDBConnection
                                                                  using (OleDbConnection Connexion = new OleDbConnection("Provider = Microsoft.ACE.OLEDB.12.0;" + "Data Source='" + fichiertest + "';" + "Extended Properties =\"Excel 12.0 XML;\""))
                                                       
                                                                 {
                                                                      // Connexion.Open(); -> Non nécessaire
                                                                      //déclaration du DataAdapter
                                                                      //notre requête sélectionne toute les cellules de la feuille :
                                                                      using (OleDbDataAdapter Adapt = new OleDbDataAdapter("select * from [Feuil1$]", Connexion))
                                                                      {
                                                                          Adapt.TableMappings.Add("Table", "TestTable");
                                                                          //Chargement du Dataset
                                                                          Adapt.Fill(datable);
                                                                      }
                                                                      //Fin de connexion
                                                                      //   Connexion.Close();
                                                                  }
                                                       
                                                                  var dv = new DataView(dat.Tables[0]);
                                                                  //dataGridView1.DataSource = dat.Tables[0].DefaultView;
                                                       
                                                       
                                                                  //FILTRE :
                                                                       // Test 1 :
                                                                         //      string Datetest = DateTime.Now.AddMonths(-1).ToShortDateString("dd-MM-yyyy");
                                                                           //   dv.RowFilter = $"[dateOut]=#{Datetest}#";
                                                                           ////dv.RowFilter = " #....# = #" + DateTime.Now.toString(...) + "#";
                                                                  dv.RowFilter = $"#[dateOut]# = #{DateTime.Now.AddMonths(-1).ToString("dd/MM/yyyy")}#";
                                                                  dataGridView1.DataSource = dv;



                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        21 avril 2021 à 12:26:53

                                                        et si tu supprimais les # autour de dateOut comme bacelar l'a indiqué (et que, a priori, tu n'as jamais respecté, du moins dans les différents codes que tu as transmis sur le forum)

                                                        bacelar a écrit:

                                                        dv.RowFilter = $"[Dateout]=#{Datetest}#";

                                                        (Attention syntaxe valide pour C#6 ou supérieur.)

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          21 avril 2021 à 13:23:55

                                                          Je cite : 

                                                          « dv.RowFilter = "#...# = #" + DateTime.Now.ToString(...) + "#";»

                                                          Je veux bien croire que certaines informations m’échappent, mais peut être que vous n’avez pas pris le temps de tout lire du post de bacelar le 14 Avril à 21h01 et que vous avez retenu le post du 16 Avril à 19h28 ?

                                                          Par conséquent, il y a juste à relire mon post qui énumère toutes les erreurs que j’ai rencontré à cette ligne pour voir que le « jamais respecté » est complètement faux.

                                                          Je vous accorde que je n’ai pas montré l’erreur en testant la proposition sans les # autour du dateOut. 
                                                          La voici :

                                                          « La chaine n’a pas été reconnue en tant que DateTime valide »

                                                          dv.RowFilter = $"[dateOut] = #{DateTime.Now.AddMonths(-1)}#";



                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            21 avril 2021 à 15:18:00

                                                            Quelle est la valeur de "dateOut" et des éléments de l'expression ?

                                                            Le débogueur est notre ami.

                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                            Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                                                              21 avril 2021 à 17:13:56

                                                              Très bien, quand j'active le débogueur, j'essaye de visualiser la colonne correspondant à dateOut et en photo on peut retrouver ce qui s'affiche sur le poste. Deux choses que je remarque, les "erreurs" qui s'affichent, mais je ne sais pas les comprendre. 
                                                              À la limite dans container nous avons "null", nous ne sommes pas censé avoir la première date ?

                                                              Je vous remercie pour votre aide précieuse, même si je n'arrive pas au final à réaliser ce projet j'ai beaucoup apprécié votre partage de connaissances, et je constate que visual studio est un outil puissant pour développer certaines choses.


                                                               

                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              Trie de dates avec OleDB - Excel en C# - V.S

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                              • Editeur
                                                              • Markdown