Dounej
Messages postés28Date d'inscriptionjeudi 28 décembre 2006StatutMembreDernière intervention 7 avril 2007
-
3 avril 2007 à 11:13
cs_Nicko11
Messages postés1141Date d'inscriptionmercredi 7 mars 2007StatutMembreDernière intervention19 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
A voir également:
La clé de recherche n'a été trouvée dans aucun enregistrement
cs_Exploreur
Messages postés4821Date d'inscriptionlundi 11 novembre 2002StatutMembreDernière intervention15 novembre 201615 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)
cs_Nicko11
Messages postés1141Date d'inscriptionmercredi 7 mars 2007StatutMembreDernière intervention19 septembre 20073 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
cs_Exploreur
Messages postés4821Date d'inscriptionlundi 11 novembre 2002StatutMembreDernière intervention15 novembre 201615 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
matheus595959
Messages postés92Date d'inscriptionmardi 3 avril 2007StatutMembreDerniè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
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....
Dounej
Messages postés28Date d'inscriptionjeudi 28 décembre 2006StatutMembreDerniè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" ???
cs_Nicko11
Messages postés1141Date d'inscriptionmercredi 7 mars 2007StatutMembreDernière intervention19 septembre 20073 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)
HUGOFLASH
Messages postés27Date d'inscriptionvendredi 10 octobre 2003StatutMembreDerniè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?
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
cs_Nicko11
Messages postés1141Date d'inscriptionmercredi 7 mars 2007StatutMembreDernière intervention19 septembre 20073 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.