IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

filtre Recherche multicritère


Sujet :

Windows Forms

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2016
    Messages : 12
    Points : 7
    Points
    7
    Par défaut filtre Recherche multicritère
    Bonjour à tous,

    Je suis débutant dans le développement d'application et je cherche à faire une application simple d'utilisation.

    Actuellement, les utilisateurs ont besoin d'extraire des données provenant d'essais de laboratoire au sein d'une base de données SQL. J'ai environ j'ai pour l'instant 2 millions de lignes dans ma base de données.

    Pour leur permettre d'exploiter les données via un tableau et des graphes depuis les données SQL à travers un filtre multicritère.

    voici les champs de filtre :

    - date de début d'essais
    - heure de début d'essais
    - date de fin d'essais
    - heure de fin d'essais
    - choix de la boucle

    j'ai plusieurs soucis, mon champ dans SQL est un datetime "yyyy-MM-dd ss:nn:hh. Cependant, dans mon filtre je suis obligé de faire deux choix différents, un choix date et un choix heure. mais j'ai des soucis de changement de format car j'utilise un datetimepicker qui ne propose pas le format yyyy-MM-dd et de conversion lorsque je fais ma recherche.
    De plus, je n'ai qu'un champ SQL datetime et lors de mon filtre j'ai donc pensé faire une requête avec une condition between mais ça ne fonctionne pas.

    Je ne sais pas si j'ai été très compréhensif mais je vous joins également mon code. Je suis vraiment néophyte dans le développement donc si vous m'aidez merci d'être compréhensif pour un noob comme moi :-)

    j'avais oublié le code :

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    T1.Text = DateTimePicker1.Value & " " & Hdebut.Text
    T2.Text = DateTimePicker2.Value & " " & Hfin.Text
    Dim req = "Select id_mesure, horodatage, numboucle, Qbn, Qpn1, Qpn2, Qpn3, Qpn4, Qpn5, Qpn6, Qpn7, Qpn8, tn, tprn, pstn, alarmpstn, statusrn, statuspn, statuscn, statusCycle, StatusFonction, tcycoprn, tncycorn, tcyamonn, tcyamoffn, ncyamprn, ncyamrn
    From t_boucle, t_mesure, t_cycle, t_cyclage, t_chauffage Where "


    If Choix_boucle.Text <> "" Then req = req & "numboucle = '" & Choix_boucle.Text & "' and " & "horodatage between(t1.text " And " t2.text) "

    cmd.CommandText = req
    dr = cmd.ExecuteReader
    bs.DataSource = dr
    g1.datasource = bs
    dr.Close()

    End Sub

    le message d'erreur est le suivant : "une exception non géré du type 'System.invalidCastException' s'est produite dans Microsoft.VisualBasic.dll.
    Informations supplémentaires : La conversion de la chaîne "Select id_mesure, horodate...." en type 'long' n'est pas valide.

    Merci d'avance.

    santana

  2. #2
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Salut,

    tes champs DateTime dans ta DB sont au format VARCHAR ou dans un vrai format DATETIME ?
    Dans le premier cas (c'est sale !!!) tu peux préciser un format lors de l'appel à la méthode ToString(), ex. :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
    Dans le deuxième cas (c'est déjà mieux) alors tu peux passer par une requête paramétrée, comme ça tu gères pas le format, ex. :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // cmd est une DbCommand et dtPicker un DateTimePicker
    cmd.Parameters.Add("field_name", DbType.DateTime).Value = dtPicker.Value;
    Pour le fait de sélectionner en deux fois (Date puis Time) je connais pas de super solution. A la rigueur tu peux changer le format affiché (attribut CustomFormat, même syntaxe que plus haut ; penser à mettre l'attribut Format à Custom). Au moins ça permettra à tes utilisateurs de la saisir à la main (mais y'aura pas la jolie box comme pour la partie Date).

    Pour "un seul champ SQL DateTime" j'ai pas bien saisi la problématique.

    Pour ton exception je dirais que tu t'es un peu emmelé les pinceaux dans ta concat', les guillemets sont mal placées.

    Bon dev.

    PS : utilise les balises CODE pour rendre ton code plus lisible sur le forum.
    Préfère toujours l'utilisation des requêtes paramétrées plutôt que de la concat' des anciens temps.
    Plus je connais de langages, plus j'aime le C.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2016
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Merci de me répondre avec autant d'efficacité et de rapidité.


    alors j'ai les deux si je veux mais j'ai déjà des données de test avec du datetime donc si je peux rester comme cela ça m'arrangerait.

    Bon je ne sais pas ce que c'est qu'une requête paramétrée mais je vais me renseigner comment faire.

    Nom : Capture.JPG
Affichages : 184
Taille : 18,2 Ko

    Je ne suis pas sur de comprendre pour ma recherche date/heure. Mais je pense surtout que je me suis mal exprimé.
    j'ai envoyé en pièce jointe la version graphique de ce que je souhaite faire pour mieux comprendre mon besoin.

    mon champ SQL est horodatage en format yyyy-MM-dd hh:mm:ss, les utilisateurs ont 4 champs à renseigner :
    - 1 champs date de début (datetimepicker)
    - 1 champ heure de début (textbox)
    - 1 champ date de fin (datetimepicker)
    - 1 champ heure de fin (textbox)

    ça doit donc filtré entre deux dates et heures, donc j'ai pensé concaténer les champs et ensuite faire un between quand j'appel ma requête pour avoir le résultat que je souhaite mais j'ai un problème de format comme expliqué dans mon premier message.

    OK pour les balises CODE désolé.

    Pour les requêtes paramétrés, je regarderai de plus près quand j'aurai un moment pour simplifier tout cela car je dois développer ça d'ici la fin de semaine et avec mon niveau c'est pas sur...^^

    le mieux si je résume ton conseil, se serait de changer le format idéalement par une requête paramétrée, faire ma concat ou requête paramétrée pour fusionner les champs date/heure de début et date/heure de fin, Est-ce que je dois à nouveau changer le format du résultat de la concat pour lancer ma requête avec les conditions between ?

    Pouvez-vous m'aiguiller un peu plus niveau code sans me donner le résultat complet mais je plante vraiment... depuis pas mal de jours.

    Merci beaucoup.

  4. #4
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Alors un exemple de requête paramétrée avec un BETWEEN pour coller à ton besoin :
    (j'utilise les objets spécifiques MySql mais ça reste le même principe pour d'autres SGBD, comme SqlServer par exemple)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    // la connexion
    MySqlConnection cnx = new MySqlConnection("Server=localhost;Database=testdb;Uid=root;Pwd=root;");
    // la requête avec les champs paramètres qui commencent par un @
    string rqt = "SELECT field1, field2, field3 FROM table WHERE field3 BETWEEN @dtDebut AND @dtFin";
    // on crée notre DbCommand avec la requête et la connexion déclarée plus tôt
    MySqlCommand cmd = new MySqlCommand(rqt, cnx);
    // ajout des deux paramètres de type DateTime
    cmd.Parameters.Add("@dtDebut", MySqlDbType.DateTime).Value = dtpStart.Value;
    cmd.Parameters.Add("@dtFin", MySqlDbType.DateTime).Value = dtpStop.Value;
    // on passe à l'exécution à proprement parlé
    cnx.Open();
    MySqlDataReader dr = cmd.ExecuteReader();
    // ici tu fais tes trucs avec le reader
    // ...
    // et on ferme bien tout parce que j'ai pas utilisé de using
    dr.Close();
    cnx.Close();
    Je pars du principe que l'utilisateur saisi ses dates dans deux DateTimePicker et non quatre.
    Pour cela dans le designer j'ai déclaré (avec la fenêtre des propriétés, mais in fine ça donne ce code) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dtpStart.Format = DateTimePickerFormat.Custom;
    dtpStart.CustomFormat = "yyyy-MM-dd HH:mm:ss";
    dtpStop.Format = DateTimePickerFormat.Custom;
    dtpStop.CustomFormat = "yyyy-MM-dd HH:mm:ss";
    Voilà, c'est un résumé qui n'est pas parfait mais pourrait t'aider à mieux comprendre tout ça.
    L'amélioration principale sera d'utiliser la directive using, qui gère les Close() et les Exception.
    Plus je connais de langages, plus j'aime le C.

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/11/2010, 23h09
  2. Requête de recherche multicritère avec filtre
    Par totoff80 dans le forum Bases de données
    Réponses: 22
    Dernier message: 18/04/2008, 15h03
  3. Recherche multicritère
    Par Darlay Jean_Louis dans le forum Access
    Réponses: 2
    Dernier message: 26/10/2005, 09h54
  4. Réponses: 2
    Dernier message: 01/10/2005, 18h42
  5. recherche multicritères
    Par onlineduel dans le forum Débuter
    Réponses: 3
    Dernier message: 30/03/2004, 16h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo