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

VB 6 et antérieur Discussion :

[VB6] Création de formulaire dynamique de recherche


Sujet :

VB 6 et antérieur

  1. #1
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mai 2007
    Messages : 21
    Par défaut [VB6] Création de formulaire dynamique de recherche
    Bonjour,

    Je souhaiterai créer un formulaire dynamique de recherche, c'est à dire, un formulaire composé de Textbox et d'une Datagrid se mettant à jour à chaque changement d'une Textbox.

    Voici mon code :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    Private Sub txtNomEE_Change()
        Rafraichir_Grille
    End Sub
     
    Private Sub txtNomEU_Change()
        Rafraichir_Grille
    End Sub
     
    Private Sub txtNPdP_Change()
        Rafraichir_Grille
    End Sub
     
    Private Sub Rafraichir_Grille()
        Dim cn As ADODB.Connection
        Dim cmd As ADODB.Command
        Dim req As String
     
        'Initialisation de la connection
        Set cn = New Connection
        cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                "Data Source=" & SRC & ";" & _
                "User Id=Admin; Password="
     
        'Création de la requète
        req = "SELECT [Plan de Prévention].[Numéro de PDP], " & _
                          "[Plan de Prévention].[Nom de l'entreprise extérieur], " & _
                          "[Plan de Prévention].[Nature des travaux], " & _
                          "[Plan de Prévention].[Date d'émission], " & _
                          "[Plan de Prévention].[Date de validité], " & _
                          "[Plan de Prévention].[Nom de l'entreprise utilisatrice], " & _
                          "[Autorisation de travail].[Numéro d'autorisation de travail], " & _
                          "Responsable.[Nom du Responsable], " & _
                          "Responsable.[Prenom du Responsable] " & _
                          "FROM Responsable INNER JOIN ([Plan de Prévention] " & _
                          "INNER JOIN [Autorisation de travail] ON " & _
                          "[Plan de Prévention].[Numéro de PDP] = [Autorisation de travail].[Numéro de PDP]) ON " & _
                          "Responsable.[ID du Responsable] = [Plan de Prévention].[ID du Responsable] " & _
                          "WHERE [Plan de Prévention].[Numéro de PDP] <> '0' "
     
        'Si Numéro de PDP n'est pas vide, on ajoute la contraite à la recherche
        If (txtNPdP <> "") Then
            req = req & "AND [Plan de Prévention].[Numéro de PDP] LIKE '" & txtNPdP & "%' "
        End If
     
        'Si le nom de l'EE n'est pas vide,      "       "
        If (txtNomEE <> "") Then
            req = req & "AND [Plan de Prévention].[Nom de l'entreprise extérieur] LIKE '%" & txtNomEE & "%' "
        End If
     
        'Si le nom de l'EU n'est pas vide,     "       "
        If (txtNomEU <> "") Then
            req = req & "AND [Plan de Prévention].[Nom de l'entreprise utilisatrice] LIKE '%" & txtNomEU & "%' "
        End If
     
        'Ajout du point virgule à la reqète finale
        req = req & ";"
     
        'Création de la Command
        Set cmd = New Command
        Set cmd.ActiveConnection = cn
        cmd.CommandText = req
     
        'Exécution de la requète
        Dim rs As Recordset
        Set rs = cmd.Execute
     
        'Do While Not rs.EOF
        '    MsgBox rs![Numéro de PDP]
        '    rs.MoveNext
        'Loop
     
        Set grdPdP.DataSource = rs
        grdPdP.Refresh
     
    End Sub
    Malheureusement, cela ne fonctionne pas.

    En effet, bien que la requète retourne le bon résultat (tester grâce à la boucle While en commentaire), il ne s'affiche pas dans le DataGrid qui se vide entièrement.

    J'ai consulter de nombreux tutoriaux sur le sujet, sans jamais réussir à voir ce qui clocher.

    Merci d'avance.

  2. #2
    Membre chevronné Avatar de La Praline
    Inscrit en
    Mars 2007
    Messages
    592
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2007
    Messages : 592
    Par défaut
    AS-tu vu que dans les tutoriel(sur ce site donc), un est consacré à la recherche telle que tu veux la faire ?

    Par contre je ne me rappelle plus si c'est avec des requêtes SQL...

    Mais je te conseil d'aller y jeter un oeil(c'est le tutoriel ADO de Jacques Malatier)

    Cordialement

  3. #3
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mai 2007
    Messages : 21
    Par défaut
    J'avais déjà lu les tutoriaux de Jacques Malatier, je l'ai relu de nouveau, au cas où j'aurais loupé quelque chose, mais malheureusement il ne répond pas réelement à mes attentes.

    En effet, dans le tutoriel, on navigue dans les enregistrements, les Textbox se remplissant automatiquement ainsi que le DataGrid grâce à un recordset fille.

    Moi, mon DataGrid est déjà remplit avec tous mes enregistrements et il faut que je réduise le nombre d'enregistrement en fonction de ce qui est rentrer dans les Textbox.

    Malheureusement, lorsque je change les Textbox, le DataGrid se vide entièrement au lieu de filtrer le contenu.

  4. #4
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mai 2007
    Messages : 21
    Par défaut
    Bonjour, mon problème a légèrement évolué.
    Les besoins ayant changés, j'ai remplacé la DataGrid par une MSHFlexGrid avec le code suivant :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    Private Sub txtNomEE_Change()
        Rafraichir_Grille
    End Sub
     
    Private Sub txtNomEU_Change()
        Rafraichir_Grille
    End Sub
     
    Private Sub txtNPdP_Change()
        Rafraichir_Grille
    End Sub
     
    Private Sub Rafraichir_Grille()
        Dim cn As ADODB.Connection
        Dim rs As ADODB.Recordset
        Dim req As String
        Dim filtre As String
     
        'Initialisation de la connection
        Set cn = New ADODB.Connection
        cn.Provider = "MSDataShape"
        cn.Open "Data Provider=Microsoft.Jet.OLEDB.4.0;" & _
                "Data Source=" & SRC & ";" & _
                "User Id=Admin; Password="
     
        'Création de la requète
        req = "SHAPE {SELECT * FROM `Plan de Prévention`} AS PdP " & _
              "APPEND ({SELECT * FROM `Responsable`}  AS Resp " & _
              "RELATE 'ID du Responsable' TO 'ID du Responsable') " & _
              "AS Resp,({SELECT * FROM `Autorisation de travail`}  " & _
              "AS AT RELATE 'Numéro de PDP' TO 'Numéro de PDP') AS AT"
     
        'Exécution de la requète
        Set rs = New ADODB.Recordset
        rs.Open req, cn, adOpenDynamic, adLockOptimistic, adCmdText
     
        filtre = "[Plan de Prévention].[Numéro de PDP] <> '' "
        'Si Numéro de PDP n'est pas vide, on ajoute la contraite à la recherche
        If (txtNPdP <> "") Then
            filtre = filtre & "AND [Plan de Prévention].[Numéro de PDP] LIKE '" & txtNPdP & "%' "
        End If
     
        'Si le nom de l'EE n'est pas vide,      "       "
        If (txtNomEE <> "") Then
           filtre = filtre & "AND [Plan de Prévention].[Nom de l'entreprise extérieur] LIKE '%" & txtNomEE & "%' "
        End If
     
        'Si le nom de l'EU n'est pas vide,      "       "
        If (txtNomEU <> "") Then
           filtre = filtre & "AND [Plan de Prévention].[Nom de l'entreprise utilisatrice] LIKE '%" & txtNomEU & "%'"
        End If
     
        rs.Filter = filtre
     
        'Do While Not rs.EOF
        '    MsgBox (rs![Numéro de PDP])
        '    rs.MoveNext
        'Loop
     
        Set grdPdP.DataSource = rs
        grdPdP.Refresh
     
    End Sub
    Mais lorsque j'écris dans les Textbox, le programme me déclenche l'erreur :
    Erreur d'éxécution '3001' :

    Les arguments sont de type incorect, en dehors des limites autorisées ou en conflit les uns avec les autres.
    et pointe sur la ligne : rs.Filter = filtre

    Je vais essayer de trouver des informations sur cette erreur...

  5. #5
    Membre chevronné Avatar de La Praline
    Inscrit en
    Mars 2007
    Messages
    592
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2007
    Messages : 592
    Par défaut
    Bonjour,

    Je ne suis pas sûr qu'une requête SQL soit interpretable par un recordset...

  6. #6
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mai 2007
    Messages : 21
    Par défaut
    Si je met en commentaire la ligne de l'erreur et que j'active la boucle While, il me retourne bien tous les enregistrements, ce qui tend à prouver que la requète est bien interprété. En revanche, il me lance une autre erreur:

    Erreur d'éxécution '30022'

    Le contrôle Hierachical FlexGrid ne prend pas en compte le type de données demandé.
    Et pointe sur : Set grdPdP.DataSource = rs

    Ce qui est bizarre, c'est que la requète SQL est exactement la même que celle de la commande du DataEnvironment et donc je suis (quasiment) sur qu'elle est correcte.

  7. #7
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mai 2007
    Messages : 21
    Par défaut
    C'est bon j'ai résolu mon problème.
    Apparemment, on ne peut pas affecter comme DataSource un recordset si la Datasource est déjà défini par les propriétés.

    De plus, je n'utilise plus Filter qui ne semble pas fonctionner avec les requètes hierarchiques, mais j'utilise directement les closes WHERE dans la première requète de la hierarchie.

    Pour ceux que ca interresserait, le code donne :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    Private Sub Rafraichir_Grille()
        Dim autre_cn As ADODB.Connection
        Dim rs As ADODB.Recordset
        Dim req As String
        Dim filtre As String
     
        'Initialisation d'une nouvelle connection
        'On n'utilise pas ici la connection cn, car on a besoin d'un autre Provider
        Set autre_cn = New ADODB.Connection
        autre_cn.Provider = "MSDataShape"
        autre_cn.Open "Data Provider=Microsoft.Jet.OLEDB.4.0;" & _
                "Data Source=" & SRC & ";" & _
                "User Id=Admin; Password="
     
        'Création de la requète
        req = "SHAPE {SELECT * FROM [Plan de Prévention] WHERE [Plan de Prévention].[Numéro de PDP] <> '0' "
     
     
     
        'Si Numéro de PDP n'est pas vide, on ajoute la contraite à la recherche
        If (txtNPdP <> "") Then
            req = req & "AND [Plan de Prévention].[Numéro de PDP] LIKE '" & txtNPdP & "%' "
        End If
     
        'Si le nom de l'EE n'est pas vide,      "       "
        If (txtNomEE <> "") Then
           req = req & "AND [Plan de Prévention].[Nom de l'entreprise extérieur] LIKE '%" & txtNomEE & "%' "
        End If
     
        'Si le nom de l'EU n'est pas vide,      "       "
        If (txtNomEU <> "") Then
           req = req & "AND [Plan de Prévention].[Nom de l'entreprise utilisatrice] LIKE '%" & txtNomEU & "%'"
        End If
     
        req = req & "} APPEND " & _
              "({SELECT * FROM [Responsable]} RELATE [ID du Responsable] TO [ID du Responsable]), " & _
              "({SELECT * FROM [Autorisation de travail]} RELATE [Numéro de PDP] TO [Numéro de PDP])"
     
        'Exécution de la requète
        Set rs = New ADODB.Recordset
        rs.Open req, autre_cn, adOpenDynamic, adLockOptimistic, adCmdText
     
        Set grdPdP.DataSource = rs
        grdPdP.CollapseAll (0)
     
    End Sub
    Merci à tous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. CRÉATION DE FORMULAIRE DYNAMIQUE
    Par blueette dans le forum Modélisation
    Réponses: 0
    Dernier message: 26/04/2013, 13h49
  2. [AC-2003] Création de formulaire dynamique
    Par newtownz dans le forum VBA Access
    Réponses: 8
    Dernier message: 17/08/2009, 15h47
  3. [JSF] Création de formulaire dynamique, Pb UIViewRoot
    Par JCitrouille dans le forum JSF
    Réponses: 9
    Dernier message: 02/01/2009, 17h52
  4. [2.0] Création de formulaires dynamiques
    Par mister3957 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 13/08/2007, 16h22
  5. Création de formulaires dynamique?
    Par akademiks dans le forum JSF
    Réponses: 4
    Dernier message: 27/04/2007, 10h18

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