Clé primaire [Résolu]

Signaler
Messages postés
44
Date d'inscription
lundi 1 avril 2002
Statut
Membre
Dernière intervention
16 août 2009
-
Messages postés
44
Date d'inscription
lundi 1 avril 2002
Statut
Membre
Dernière intervention
16 août 2009
-
Bonjour
J'ai une table qui me permet d'importer des données d'une feuile excel. Lors de chaque importation je dois vider ma table avant de la récupération(environ 3400 lignes)
Mon problème c'est que la clé primaire ne se réinitialise pas et que j'ai maintenant des numéros a 220 000 a force de faire des importations.
J'ai essayé de compacté ma table, mais ça ne marche pas.

Celui qui ajoute de nouvelles connaissances aux anciennes est le véritable professeur.(Confucius)

4 réponses

Messages postés
44
Date d'inscription
lundi 1 avril 2002
Statut
Membre
Dernière intervention
16 août 2009

Merci pour vos réponses.
Mon problème venait d'une erreur de code

Pour vider ma table j'utilise une requete nommée DeleteCg créée avec le générateur de requêtes
DELETE FROM TCNat WHERE (Nom <> "'')

StrFilePath =

My.Application.Info.DirectoryPath

Me.TCNatTableAdapter.DeleteCg()

CompactAndRepair(StrFilePath &
"\CG.mdb", StrFilePath)
CompactAndRepair est une fonction que j'ai trouvé il y a quelques temps. Je le remet ici car ça peut toujours servir.
Public

Function CompactAndRepair(
ByVal DbPath
As
String,
ByVal TmpFolder
As
String)
As
Boolean
Dim Oparams
As
Object
Dim OJro
As
Object = Activator.CreateInstance(Type.GetTypeFromProgID(
"Jro.JetEngine"))

Dim StrLblPath
As
String
If
Not File.Exists(DbPath)
Then
MessageBox.Show(
"Base de donnée non trouvée.",
"Administrateur", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)

Return
False
End
IfStrLblPath = Mid(DbPath, 1, Len(DbPath) - 3) &

"lbd"
If File.Exists(StrLblPath)
Then
MessageBox.Show(
"La base de données est déjà ouverte",
"Administrateur", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)

Return
False
End
If
Try

Oparams =
New
Object() {
"Provider=Microsoft.jet.OLEDB.4.0;Data Source=" & DbPath &
";Jet OLEDB:Engine Type=5",
"Provider=Microsoft.jet.OLEDB.4.0;Data Source=" & TmpFolder &
"~Tempdb.mbd;Jet OLEDB:Engine Type=5"}

OJro.GetType().InvokeMember(
"CompactDatabase", Reflection.BindingFlags.InvokeMethod,
Nothing, OJro, Oparams)
File.Delete(DbPath)
File.Move(TmpFolder &
"~Tempdb.mbd", DbPath)
Runtime.InteropServices.Marshal.ReleaseComObject(OJro)
OJro =
Nothing
Return
True
Catch ex
As Exception

Return
False
End
Try
End
Function

Celui qui ajoute de nouvelles connaissances aux anciennes est le véritable professeur.(Confucius)
Messages postés
4822
Date d'inscription
lundi 11 novembre 2002
Statut
Membre
Dernière intervention
15 novembre 2016
13
Salut,

Il y aurais peut-être une solution, c'est d'exporter tes donner de ta table existante dans une nouvelle table, ainsi, tu auras le numéro auto en chrono à chaque fois... 

A+
Exploreur

 Linux a un noyau, Windows un pépin

 
Messages postés
96
Date d'inscription
mardi 29 mars 2005
Statut
Membre
Dernière intervention
10 mars 2011
2
Bonjour, microsoft.support dit:

Lorsque vous développez une application, et que vous créez des
enregistrements bidons pour tester celle-ci, les tables contenant un
champ compteur incrémentent celui-ci au fur et à mesure de la saisie de
nouveaux enregistrements.
Ainsi même si vous supprimez vos 20 enregistrements de test, un nouvel
enregistrement aura comme valeur dans le champ compteur 21.

Pour réinitialiser ce champ, vous devez supprimer tous les
enregistrements de la table sans exceptions. Fermez ensuite votre base de
données. Compactez alors la base de données en sélectionnant le menu
Fichier puis la commande Compacter une base de données. Vous pouvez
maintenant réouvrir votre base et la table précédente. Créez un nouvel
enregistrement, le champ compteur démarre bien à 1.

REMARQUES :

Lorsque vous compactez votre base de données Access vous demande de
renommer votre base. Aussi avant d'effectuer la manipulation de
compactage, basculez sous le gestionnaire de fichier et renommez votre
base en BASETEMP.MDB. Vous n'avez plus alors qu'à redonner son nom
original lors de l'opération de compactage.

Cette manipulation permet de réinitialiser le champ compteur, uniquement
si la table ne contient pas d'enregistrements. Dans le cas contraire,
vous devez supprimer le champ compteur (si ce champ constitue la clé
primaire vous devez préalablement supprimer la clé primaire) puis le
recréer ( et éventuellement recréer la clé primaire) cf FT N° 463204 (http://support.microsoft.com/kb/463204/FR/).
Mais attention, ceci n'est réalisable que si il n'y a aucunne relation
basée sur ce champ, sinon utilisez un compteur de type personnalisé cd FT
Messages postés
615
Date d'inscription
mercredi 18 décembre 2002
Statut
Membre
Dernière intervention
4 juillet 2012

Le plus simple c'est de re-créer une table temporaire à chaque fois, et l'effacer en fin d'utilisation. Pour cela voir du coté des objets ADOX .
Ajouter au projet la référence "Microsoft ADO Ext. 2.8 for DDL and security" (msADOX.dll)

Pour créer une table temporaire
 
'Ceci crée une table et ajoute un champ en clé primaire et auto-incrément, un champ de type Integer, et un autre champ de type String.

Sub createTable

Dim cat as ADOX.catalog
Dim tbl as new ADOX.Table
Dim i as single

   Set cat = New ADOX.Catalog
   cat.create "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.path & "\MyDB.mdb"

   With tbl
         .Name = "NomdemaTable"
         Set .ParentCatalog = cat
         .Columns.Append "MonChampID", adInteger
         .Columns("MonChampID").Properties("AutoIncrement") = True
         .Columns.Append "MonChamp1", adInteger, 20
         .Columns.Append "MonChamp2", adVarWChar, 50
   End With
   cat.Tables.Append tbl
   tbl.Keys.Append "ClePrimaire", adKeyPrimary, ""MonChampID"

End Sub
  
'Cette fonction efface la table "TableName" de la base de donnée

Function DeleteTable(TableName As String) As Boolean


    On Error GoTo DeleteTable_Error
   
    Set cn = New ADODB.Connection
    cn.CursorLocation = adUseClient
    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.path & "\MyDB.mdb"


    Set cat = New ADOX.Catalog
    Set cat.ActiveConnection = cn
    DeleteTable = True
    cat.Tables.Delete TableName
    On Error GoTo 0
    Set cat = Nothing
    cn.Close
    Set cn = Nothing
    Exit Function


DeleteTable_Error:
    DeleteTable = False
    Resume Next
    Set cat = Nothing
    cn.Close
    Set cn = Nothing



End Function

   

Pascal Laurençon