none
Ado: comment récupérer les données depuis une bd? RRS feed

  • Question

  • Bonjour à tous, 
    J essaie de développer une petite application d'un jeu éducatif. 
    Mon application est liée à une base de données Access. 
    Sur ma forme, je dois récupérer les questions déjà saisis dans la base de données (un après l'autre). 
    J'ai réussi à récupérer la première et la deuxième question par le moyen de ces codes: 

    Private Sub Command1_Click()
    Set DB = New ADODB.Connection
    Set RS = New ADODB.Recordset
    DB.Open "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database password=123; Data Source=" & App.Path & "\data.mdb"
    
        RS.Open "select * from table1", DB, adOpenDynamic, adLockOptimistic
     
    Label1.Caption = RS!question1
    End Sub
    et pour récupérer la deuxième question voici le code:
    Private Sub Command2_Click()
    Set DB = New ADODB.Connection
    Set RS = New ADODB.Recordset
    DB.Open "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database password=123; Data Source=" & App.Path & "\data.mdb"
    
        RS.Open "select * from table1", DB, adOpenDynamic, adLockOptimistic
     RS.MoveNext
    Label1.Caption = RS!question1
    End Sub
    Mon problème est que je ne peux pas récupérer le reste des questions. 
    Merci 
    • Déplacé Alex Petrescu mardi 14 septembre 2010 12:30 vb6 (Origine :Visual Basic)
    lundi 13 septembre 2010 17:11

Réponses

  • Hello,

     

    voici du code fonctionnel et testé. Il suffit d'un seul boutin de commande (Command1) :

     

     

    Option Explicit

     

    Dim db              As ADODB.Connection

    Dim rs              As ADODB.Recordset

     

    Const TABLE_NAME    As String = "Table1"

    Const FIELD_NAME    As String = "Question1"

     

    '

    ' Pour obtenir les questions, cliquer. Une fois la dernière atteinte, le

    ' programme le signale et retourne à la première

    '

    Private Sub Command1_Click()

     

        If db Is Nothing Then

            Set db = New ADODB.Connection

            Set rs = New ADODB.Recordset

            db.Open "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database password=; Data Source=" & App.Path & "\data.mdb"

     

            rs.Open "SELECT * FROM " & TABLE_NAME, db, adOpenDynamic, adLockOptimistic

     

            If rs.EOF And rs.BOF Then

                MsgBox "La table " & TABLE_NAME & " est vide.", vbExclamation, "Pas de données"

                rs.Close

                db.Close

                Set rs = Nothing

                Set db = Nothing

                Exit Sub

            Else

                rs.MoveFirst

            End If

        End If

     

        If rs.EOF Then

            MsgBox "Fin de la table atteinte. Retour au début.", vbInformation, "Fin des données"

            rs.MoveFirst

        End If

     

        Label1.Caption = rs.Fields(FIELD_NAME)

        rs.MoveNext

     

    End Sub

     

     

    Cordialement,

     


    Jean-marc
    • Proposé comme réponse EhJoe mercredi 15 septembre 2010 06:23
    • Marqué comme réponse Alex Petrescu mercredi 15 septembre 2010 09:26
    mardi 14 septembre 2010 21:29

Toutes les réponses

  • Bonjour,

     

    Pour parcourir le recordset entier, utilisez EOF :

     

    Do While Not RS.EOF
    RS.MoveNext
    X = RS!Question1
    …
    Loop

     

    Vous n’avez pas besoin d’ouvrir la connexion deux fois, il suffit de l’ouvrir une seule fois et de parcourir le recordset.

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur une de ces technologies : Visual Basic, C#, C++, .NET, ASP.NET, SQL Server, Silverlight, SharePoint 2010, SharePoint 2007

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, WPF

    Café des usages

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     

    mardi 14 septembre 2010 12:39
  • merci Alex

    Mais le code n'a pas bien marché avec moi.

    un message d’erreur: BOF ou EOF est égal à true ...

    En ajoutant: 'On error resume next' , il va directement au dernier enregistrement mais pas au suivant.

    cordialement

    mardi 14 septembre 2010 19:09
  • Hello,

     

    voici du code fonctionnel et testé. Il suffit d'un seul boutin de commande (Command1) :

     

     

    Option Explicit

     

    Dim db              As ADODB.Connection

    Dim rs              As ADODB.Recordset

     

    Const TABLE_NAME    As String = "Table1"

    Const FIELD_NAME    As String = "Question1"

     

    '

    ' Pour obtenir les questions, cliquer. Une fois la dernière atteinte, le

    ' programme le signale et retourne à la première

    '

    Private Sub Command1_Click()

     

        If db Is Nothing Then

            Set db = New ADODB.Connection

            Set rs = New ADODB.Recordset

            db.Open "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database password=; Data Source=" & App.Path & "\data.mdb"

     

            rs.Open "SELECT * FROM " & TABLE_NAME, db, adOpenDynamic, adLockOptimistic

     

            If rs.EOF And rs.BOF Then

                MsgBox "La table " & TABLE_NAME & " est vide.", vbExclamation, "Pas de données"

                rs.Close

                db.Close

                Set rs = Nothing

                Set db = Nothing

                Exit Sub

            Else

                rs.MoveFirst

            End If

        End If

     

        If rs.EOF Then

            MsgBox "Fin de la table atteinte. Retour au début.", vbInformation, "Fin des données"

            rs.MoveFirst

        End If

     

        Label1.Caption = rs.Fields(FIELD_NAME)

        rs.MoveNext

     

    End Sub

     

     

    Cordialement,

     


    Jean-marc
    • Proposé comme réponse EhJoe mercredi 15 septembre 2010 06:23
    • Marqué comme réponse Alex Petrescu mercredi 15 septembre 2010 09:26
    mardi 14 septembre 2010 21:29
  •  Merci beaucoup Jean-marc Noury 

    C'est vraiment fabuleux ce code!!

    Mais en fait moi j'ai besoin pour chaque question une commande.

    J'ai quand même réussi à ajouter ce code à tous les commandes  au même nombres des questions et ça marche bien . cependant je ne sais pas s'il existe un autre moyen pour faire mieux.

    merci encore Jean-marc Noury 

    mardi 14 septembre 2010 22:54
  • Hello,

     

    si tu veux un bouton de commande pour chaque question, c'est très simple:

    1) Modifie ta table (Table1) en ajoutant un Champ, que tu appeleras "Numero". Ce champ doit etre de type numérique

    2) Pour chacune des questions, attribues un numéro, en partant de 0, comme ceci:

    <tfoot></tfoot>
    Table1
    Question1 Numero
    Qui est rose avec la queue en tire-bouchon ? 0
    Qui donne du lait ? 1
    Qui mange des carottes ? 2

     

    3) Dans ton programme, tu va créer des boutons de commandes indexés, avec comme valeurs d'index: 0 (affichera la question ayant le numéro 0), 1, (affichera la question ayant le numéro 1), 2, etc.

     

    Puis le code suivant fera l'affaire (dans ce programme, les boutons indexés sont "Command2").

     

    C'est simple, court et fonctionnel (à défaut d'être un design élégant...) :

    Option Explicit
    
    Dim db           As ADODB.Connection
    Dim rs           As ADODB.Recordset
    
    Const TABLE_NAME      As String = "Table1"
    Const FIELD_QUESTION_NAME  As String = "Question1"
    Const FIELD_INDEX_NAME   As String = "Numero"
    '
     
    Private Sub Command2_Click(Index As Integer)
    
      If db Is Nothing Then
        Set db = New ADODB.Connection
        Set rs = New ADODB.Recordset
        db.Open "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database password=; Data Source=" & App.Path & "\data.mdb"
      End If
      
      rs.Open "SELECT * FROM " & TABLE_NAME & " WHERE " & FIELD_INDEX_NAME & "=" & Index, db, adOpenDynamic, adLockOptimistic
      
      If rs.EOF And rs.BOF Then
        MsgBox "Pas de question N° " & Index
      Else
        Label1.Caption = rs.Fields(FIELD_QUESTION_NAME)
        rs.Close
      End If
    
    End Sub
    

     

    Et voila :-)

     

    Cordialement,

     


    Jean-marc
    mercredi 15 septembre 2010 17:40
  • Je suis désolé Jean-marc Noury je vous ai causé beaucoup de peine! 
    Vous êtes un homme formidable!

    Merci mille fois!!

    Pour l'instant je me trouve face a un autre problème. Je me bas pour le résoudre. Je reviens si j'arrive pas à le surmonter car j'ai l'impression que vous ètes capable à tout faire.

    Cordialement.



    mercredi 15 septembre 2010 19:13
  • Bonsoir jean-marc

    excusez moi je suis revenu!

    Tout d'abord j'aimerais vous donner une idée sur ma petite application.

    Je suis enseignant et j'ai l'intention de développer un jeu éducatif pour mes élèves similaire au fameux jeux "Qui veut gagner des millions".

    Ma table db se forme donc de six champs (colonnes)

    numéro     question            reponse1         reponse 2           reponse 3         reponse  4

    0             are you busy?       yes, you are       yes, I am        yes, it is            yes, we are

    1      Do you live in New York?  no, I don't     no, I didn't      no, I am not       no, I live not

    C'est juste une idée simple sur ma table.

    Donc pour appeler ces données sur la forme je me suis servi de votre code et c'était vraiment merveilleux. Tout se passe très bien jusque là et je vous suis très reconnaissant.

    voici le code:

    Dim DB           As ADODB.Connection

    Dim RS           As ADODB.Recordset


    Const TABLE_NAME      As String = "Table1"

    Const FIELD_QUESTION_NAME  As String = "question"

    Const FIELD_INDEX_NAME   As String = "Numero"

    Private Sub Command1_Click(Index As Integer)

    PoolConnection

     If DB Is Nothing Then

        Set DB = New ADODB.Connection

        Set RS = New ADODB.Recordset

        DB.Open "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database password=; Data Source=" & App.Path & "\data.mdb"

      End If

      RS.Open "SELECT * FROM " & TABLE_NAME & " WHERE " & FIELD_INDEX_NAME & "=" & Index, DB, adOpenDynamic, adLockOptimistic

      If RS.EOF And RS.BOF Then

        MsgBox "Pas de question N° " & Index

      Else

        Label1.Caption = RS.Fields(FIELD_QUESTION_NAME)

    Option1(0).Caption = RS!reponse1

    Option1(1).Caption = RS!reponse2

    Option1(2).Caption = RS!reponse3

    Option1(3).Caption = RS!reponse4

        RS.Close

      End If

    End Sub

    Arrivant maintenant au choix de réponse:

    Là je suis perdu (completely stuck)!!!

    Prenant l’exemple de la première question:

    la deuxième réponse est présumée correcte et bien-sur elle représente le caption de option1(1) :

    Donc j'ai fais ceci:

    If Option1(1).Value = True And Option1(1).Caption = RS!reponse2 Then

    Form2.Show

    Else

    Form3.Show

    End If

    Ce code me donne toujours un faux résultat et je ne sais pas pourquoi!!

    C'est toujours form3 qui parrait!

    Cordialement.


    mercredi 15 septembre 2010 21:29
  • salut Zidane22
     
    Ton problème vient du fait que après que tu aies chargé ta question et tes réponses tu a fermé ton Rs  (rs.close).
    et donc RS!reponse2  n'existe plus et ton égalité est toujours fausse.
     
     
    il faudrait lorsque tu charge ta question il serait plus facile de mettre tes donnése dans des variables intermédiaires avant de refermer ton Rs.
     
    Dans ta requête, remplace
     
     Label1.Caption = RS.Fields(FIELD_QUESTION_NAME)

    Option1(0).Caption = RS!reponse1

    Option1(1).Caption = RS!reponse2

    Option1(2).Caption = RS!reponse3

    Option1(3).Caption = RS!reponse4

     

    par

     Question = RS.Fields(FIELD_QUESTION_NAME)

    Réponse1 = RS!reponse1

    Réponse2 = RS!reponse2

    Réponse3 = RS!reponse3

    Réponse4 = RS!reponse4

    puis

     Label1.Caption = Question

    Option1(0).Caption = Réponse1

    Option1(1).Caption = Réponse2

    Option1(2).Caption = Réponse3

    Option1(3).Caption = Réponse4

     

    Puis dans ta recherhe de la bonne réponse tu marqueras

    If Option1(1).Value = True And Option1(1).Caption = Réponse2 Then

    Form2.Show

    Else

    Form3.Show

    End If

     

    Remarque : je suppose que ce ne sera pas forcément la réponse2 qui sera toujours la bonnne ? alors il faudra affiner cela, mais le principe est là

     

    Driss

     

    <zidane22> a écrit dans le message de news: d5f83fc6-0b50-4e7e-bd94-0d3247a46309@communitybridge.codeplex.com...

    Bonsoir jean-marc

    excusez moi je suis revenu!

    Tout d'abord j'aimerais vous donner une idée sur ma petite application.

    Je suis enseignant et j'ai l'intention de développer un jeu éducatif pour mes élèves similaire au fameux jeux "Qui veut gagner des millions".

    Ma table db se forme donc de six champs (colonnes)

    numéro     question            reponse1         reponse 2           reponse 3         reponse  4

    0             are you busy?       yes, you are       yes, I am        yes, it is            yes, we are

    1      Do you live in New York?  no, I don't     no, I didn't      no, I am not       no, I live not

    C'est juste une idée simple sur ma table.

    Donc pour appeler ces données sur la forme je me suis servi de votre code et c'était vraiment merveilleux. Tout se passe très bien jusque là et je vous suis très reconnaissant.

    voici le code:

    Dim DB           As ADODB.Connection

    Dim RS           As ADODB.Recordset


    Const TABLE_NAME      As String = "Table1"

    Const FIELD_QUESTION_NAME  As String = "question"

    Const FIELD_INDEX_NAME   As String = "Numero"

    Private Sub Command1_Click(Index As Integer)

    PoolConnection

     If DB Is Nothing Then

        Set DB = New ADODB.Connection

        Set RS = New ADODB.Recordset

        DB.Open "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database password=; Data Source=" & App.Path & "\data.mdb"

      End If

      RS.Open "SELECT * FROM " & TABLE_NAME & " WHERE " & FIELD_INDEX_NAME & "=" & Index, DB, adOpenDynamic, adLockOptimistic

      If RS.EOF And RS.BOF Then

        MsgBox "Pas de question N° " & Index

      Else

        Label1.Caption = RS.Fields(FIELD_QUESTION_NAME)

    Option1(0).Caption = RS!reponse1

    Option1(1).Caption = RS!reponse2

    Option1(2).Caption = RS!reponse3

    Option1(3).Caption = RS!reponse4

        RS.Close

      End If

    End Sub

    Arrivant maintenant au choix de réponse:

    Là je suis perdu (completely stuck)!!!

    Prenant l�??exemple de la première question:

    la deuxième réponse est présumée correcte et bien-sur elle représente le caption de option1(1) :

    Donc j'ai fais ceci:

    If Option1(1).Value = True And Option1(1).Caption = RS!reponse2 Then

    Form2.Show

    Else

    Form3.Show

    End If

    Ce code me donne toujours un faux résultat et je ne sais pas pourquoi!!

    C'est toujours form3 qui parrait!

    Cordialement.



    Drissou
    jeudi 16 septembre 2010 10:12
  • Merci Driss de votre aide!

     

     j'ai essayé de mettre en place les codes que vous m'avez proposé mais malheureusement j'ai pas reussi.

    Des messages d’erreurs liés aux définitions des variables et pour être honnête j'avoue que je suis loin pour définir ces variables.

    Merci mon frère Drissou 

    jeudi 16 septembre 2010 11:59
  • Hello,

    voici en complément de la réponse de Driss.

    1) Il serait plus judicieux d'ajouter un champ à ta base de données pour stoker en plus de la question est des réponses le numéro de la bonne réponse. Ainsi, toutes tes données seraient au même endroit et non pas écrites "en dur" dans ton programme.

    Ca ressemblerait alors à ça:

    <tfoot></tfoot>
    Table1
    Numero Question Reponse1 Reponse2 Reponse3 Reponse4 BonneReponse
    0 Qui est rose avec la queue en tire-bouchon ? Le Lapin La vache Le héron Le cochon 4
    1 Qui donne du lait ? La pintade L'otarie La vache Le chien 3
    2 Qui mange des carottes ? La poule Le Lapin Le cheval Le pinson 2

     

    2) le code

    Si tu fais une table comme cela, tout devient TRES simple.

    Il te faut:

    - 3 boutons de commande indexés (Command1, de 0 à 2), que tu as déjà

    - 4 Boutons Options indexés (Option1), Que tu as déjà aussi

    - Un bouton Command2 que l'on clique pour valider la réponse

    - 2 Labels: Label1 pour afficher la question, et Label2 pour que le programme puisse indiquer "bonne" ou "mauvaise" réponse.

     

    Puis le code est tout simple (note qu'on pourrait faire beaucoup plus joli et plus efficace, mais j'ai favorisé ici la simplicité, pour l'exemple. J'ai fait ça en 10 minutes, ce n'est pas parfait mais ça marche :-) )

     

    Option Explicit

     

    Dim db                      As ADODB.Connection

    Dim rs                      As ADODB.Recordset

    Dim G_Good_Answer           As Long

     

    Const TABLE_NAME            As String = "Table1"

    Const FIELD_QUESTION_NAME   As String = "Question"

    Const FIELD_INDEX_NAME      As String = "Numero"

    Const FIELD_REPONSE1        As String = "Reponse1"

    Const FIELD_REPONSE2        As String = "Reponse2"

    Const FIELD_REPONSE3        As String = "Reponse3"

    Const FIELD_REPONSE4        As String = "Reponse4"

    Const FIELD_GOOD_ANSWER     As String = "BonneReponse"

    '

     

    Private Sub Command1_Click(Index As Integer)

     

        Label1.Caption = ""

        Label2.Caption = ""

        Option1(0).Value = True

     

        If db Is Nothing Then

            Set db = New ADODB.Connection

            Set rs = New ADODB.Recordset

            db.Open "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database password=; Data Source=" & App.Path & "\data.mdb"

        End If

            rs.Open "SELECT * FROM " & TABLE_NAME & " WHERE " & FIELD_INDEX_NAME & "=" & Index, db, adOpenDynamic, adLockOptimistic

     

        If rs.EOF And rs.BOF Then

            MsgBox "Pas de question N° " & Index

        Else

            Label1.Caption = rs.Fields(FIELD_QUESTION_NAME)

            Option1(0).Caption = rs.Fields(FIELD_REPONSE1)

            Option1(1).Caption = rs.Fields(FIELD_REPONSE2)

            Option1(2).Caption = rs.Fields(FIELD_REPONSE3)

            Option1(3).Caption = rs.Fields(FIELD_REPONSE4)

            G_Good_Answer = rs.Fields(FIELD_GOOD_ANSWER)

            rs.Close

             End If

    End Sub

     

    Private Sub Command2_Click()

    Dim ProposedAnswer  As Long

     

        ProposedAnswer = GetSelectedOption()

        If ProposedAnswer = G_Good_Answer Then

            Label2.Caption = "Bravo, Bonne réponse!"

        Else

            Label2.Caption = "Non, ce n'est pas la bonne réponse!"

        End If   

    End Sub

     

    Private Function GetSelectedOption() As Integer

    Dim i As Long

     

        For i = 0 To Option1.Count

            If Option1(i).Value = True Then

                GetSelectedOption = i + 1

                Exit Function

            End If

        Next i

        GetSelectedOption = -1

    End Function

     

    Private Sub Form_Load()

        Label1.Caption = ""

        Label2.Caption = ""

    End Sub

     

     

    Et voila :-)

    Bonne soirée!

     

    Cordialement;

     

     

     


    Jean-marc
    jeudi 16 septembre 2010 19:05
  • Bon soir Jean-marc 

    Pardonnez moi car je vous ai surement accabler !

    Mais sincèrement c’est extraordinaire ce que vous faites avec moi!!!

    Enfin tout se fonctionne à la merveille des merveilles.

     

    Excusez moi Jean-marc c'est peut être mon dernier souci!

    Est-il possible de faire saisir mes questions et réponses in  runtime? 

    C - à - d - Avoir des textboxes sur une forme qui doivent transmettre les données vers la base de données au lieu de les saisir manuellement tout en ayant la possibilité de désigner la bonne réponse .

    J’espère que mon souci soit clair et qu'il soit le dernier.

    merci encore jean-marc et bonne nuit

    cordialement. 

    • Modifié zidane22 jeudi 16 septembre 2010 21:46 ajouter des détails
    jeudi 16 septembre 2010 21:31
  • Hello,

     

    les ajouts, c'est trivial - Le code suivant est à copier dans une nouvelle forme.

    Comme il utilise les memes constantes que celles de la forme précédente, l'idéal serait de mettre ces constantes en public dans un module (.bas).

    Le code suivant est un exemple (fonctionnel), illustrant essentiellement le fonctionnement de AddNew et Update. Bref, voici :

     

    il faut, sur une nouvelle forme:

    Un textbox (Text1) : pour saiasir la question

    4 TextBox indexées, text2 de 0 à 3, pour mettre les 4 résponses,

    1 TextBox (Text3) pour saisir le numéro de la bonne réponse (entre 1 et 4).

    1 bouton de commande (Command1) pour valider et mettre dans la base.

     

    Option Explicit

     

    Const TABLE_NAME            As String = "Table1"

    Const FIELD_QUESTION_NAME   As String = "Question"

    Const FIELD_INDEX_NAME      As String = "Numero"

    Const FIELD_REPONSE1        As String = "Reponse1"

    Const FIELD_REPONSE2        As String = "Reponse2"

    Const FIELD_REPONSE3        As String = "Reponse3"

    Const FIELD_REPONSE4        As String = "Reponse4"

    Const FIELD_GOOD_ANSWER     As String = "BonneReponse"

     

    Private Sub Command1_Click()

    Dim db          As ADODB.Connection

    Dim rs          As ADODB.Recordset

    Dim GoodAnswer  As Long

     

        Set db = New ADODB.Connection

        Set rs = New ADODB.Recordset

        db.Open "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database password=; Data Source=" & App.Path & "\data.mdb"

        rs.Open TABLE_NAME, db, adOpenDynamic, adLockOptimistic

     

        rs.AddNew

            rs.Fields(FIELD_QUESTION_NAME) = Text1.Text

            rs.Fields(FIELD_REPONSE1) = Text2(0).Text

            rs.Fields(FIELD_REPONSE2) = Text2(1).Text

            rs.Fields(FIELD_REPONSE3) = Text2(2).Text

            rs.Fields(FIELD_REPONSE4) = Text2(3).Text

     

            GoodAnswer = CLng(Val(Text3.Text))

            rs.Fields(FIELD_GOOD_ANSWER) = GoodAnswer

        rs.Update

        rs.Close

        db.Close

        Set rs = Nothing

        Set db = Nothing

        MsgBox "Ajout effectué"

     

    End Sub



    Cordialement,

     


    Jean-marc
    vendredi 17 septembre 2010 15:03
  • Salut Jean marc   
     
    éternelle  question : depuis toujours je suis en DAO : est ce qut ADO est mieux, aussi rapide ?
     
     
    <Jean-marc Noury> a écrit dans le message de news: 8dfe5959-10c6-46de-a953-14c66e1139c3@communitybridge.codeplex.com...

    Hello,

     

    les ajouts, c'est trivial - Le code suivant est à copier dans une nouvelle forme.

    Comme il utilise les memes constantes que celles de la forme précédente, l'idéal serait de mettre ces constantes en public dans un module (.bas).

    Le code suivant est un exemple (fonctionnel), illustrant essentiellement le fonctionnement de AddNew et Update. Bref, voici :

     

    il faut, sur une nouvelle forme:

    Un textbox (Text1) : pour saiasir la question

    4 TextBox indexées, text2 de 0 à 3, pour mettre les 4 résponses,

    1 TextBox (Text3) pour saisir le numéro de la bonne réponse (entre 1 et 4).

    1 bouton de commande (Command1) pour valider et mettre dans la base.

     

    Option Explicit

     

    Const TABLE_NAME            As String = "Table1"

    Const FIELD_QUESTION_NAME   As String = "Question"

    Const FIELD_INDEX_NAME      As String = "Numero"

    Const FIELD_REPONSE1        As String = "Reponse1"

    Const FIELD_REPONSE2        As String = "Reponse2"

    Const FIELD_REPONSE3        As String = "Reponse3"

    Const FIELD_REPONSE4        As String = "Reponse4"

    Const FIELD_GOOD_ANSWER     As String = "BonneReponse"

     

    Private Sub Command1_Click()

    Dim db          As ADODB.Connection

    Dim rs          As ADODB.Recordset

    Dim GoodAnswer  As Long

     

        Set db = New ADODB.Connection

        Set rs = New ADODB.Recordset

        db.Open "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database password=; Data Source=" & App.Path & "\data.mdb"

        rs.Open TABLE_NAME, db, adOpenDynamic, adLockOptimistic

     

        rs.AddNew

            rs.Fields(FIELD_QUESTION_NAME) = Text1.Text

            rs.Fields(FIELD_REPONSE1) = Text2(0).Text

            rs.Fields(FIELD_REPONSE2) = Text2(1).Text

            rs.Fields(FIELD_REPONSE3) = Text2(2).Text

            rs.Fields(FIELD_REPONSE4) = Text2(3).Text

     

            GoodAnswer = CLng(Val(Text3.Text))

            rs.Fields(FIELD_GOOD_ANSWER) = GoodAnswer

        rs.Update

        rs.Close

        db.Close

        Set rs = Nothing

        Set db = Nothing

        MsgBox "Ajout effectué"

     

    End Sub



    Cordialement,

     


    Jean-marc

    Drissou
    vendredi 17 septembre 2010 15:14
  • Salut à tous
     
    DAO est obsolète mais ne fonctionne pas correctement, notamment sur la méthode .Find.
    ADO ressemble énormément à DAO, alors pas d'hésitation : passe à ADO
     
     
     
    "Drissou" a écrit dans le message de groupe de discussion : 31c5f78d-fc71-426a-89f2-7fc95324d7b8...
    Salut Jean marc   
     
    éternelle  question : depuis toujours je suis en DAO : est ce qut ADO est mieux, aussi rapide ?
     
     
    <Jean-marc Noury> a écrit dans le message de news: 8dfe5959-10c6-46de-a953-14c66e1139c3@communitybridge.codeplex.com...

    Hello,

     

    les ajouts, c'est trivial - Le code suivant est à copier dans une nouvelle forme.

    Comme il utilise les memes constantes que celles de la forme précédente, l'idéal serait de mettre ces constantes en public dans un module (.bas).

    Le code suivant est un exemple (fonctionnel), illustrant essentiellement le fonctionnement de AddNew et Update. Bref, voici :

     

    il faut, sur une nouvelle forme:

    Un textbox (Text1) : pour saiasir la question

    4 TextBox indexées, text2 de 0 à 3, pour mettre les 4 résponses,

    1 TextBox (Text3) pour saisir le numéro de la bonne réponse (entre 1 et 4).

    1 bouton de commande (Command1) pour valider et mettre dans la base.

     

    Option Explicit

     

    Const TABLE_NAME            As String = "Table1"

    Const FIELD_QUESTION_NAME   As String = "Question"

    Const FIELD_INDEX_NAME      As String = "Numero"

    Const FIELD_REPONSE1        As String = "Reponse1"

    Const FIELD_REPONSE2        As String = "Reponse2"

    Const FIELD_REPONSE3        As String = "Reponse3"

    Const FIELD_REPONSE4        As String = "Reponse4"

    Const FIELD_GOOD_ANSWER     As String = "BonneReponse"

     

    Private Sub Command1_Click()

    Dim db          As ADODB.Connection

    Dim rs          As ADODB.Recordset

    Dim GoodAnswer  As Long

     

        Set db = New ADODB.Connection

        Set rs = New ADODB.Recordset

        db.Open "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database password=; Data Source=" & App.Path & "\data.mdb"

        rs.Open TABLE_NAME, db, adOpenDynamic, adLockOptimistic

     

        rs.AddNew

            rs.Fields(FIELD_QUESTION_NAME) = Text1.Text

            rs.Fields(FIELD_REPONSE1) = Text2(0).Text

            rs.Fields(FIELD_REPONSE2) = Text2(1).Text

            rs.Fields(FIELD_REPONSE3) = Text2(2).Text

            rs.Fields(FIELD_REPONSE4) = Text2(3).Text

     

            GoodAnswer = CLng(Val(Text3.Text))

            rs.Fields(FIELD_GOOD_ANSWER) = GoodAnswer

        rs.Update

        rs.Close

        db.Close

        Set rs = Nothing

        Set db = Nothing

        MsgBox "Ajout effectué"

     

    End Sub



    Cordialement,

     


    Jean-marc

    Drissou


    __________ Information provenant d'ESET Smart Security, version de la base des signatures de virus 5458 (20100917) __________

    Le message a �t� v�rifi� par ESET Smart Security.

    http://www.eset.com

    Jacques Millet [French MVP - VB]
    vendredi 17 septembre 2010 15:42
  • Bonsoir à tous

    Mille merci jean-marc 

    Tout presque va bien et je vous suis très reconnaissant.

    sauf qu'une petite question concernant le champ numérique qui manque dans le code. Il me semble que ce champ est obligatoire.

    De toute façon ,J'ai ajouté ce morceau de code au code que vous m'avez donné après avoir ajouter un textbox4  et ça marche bien.

    rs.Fields(FIELD_INDEX_NAME) = Text4.Text

    Cependant j'aimerais savoir s'il est possible de faire ajouter les numéros automatiquement.

    C-à-d Dés qu'on ajoute une question, le numéro correspondant s'affiche automatiquement dans la base de donnée.

    Pardonnez moi encore une fois jean-marc je commence à sentir un peu ambitieux. Donc je voulais ajouter à mon jeu un lifeline 50/50 et j'ai fait ce code mais je ne sais pas pourquoi il ne marche pas comme il le faut. C'est toujours les mêmes options (1 et 3) qui sont invisibles.

    Private Sub lifeline_Click()

    If db Is Nothing Then

            Set db = New ADODB.Connection

            Set rs = New ADODB.Recordset

            db.Open "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database password=; Data Source=" & App.Path & "\data.mdb"

        End If

            rs.Open "SELECT * FROM " & TABLE_NAME & " WHERE " & FIELD_GOOD_ANSWER, db, adOpenDynamic, adLockOptimistic

    If rs!bonneReponse = "1" Then

    Option1(1).Visible = False

    Option1(3).Visible = False

    End If

    If rs!bonneReponse = "2" Then

    Option1(0).Visible = False

    Option1(2).Visible = False

    End If

    If rs!bonneReponse = "3" Then

    Option1(1).Visible = False

    Option1(3).Visible = False

    End If

     If rs!bonneReponse = "4" Then

    Option1(0).Visible = False

    Option1(1).Visible = False

    End If

    rs.Close

    End Sub

    merci et bonne nuit

     

     

    vendredi 17 septembre 2010 17:51
  • Hello Driss,

    J'ai un avis partagé sur la question.

    C'est vrai que DAO n'est "plus supporté"/"obsolète". Ok. Mais à ce compte là, Visual Basic 6 n'est pas "supporté" non plus, et est aussi obsolète, alors ...

    Après, les différences ADO/DAO: il y en a, c'est vrai, c'est un fait. Si aujourd'hui je devais démarrer une application "pro" en VB6 (ce qui ne serait pas une bonne idée de toute façon, vu que rien ne me dit que les exe VB6 tourneront encore sur les futures versions de Windows), et bien j'utiliserais sans doute ADO.

    Maintenant en pratique: je programme toujours en VB6, autant pour m'amuser que pour le boulot: dans les 2 cas, quand j'ai besoin d'une database, je le fais avec DAO, tout simplement par ce que j'ai l'habitude, et que mes doigts écrivent quasiment tout seuls : "Dim db As Database Dim rs as Recordset Set db = opendatabase(...) set rs = db.openRecordSet("SELECT * FROM TOTO") ...

    Alors DAO vs ADO ? Pour moi, c'est du pareil au même [en général]. Si tu as l'habitude de DAO et que tu en es content, et bien sauf cas très particulier, je ne changerais pas. Note que ceci est surtout vrai si tu utilises Access comme DB derrière ton appli. Si tu veux être plus ouvert, genre connection ODBC via un DSN vers Oracle, DB2, SQL Server etc., ADO devient intéressant, notamment pour des cas un peu pointus de gestion d'accès concurrents à la base en cas d'usage multi-utilisateur; Bof, la on est déjà dans des projets un peu "sérieux" et au jour d'aujourd'hui VB n'est de toute façon plus le langage de choix, alors ...

    Bonne soirée !

     

    Cordialement,

     

     


    Jean-marc
    vendredi 17 septembre 2010 18:02
  • Hello,

     

    en effet il manquait la mise à jour du numéro. Le code que tu as ajouté est okay.

    Quand au code que tu as ajouté et qui ne marche pas, le problème est la:

     rs.Open "SELECT * FROM " & TABLE_NAME & " WHERE " & FIELD_GOOD_ANSWER, db, adOpenDynamic, adLockOptimistic

    Tu ass écrit une clause WHERE incomplète. Telle qu'écrit ici, la requete retourne toujours la première question de la table...

    Tu dois écrire un truc du genre:

     rs.Open "SELECT * FROM " & TABLE_NAME & " WHERE "  & FIELD_INDEX_NAME & "=" & G_Index, db, adOpenDynamic, adLockOptimistic

    Le G_index doit être une copie de la variable locale Index de Command1_click. Comme ça, tu fais pointer ton recordset sur la question en cours. Et tout le reste de ton code va marcher ...

     

    Cordialement,



    Jean-marc
    vendredi 17 septembre 2010 18:22
  • merci encore jean-marc.

    Malheureusement pour la première fois un de vos code n'a pas bien fonctionner avec moi.

    'Syntax error'

    Alors j'ai introduit quelque petites rectifications, j'ai pu éviter le message d'érreur mais le résultat est le même. Les mêmes options qui sont toujours invisibles.

    Quant au question du champ numérique, est ce que je peut comprendre que que c'est pas possible de génere le numéros automatiquement sans avoir besoin de les saisir dans un textbox.

    merci  jean-marc

    cordialement 

    vendredi 17 septembre 2010 19:04
  • hello,

     

    il est possible de générer automatiquement un numéro. Il suffit dasn Access lors de la cration de la base de choisir pour le champ Numero le type "Numéro Auto". Il génèrera un numéro unique, en séquence. Mais alors il va falloir revoir pas mal de code, car ton design utilise un bouton de commande indexée dont l'index donne le numéro de la question. Avec les numéros autos, ce n'est plus possible de faire comme cela.

    Il faut revenir à un design plus sain, consistant en gros à énumérer les questions dans la base en faisant un SELECT avec un ORDER BY sur le champ Numéro. Mais ca devient un peu plus subtil donc de coder proprement le command1_Click;

    Je me permet de te conseiller un peu de lecture concernent SQL : http://msdn.microsoft.com/en-us/library/Aa140011. Tu y trouveras une foule de choses utiles. Il est toujours utile de bien maitriser les outils que l'on emploie.

     

    Bonne lecture,

     

    Cordialememt,

     


    Jean-marc
    vendredi 17 septembre 2010 19:47
  • Hello jean-marc

    merci pour la réponse et pour le lien je vais essayer de lire et  comprendre le SQL car il me semble très intéressant.

    Concernant ce dernier code qui me donne ce message d'érreur:

    syntax error (opérateur absent) dans l'expression "numero ="

    Y'a t'il un moyen de s'en sortir?

     rs.Open "SELECT * FROM " & TABLE_NAME & " WHERE "  & FIELD_INDEX_NAME & "=" & G_Index, db, adOpenDynamic, adLockOptimistic

    Et merci mille fois quelque soit la réponse!

    Bonne nuit

     

     

    vendredi 17 septembre 2010 20:36
  • Enfin après plusieurs essais j'ai pu trouver l'astuce et voici le code, qui fonctionne parfaitement:

     rs.Open "SELECT * FROM " & TABLE_NAME, db, adOpenDynamic, adLockOptimistic

     If G_Good_Answer = "4" Then

     Option1(0).Visible = False

      Option1(2).Visible = False

     End If

     If G_Good_Answer = "2" Then

     Option1(0).Visible = False

      Option1(2).Visible = False

     End If

     If G_Good_Answer = "3" Then

      Option1(0).Visible = False

     Option1(3).Visible = False

     End If

     If G_Good_Answer = "1" Then

     Option1(3).Visible = False

      Option1(1).Visible = False

     End If

     rs.Close

    Comme je suis fier de moi!!!!!!!!!!!!!

    Merci jean-marc de votre aide très précieuse.

    Cordialement 

    vendredi 17 septembre 2010 23:32
  • Salut jean Marc

     

    Oui j'utilise "beaucoup" DAO avec essentiellement des requêtes enregistrées directement dans la base, avec paramètres si besoin

     

    par contre j'ai quelques problèmes effectivement avec des accès multiples et des erreurs d'enregistrement notamment si enregistrement simultanés, même attribution de numéro lors de numérotation auto.

    Si ADO est plus "sécurisé" de ce coté là notamment, je vais regarder.

     


    Drissou
    lundi 20 septembre 2010 09:56
  • Hello Driss,

    Je ne sais pas si on peut dire qu'ADO est plus "sécurisé"; On peut presque tout faire avec DAO, même si parfois c'est moins simple.

    Pour tes problèmes d'accès concurrents, il existe des façons assez propres de s'en sortir avec DAO, en utilisant à bon escient le locking sur les tables et les transactions, le tout couplé avec une bonne gestion d'erreur. [difficile de s'étendre plus sur le sujet, en tout cas pas ici.] Note qu'ADO ne gérera  pas non plus ces problèmes par magie: il faudra en gros faire la même chose [je veux dire le même principe]. Mais la gestion des locks est à mon avis un peu plus simple ou transparente avec ADO. Si ce n'est déjà fait, je te conseille de googler un peu avec "Jet pessimistic locking". Tu devrais trouver des choses intéressantes :-)

    Cordialement,


    Jean-marc
    mardi 21 septembre 2010 18:31
  • Bonjour jean Marc,
     
    effectivement je n'ai pas vraiment creusé l'affaire.
    Et c'est effectivemnt l'objet d'un autre post
     
    merci
     
    Driss
    <Jean-marc Noury> a écrit dans le message de news: b82d1dfa-fc30-4c88-97b3-4bc7b3d59ae3@communitybridge.codeplex.com...

    Hello Driss,

    Je ne sais pas si on peut dire qu'ADO est plus "sécurisé"; On peut presque tout faire avec DAO, même si parfois c'est moins simple.

    Pour tes problèmes d'accès concurrents, il existe des façons assez propres de s'en sortir avec DAO, en utilisant à bon escient le locking sur les tables et les transactions, le tout couplé avec une bonne gestion d'erreur. [difficile de s'étendre plus sur le sujet, en tout cas pas ici.] Note qu'ADO ne gérera  pas non plus ces problèmes par magie: il faudra en gros faire la même chose [je veux dire le même principe]. Mais la gestion des locks est à mon avis un peu plus simple ou transparente avec ADO. Si ce n'est déjà fait, je te conseille de googler un peu avec "Jet pessimistic locking". Tu devrais trouver des choses intéressantes :-)

    Cordialement,


    Jean-marc

    Drissou
    mercredi 22 septembre 2010 08:17