Comment se déplacer entre tables?

cs_zidane22 Messages postés 67 Date d'inscription jeudi 1 juillet 2010 Statut Membre Dernière intervention 13 octobre 2010 - 21 sept. 2010 à 23:33
cs_zidane22 Messages postés 67 Date d'inscription jeudi 1 juillet 2010 Statut Membre Dernière intervention 13 octobre 2010 - 23 sept. 2010 à 08:09
Bonjour

Je cherche un code qui me permet de déplacer à une nouvelle table une fois la table actuelle atteint un certain nombre d'enregistrements.

Je pouvais me déplacer de la table1 au table2 en se servant du code ci-dessous mais moi j'ai besoin d'au mois cinq tables:

Private Sub CmdSave_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_NAME1, db, adOpenStatic, adLockOptimistic
        If rs.RecordCount = 15 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 TABLE_NAME2, db, adOpenDynamic, adLockOptimistic
    
    rs.AddNew
rs.Fields(FIELD_INDEX_NAME) = Text4.Text - 1
        rs.Fields(FIELD_QUESTION_NAME) = Text1.Text
        rs.Fields(FIELD_Gamename) = Text5.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
        
        Else
        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_NAME1, db, adOpenDynamic, adLockOptimistic
    
    rs.AddNew
rs.Fields(FIELD_INDEX_NAME) = Text4.Text - 1
        rs.Fields(FIELD_QUESTION_NAME) = Text1.Text
        rs.Fields(FIELD_Gamename) = Text5.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
        End If
        
    rs.Update
    rs.Close

db.close

End Sub

Que dois je faire pour pouvoir dépacer aux nouvelles tables (table 3 ,table 4 , table5) si les tables précédentes ont atteint un nombre de recordcount = 15?

10 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
22 sept. 2010 à 08:55
Salut

Dans la série "dis moi ce qu'il te manque, je te dirai comment t'en passer", je me demande pourquoi tu veux dispatcher des données, à priori de même structure, dans des tables différentes ?

Les tables peuvent accueillir un grand nombre d'enregistrements, donc ce n'est pas la taille qui te gène. Donc j'imagine que c'est le type des données ou simplement des groupes de 15 items ?

Pourquoi dans ce cas ne pas laisser une seule et unique table et y ajouter un nouveau champ permettant de dissocier les enregistrements par groupe ?
Par exemple, un nouveau champ "GroupeNo" dans lequel tu mettrais un chiffre de 1 à x.

Si, malgré tout, tu veux garder cette technique de tables multiples (ce qui complique tout), je vois que les accès et les données que tu y mets sont les mêmes; seul le nom de la table change.
Donc, première idée, écarter les lignes de code dans une Sub qui s'occuperait de cette partie, simplement en fournissant un paramètre représentant le nom de la table sur laquelle travailler.
Une Sub peut très bien s'appeler elle-même, récursivement, exemple :

Call maSub(1)

Private maSub(IndexTable)
    Dim TableName As String
    TableName = "TABLE_" & CStr(IndexTable)
    rs.Open TableName, db, adOpenDynamic, adLockOptimistic
    If rs.RecordCount = 15 Then
        ' Il faut passer à l'index de table suivant
        rs.Close
        Call maSub(IndexTable + 1)
    Else
        ' Ici, le code des AddNew
    End Sub
End Sub

Pour cela, il faut que les tables aient un nom avec index intégré, comme "TABLE_1", facile à générer, et tu incrémenterais le chiffre au fur et à mesure de tes tests "15 enregistrements".

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_zidane22 Messages postés 67 Date d'inscription jeudi 1 juillet 2010 Statut Membre Dernière intervention 13 octobre 2010
22 sept. 2010 à 17:10
Merci jack de votre réponse.
Vous demandiez pourqui je devais créer 5 tables malgré les données sont du mème type, donc permettez vous donner une idée sur ma petite application:
Mon application est sous forme d'un jeux éducatif pour mes éléves du CEM. Il ressemble au fameux jeu du TF1 "Qui veux gagner des millios".
Mon application 'en état actuelle' me permet d'entrer q'un seul jeu alors que moi j'aimerais bien pouvoir entrer plus q'un jeu (5 jeux au minimum).
Donc j'ai pensé à passer à un nouveau tableau à chaque fois que je voudrai entrer un nouveau jeu.
Mais s'il éxiste un autre moyen qui me permet de faire entrer 15 questions avec 15 choix de réponses sans que les données du premier jeux soient éffacées donc je vous serais trés reconnaissant si vous m'aidiez à y parvenir.
Merci encore jack
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
22 sept. 2010 à 17:33
Il suffirait d'ajouter un champ identifiant la session de jeu, par exemple la date et l'heure, que tu génèrerais en début de jeu uniquement et dont tu te servirais à chaque fois que tu ajoutes une donnée.
0
cs_zidane22 Messages postés 67 Date d'inscription jeudi 1 juillet 2010 Statut Membre Dernière intervention 13 octobre 2010
22 sept. 2010 à 18:07
Il suffirait d'ajouter un champ identifiant la session de jeu, par exemple la date et l'heure, que tu génèrerais en début de jeu uniquement et dont tu te servirais à chaque fois que tu ajoutes une donnée.

Merci jack maismalheureusement C'était pas facile pour moi de comprendre que que vous venez de me proposer ici.
Pour le code de la sub ci dessus: J'ai éssayer de le mettre en place mais je remarquais deux chose:
Lorsque j'ai inséré la Sub au milieu d'autres codes, normalement elle doit ètre indépendente (entre deux lignes horizontales) alors que ce n'est pas le cas avec cette sub.
Donc j'ai pensé à insérer la sub dans "Général', le résultat est un message d'érreur:Invalid outside procedure
Table_ sellectionné pourtant j'ai renommé mes tables: Table_1 , Table_2 , ....
Cordialement
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
22 sept. 2010 à 19:13
Si le message dit "Table_" sans chiffre derrière, c'est que tu as lancé maSub sans fournir le chiffre 1 initial.
C'était la première ligne, devant la Sub.
Call maSub(1)
Ligne qu'il faut mettre au bon endroit quand tu veux gérer le AddNew en tenant compte des 15 items par table.

Chose non dite : Dans cette Sub, il faudra déclarer les objets dont tu te sers : db, rs
comme tu l'as fait dans ton code initial
0
cs_zidane22 Messages postés 67 Date d'inscription jeudi 1 juillet 2010 Statut Membre Dernière intervention 13 octobre 2010
22 sept. 2010 à 20:35
Excusez moi jack si je vous ai accablé par mes question qui ne se terminent pas.
Tout d'abord j'aimerais savoir pourquoi la Sub ne veut pas se mettre entre deux lignes horizontales comme le reste des Subs? Elle ne veut pas se tenir comme Sub indépendente.
Cordialement
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
22 sept. 2010 à 23:24
Pas normal, en effet.
Dans quoi l'as-tu mise ? Forme, Module, Classe ?
Je répète : la ligne du Call n'est pas à mettre devant la Sub, c'est seulement la ligne de commande que tu pourras utiliser dans une de tes Sub. C'est une instruction.

Ah, toutes mes excuses, c'est ma faute :
Dans la déclaration, il manque le mot clé Sub :
Private Sub maSub(IndexTable)
Ça arrive quand on écrit de mémoire sans tester.
Désolé.
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
22 sept. 2010 à 23:24
Pouah, la couleur jaune
Là, c'est la fatique
Private Sub maSub(IndexTable)
0
cs_zidane22 Messages postés 67 Date d'inscription jeudi 1 juillet 2010 Statut Membre Dernière intervention 13 octobre 2010
22 sept. 2010 à 23:32
Bonsoir jack
Pourquoi dans ce cas ne pas laisser une seule et unique table et y ajouter un nouveau champ permettant de dissocier les enregistrements par groupe ?
Par exemple, un nouveau champ "GroupeNo" dans lequel tu mettrais un chiffre de 1 à x.

J'ai beaucoup apprécié cette idée de garder une seule table et de pouvoir dissocier les enregistrements par groupe?
Voulez vous m'aider à comprendre cette idée?
merci
0
cs_zidane22 Messages postés 67 Date d'inscription jeudi 1 juillet 2010 Statut Membre Dernière intervention 13 octobre 2010
23 sept. 2010 à 08:09
Désolé jack hier j'ai écris mon dernier message au même moment que le votre , donc j'ai pas vu les correctifs que vous avez apportés.
Bref
Voici tout le code:

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 maSub(IndexTable)
Dim db          As ADODB.Connection
Dim rs          As ADODB.Recordset
Dim GoodAnswer  As Long
    Dim TableName As String
        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"
    TableName = "TABLE_" & CStr(IndexTable)
    rs.Open TableName, db, adOpenDynamic, adLockOptimistic
    If rs.RecordCount = 15 Then
        ' Il faut passer à l'index de table suivant
        rs.Close
        Call maSub(IndexTable + 1)
    Else
        ' Ici, le code des AddNew
        rs.AddNew
rs.Fields(FIELD_INDEX_NAME) = Text4.Text - 1
        rs.Fields(FIELD_QUESTION_NAME) = Text1.Text
        rs.Fields(FIELD_Gamename) = Text5.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
        End If
    End Sub

et j'ai fait appelle au sub dans
cmd_save
Private Sub Cmd_save_Click()
Call maSub(1)
End Sub

Aprés l'exécution du programme, je n'ai aucun message d'érreur mais les champs dans les tables restent vides.
Je ne sais pas ce qu'il ne va pas.
Cordialement
0
Rejoignez-nous