Enregistrement Access

Dounej Messages postés 28 Date d'inscription jeudi 28 décembre 2006 Statut Membre Dernière intervention 7 avril 2007 - 3 avril 2007 à 11:13
cs_Nicko11 Messages postés 1141 Date d'inscription mercredi 7 mars 2007 Statut Membre Dernière intervention 19 septembre 2007 - 4 avril 2007 à 11:51
Bonjour,
j'ai une procedure d'enregistement de données dans une table Access qui fonctionne correctement sauf dans un cas précis :
- 1er session d'enregistrement : impécable
- 2 ème session d'enregistrement :  ignore les premiers enregistrements et commence l'enregistrement à la ligne 1 comme s'il  n'y avait aucun enregistrement, mais n'efface pas les enregistrements précédents qui sont
décalés.
- sessions suivantes : l'enregistrement se fait par rapport au dernier enregistrement correctement en ignorant la premiere session.
(session signifie, arreter le programme et le relancer à une date ultérieure)

qui peut me dire où ça "cloche" ?

Voici mon code :



'----------------------------------------------------------------
Dim db As DAO.Database
Dim td As DAO.TableDef
Dim fd As DAO.Field
Dim rs As DAO.Recordset
'----------------------------------------------------------------
Set db = OpenDatabase("chemin de mon fichier" )
Set rs = db.OpenRecordset("MaTable", dbOpenTable)
'------------------------------ Enregistrement des  données ----------------
    rs.MoveLast
    rs.AddNew
    '--------------------------------------------
    For i = 1 To 150
        rs.Fields("P" & i).Value = "mes données"
    Next i
    '--------------------------------------------
    rs.Update
    '--------------------------------------------
    rs.Close
    Set rs = Nothing
    '---------------
    db.Close
    Set db = Nothing
    '--------------------------------------------

Avec mes remerciements
Marc

15 réponses

cs_Exploreur Messages postés 4821 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 15 novembre 2016 15
3 avril 2007 à 11:21
Salut,

Ce que je ne comprend pas ,c'est pourquoi tu fais un rs.MoveLast ? Pourquoi allez sur le dernier enregsitrement ?
Ton rs.Update devrait être à mon sens dans ta boucle For (je pense) 

A+
Exploreur

 
0
cs_Exploreur Messages postés 4821 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 15 novembre 2016 15
3 avril 2007 à 11:24
Salut,

Même ta boucle est mal placée, il faut qu'elle soit avant le Rs.AddNew

A+
Exploreur

 
0
cs_Nicko11 Messages postés 1141 Date d'inscription mercredi 7 mars 2007 Statut Membre Dernière intervention 19 septembre 2007 3
3 avril 2007 à 11:25
Je sais pas si ca peut aider mais j'ai vu ca sur l'aide de la méthode update:

Attention Les modifications apportées à l'enregistrement actuel sont perdues si :

<li>vous utilisez la méthode Edit ou AddNew, puis passez à un autre enregistrement sans utiliser préalablement Update ;

</li><li>vous utilisez Edit ou AddNew une première fois, puis utilisez Edit ou AddNew une deuxième fois sans utiliser préalablement Update.

</li><li>vous définissez un autre enregistrement pour la propriété [mk:@MSITStore:C:\Program%20Files\Fichiers%20communs\Microsoft%20Shared\OFFICE11\1036\dao360.chm::/daprobookmark.htm Bookmark] ;

</li><li>vous fermez le jeu d'enregistrements désigné par recordset sans utiliser préalablement Update ;

</li><li>vous annulez l'opération Edit en utilisant la méthode [mk:@MSITStore:C:\Program%20Files\Fichiers%20communs\Microsoft%20Shared\OFFICE11\1036\dao360.chm::/damthcancelupdate.htm CancelUpdate]. </li>Pour modifier un enregistrement, utilisez la méthode Edit afin de copier le contenu
0
cs_Exploreur Messages postés 4821 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 15 novembre 2016 15
3 avril 2007 à 11:28
Salut,

Moi je ferai ceci :

     For i =  1 To 150
    '--------------------------------------------
     rs.AddNew
     rs.Fields("P" & i).Value = "mes données"
     rs.Update
    '--------------------------------------------
    Next I

A+
Exploreur

 
0

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

Posez votre question
matheus595959 Messages postés 92 Date d'inscription mardi 3 avril 2007 Statut Membre Dernière intervention 4 août 2008
3 avril 2007 à 11:37
bonjour a vous tous, moi aussi je suis en galere avec le vb sous access et j'en ai vraiment besoin pour realiser mon stage qui se déroule actuellement.
En fait je dois creer une base de données pour la gestion du courrier dans une mairie

alors je dois realiser un formulaire de saisi permettant de mettre la date l'objet du courrier l'expediteur ....ces informations une fois saisis par l'administrateur doivent etre  ajouter a ma table enregistrement

merci de bien vouloir me répondre parce ke je suis un peu dans le caca

ps: désolé j'ai poster mon message un peu n'importe ou
0
cs_Exploreur Messages postés 4821 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 15 novembre 2016 15
3 avril 2007 à 11:54
Salut matheus595959,

Justement, il y a tout sur ce site qui est fait pour ne pas faire n'importe quoi !!!
On ne squatte pas un autre message, en y déposant sa question!!
On ouvre tout simplement un autre sujet, pour ne pas faire confusion avec la question de Dounej et les réponses....

A+
Exploreur

 
0
cs_Exploreur Messages postés 4821 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 15 novembre 2016 15
3 avril 2007 à 11:56
Salut matheus595959,

La prochaine fois tu fais :

Mon compte >> Poser une question dans le forum

Voilà comment faire

A+
Exploreur

 
0
Dounej Messages postés 28 Date d'inscription jeudi 28 décembre 2006 Statut Membre Dernière intervention 7 avril 2007
3 avril 2007 à 12:36
Merci Exploreur pour cette "remise en ordre".

Pour répondre à tes messages concernant mon problème,


la boucle est parfaitement correcte, et le PB n'est pas là.

La boucle telle que tu l'as construite reviendrai à faire 150 lignes d'enregistrements, alors  qu'il s'agit de 150 champs, c'est à dire 150 colonnes (Les 150 colonnes representent 1 seul enregistrement)



Je reprécise que le programme fonctionne correctement sauf dans le cas de la 1ère nouvelle session
La réponse de : 999867 Nicko11 est intéressante, elle approche le PB.

Pour  ma part je pense que le problème est en amont c'est à dire lors de la création de la Base.
Je pense qu'il faut créer "une colonne index" qui sert de clef ce qui va permettre lors d'un nouvel enregistrement  de positionner ce nouvel enregistrement en fin de base.

Et ça ; je ne sais pas faire !




voici mon code de création de base :



Private Sub Creer_BASE()





'**********  Création de la BASE  Enregistrement_données   
    Dim db As DAO.Database
    Dim td As DAO.TableDef
    Dim fd As DAO.Field
    Dim rs As DAO.Recordset
    '------------------------
    Set db = DAO.Workspaces(0).CreateDatabase("chemin du fichier")
    '------------------------------- Création de la TABLE ---------------------
    Set td = db.CreateTableDef("MaTable")
    '-----------------------------  Création des COLONNES  --------------------
    For i =1 To 150
        Set fd = td.CreateField("P" & i, dbInteger, 10)
        td.Fields.Append fd
        Set fd = Nothing
        td.Fields.Refresh
    Next i
     '--------------------------------------------------------------------------
    db.TableDefs.Append td
    db.TableDefs.Refresh
    Set td = Nothing
      '---------------
    rs.Close
    Set rs = Nothing
    '---------------
    db.Close
    Set db = Nothing
    '--------------------------------------------------------------------------


ce code fonctionne très bien

car je l'utilise dans un autre contexte, mais avec 50 colonnes,

Je pense que pour un nombre plus important de colonne il faut "créer une clef " qui va servir "d'index"  ???

Marc
0
cs_Exploreur Messages postés 4821 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 15 novembre 2016 15
3 avril 2007 à 13:42
Salut Dounej,

Ton message  ma calmé....

A+
Exploreur

 
0
cs_Nicko11 Messages postés 1141 Date d'inscription mercredi 7 mars 2007 Statut Membre Dernière intervention 19 septembre 2007 3
3 avril 2007 à 14:33
Si tu veux faire un clé primaire, c'est facile maintenant tu as le choix, c'est elle est auto_numéroté, nouvelle enregistrement index égale index du dernier enregistrement + 1 meme s'il a été effecé.$

Par contre, si tu veux les classe par rapport a un champ que tu as deja, il faut que tu spécifie que ce champ est la clé primaire (click droit je crois)
0
cs_Nicko11 Messages postés 1141 Date d'inscription mercredi 7 mars 2007 Statut Membre Dernière intervention 19 septembre 2007 3
3 avril 2007 à 14:35
Sinon, tu as essayé de mettre le .update dans la boucle for pour voir ce que cela fait
0
HUGOFLASH Messages postés 27 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 5 juin 2007
3 avril 2007 à 20:27
Bonjour,

Pour indexé un champs de la table, il te faut choisir un champs qui ne contient jamais la même valeur pour en faire une clef unique.

c'est bien la première fois que je vois 150 champs dans une table.
juste par curiosité, pourquoi est-ce un problème que l'enregistrement se fasse sur la première ligne?

Je ne voi pas pourquoi l'enregistrement se met en premier dans la table.

Est-ce que le premier champ contient une valeur numérique?

Hugoflash
0
Dounej Messages postés 28 Date d'inscription jeudi 28 décembre 2006 Statut Membre Dernière intervention 7 avril 2007
3 avril 2007 à 20:50
Merci pour vos réponses,
car même si elles n'apportent pas la réponse exacte elles contribuent à nourrir la reflexion :

La suite et une partie de la solution est à l'adresse suivante : Clé primaire Access

Le fait de créer une clé primaire  apporte la solution au problème.
Mais un nouveau problème se pose :
voir :

http://www.vbfrance.com/infomsg_CLE-PRIMAIRE-ACCESS_914561.aspx#6

vos suggestions sont bien venues.

pour répondre à  HUGOFLASH :

1°) c'est bien la première fois que je vois 150 champs dans une table.
juste par curiosité, pourquoi est-ce un problème que l'enregistrement se fasse sur la première ligne?

2°) Je ne voi pas pourquoi l'enregistrement se met en premier dans la table.

3°) Est-ce que le premier champ contient une valeur numérique?

Hugoflash

réponses :
1°) en fait la table comprend 190 champs, qui sont le résultat d'un traitement de données d'un premier  programme. (c'est le prog qui calcul les valeurs, aucun enregistrement clavier).
Le  fait que l'enregistrement se positionne sur la première est un problème car ces données sont traitées de nouveau par un deuxième programme.

2°) l'enregistrement se met en premier pour des raisons que j'ignore, mais je pense que c'est lié à une non indexation !!!
3°) Le premier champ n'est pas une valeur numérique mais une données de type String.
la suivante aussi. puis de type integer et de type byte
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
4 avril 2007 à 11:22
J'imagine donc que le code que tu fournis pour la création de la table ne vient pas de ce programme (?)

    For i =1 To 150
        Set fd = td.CreateField("P" & i, dbInteger, 10)
        td.Fields.Append fd
        Set fd = Nothing
        td.Fields.Refresh
    Next i

MPi
0
cs_Nicko11 Messages postés 1141 Date d'inscription mercredi 7 mars 2007 Statut Membre Dernière intervention 19 septembre 2007 3
4 avril 2007 à 11:51
Est ce que c'est ton premier programme qui crée la table ou pas :

Si oui, faut modifier la création de la table.

Sinon, tu vas dans ta table en mode création et tu as 2 choix:

            - Soit tu insères un champ qui te servira de clé primaire
            - Soit tu choisies le champ qui te permettra de trier tous les enregistrements et faire un click droit  puis sur clé primaire.

Attention aussi à la gestion des doublons si tu les acceptes ou non.
0
Rejoignez-nous