OVH Cloud OVH Cloud

Compactage de "NumeroAuto" afin qu'ils se suivent à coup sûr

3 réponses
Avatar
Stach
Bonjour,

en fait, cette manoeuvre a pour but d'ex=E9cuter un module=20
dans la base dorsale qui permet automatiquement d'importer=20
une table de la base dorsale contenant un champ NumeroAuto=20
que je veux incr=E9menter (et ne perdre aucun num=E9ro dans ce=20
champ si par malheur je dois supprimer le dernier=20
enregistrement)puis exporter cette copie vers la base=20
dorsale afin qu'elle remplace l'ancienne table

J'ai bien essay=E9 de faire tout =E7a =E0 partir de la base=20
frontale en faisant un "import-export" de cette table,=20
puis en r=E9tablissant les liens entre la dorsale et la=20
frontale, mais le probl=E8me est que lorsque je veux=20
supprimer l'ancienne table, access me cr=E9e des mis=E8re car=20
elle d=E9pend de une ou plusieure relation.

si je savais exactement comment =E0 partir de la base=20
Frontale:

1=B0) supprimmer les relations de la table "tblTEST" (champs=20
de relation "plusieur": [txt]) avec celle de la=20
table "tblTXT" (champs de relation "un": [txt] aussi) (???)

2=B0) Importer "tblTEST" dans ma base frontale (OK)
3=B0) Exporter la copie de "tblTEST" vers la base Dorsale=20
(OK)
4=B0) R=E9tablir les relations dans la base Dorsale (???)
5=B0) R=E9tablir les liens entre Frontale et Dorsale (OK)

Cela me permettrai de ne plus jamais perdre de NumeroAuto=20
qui me servent de cl=E9 primaire dans la table.

On m'a bien conseiller d'utiliser "DMax()+1" mais =E7a ne=20
s'applique pas vu que ce genre de formule ne peux =EAtre=20
stocqu=E9e dans une table.

Grand merci de m'aider.

Stach ;-)

3 réponses

Avatar
Michel Walsh
Salut,


La solution envisagée est pire que le problème initial. Utiliser 1+Dmax
est certainement la chose la plus sage, si les données sont nécessairement
saisies depuis un formulaire. Moi, je l'utilise dans la procédure Current:


If Me.NewRecord Then
Me.ControleApproprié = 1+ DMax( ... )
End If

En design the table, je mais un index ne permettant pas de doublons sur ce
champ.

En design the table, je capture l'erreur passée comme argument de la
procédure onError et si elle correspond à un échec de sauvegarde car il y
aurait génération de doublon, je recalcule, simplement réexécute:

Me.ControleApproprié = 1+ DMax( ... )

et resoumet la sauvegarde (ce problème ne peut survenir qu'en environnement
impliquant plusieurs utilisateurs). Bien sûr, cela implique que pour un
nouvel enregistrement, la valeur affichée par 1+Dmax( ) est plutôt une
tentative. Seulement après la sauvegarde devient elle confirmée... tout
comme le reste des autres valeurs de l'enregistrement, en fait... mais cette
méchanique, même si elle est tout à fait logique, peut surprendre le
non-inítié.



Si le 1+Dmax ne convient pas, on peut toujours "remettre à jour" sans
compacter. Il suffit d'ajouter un enregistrement "bidon" où on fournit la
valeur n-1 pour le champ autonum. Exemple:

CurrentDb.Execute "INSERT INTO table( champAutonum) VALUES ( 1567)
", dbFailOnError


(Technique: Il faut fournir une valeur à tous les champs ne pouvant accepter
un NULL tout en n'ayant pas de valeurs par défaut, si il y en a, en plus du
champ à numérotation automatique).


Ceci fait, effacer tout de suite après.

CurrentDb.Execute "DELETE FROM table WHERE champAutonum67"


Le prochain enregistrement aura 1568 comme valeur générée
automatiquement (c'est à dire, si on ne spécifie pas de valeurs pour le
champ autogénéré). Noter qu'un champ généré automatiquement N'IMPLIQUE PAS
qu'il ne produit pas de DOUBLONS. On peut, ainsi, avec cette technique,
ajouter plusieurs enregistrements avec la valeur 1568, ou 1567 (avec le
INSERT INTO plus haut). Si on ne veut pas de doublons, faut le préciser! en
plus!


Mais je maintiens que 1+Dmax est le chemin à suivre.


Espérant être utile,
Vanderghast, Access MVP


"Stach" wrote in message
news:079e01c39939$edf35a40$
Bonjour,

en fait, cette manoeuvre a pour but d'exécuter un module
dans la base dorsale qui permet automatiquement d'importer
une table de la base dorsale contenant un champ NumeroAuto
que je veux incrémenter (et ne perdre aucun numéro dans ce
champ si par malheur je dois supprimer le dernier
enregistrement)puis exporter cette copie vers la base
dorsale afin qu'elle remplace l'ancienne table

J'ai bien essayé de faire tout ça à partir de la base
frontale en faisant un "import-export" de cette table,
puis en rétablissant les liens entre la dorsale et la
frontale, mais le problème est que lorsque je veux
supprimer l'ancienne table, access me crée des misère car
elle dépend de une ou plusieure relation.

si je savais exactement comment à partir de la base
Frontale:

1°) supprimmer les relations de la table "tblTEST" (champs
de relation "plusieur": [txt]) avec celle de la
table "tblTXT" (champs de relation "un": [txt] aussi) (???)

2°) Importer "tblTEST" dans ma base frontale (OK)
3°) Exporter la copie de "tblTEST" vers la base Dorsale
(OK)
4°) Rétablir les relations dans la base Dorsale (???)
5°) Rétablir les liens entre Frontale et Dorsale (OK)

Cela me permettrai de ne plus jamais perdre de NumeroAuto
qui me servent de clé primaire dans la table.

On m'a bien conseiller d'utiliser "DMax()+1" mais ça ne
s'applique pas vu que ce genre de formule ne peux être
stocquée dans une table.

Grand merci de m'aider.

Stach ;-)
Avatar
Merci pour ta réponse,

Oui, en effet, mes données sont toutes saisies à partir de
formulaire, mais comment faire pour que cette valeur de "1
+ DMax(...)" se retrouve dans ma table où il y a le Champ
NumeroAuto que je veus incrémenter?

Stach ;-)

-----Message d'origine-----
Salut,


La solution envisagée est pire que le problème
initial. Utiliser 1+Dmax

est certainement la chose la plus sage, si les données
sont nécessairement

saisies depuis un formulaire. Moi, je l'utilise dans la
procédure Current:



If Me.NewRecord Then
Me.ControleApproprié = 1+ DMax( ... )
End If

En design the table, je mais un index ne permettant pas
de doublons sur ce

champ.

En design the table, je capture l'erreur passée comme
argument de la

procédure onError et si elle correspond à un échec de
sauvegarde car il y

aurait génération de doublon, je recalcule, simplement
réexécute:


Me.ControleApproprié = 1+ DMax( ... )

et resoumet la sauvegarde (ce problème ne peut survenir
qu'en environnement

impliquant plusieurs utilisateurs). Bien sûr, cela
implique que pour un

nouvel enregistrement, la valeur affichée par 1+Dmax( )
est plutôt une

tentative. Seulement après la sauvegarde devient elle
confirmée... tout

comme le reste des autres valeurs de l'enregistrement, en
fait... mais cette

méchanique, même si elle est tout à fait logique, peut
surprendre le

non-inítié.



Si le 1+Dmax ne convient pas, on peut
toujours "remettre à jour" sans

compacter. Il suffit d'ajouter un enregistrement "bidon"
où on fournit la

valeur n-1 pour le champ autonum. Exemple:

CurrentDb.Execute "INSERT INTO table(
champAutonum) VALUES ( 1567)

", dbFailOnError


(Technique: Il faut fournir une valeur à tous les champs
ne pouvant accepter

un NULL tout en n'ayant pas de valeurs par défaut, si il
y en a, en plus du

champ à numérotation automatique).


Ceci fait, effacer tout de suite après.

CurrentDb.Execute "DELETE FROM table WHERE
champAutonum67"



Le prochain enregistrement aura 1568 comme valeur
générée

automatiquement (c'est à dire, si on ne spécifie pas de
valeurs pour le

champ autogénéré). Noter qu'un champ généré
automatiquement N'IMPLIQUE PAS

qu'il ne produit pas de DOUBLONS. On peut, ainsi, avec
cette technique,

ajouter plusieurs enregistrements avec la valeur 1568, ou
1567 (avec le

INSERT INTO plus haut). Si on ne veut pas de doublons,
faut le préciser! en

plus!


Mais je maintiens que 1+Dmax est le chemin à suivre.


Espérant être utile,
Vanderghast, Access MVP


"Stach" wrote in
message

news:079e01c39939$edf35a40$
Bonjour,

en fait, cette manoeuvre a pour but d'exécuter un module
dans la base dorsale qui permet automatiquement d'importer
une table de la base dorsale contenant un champ NumeroAuto
que je veux incrémenter (et ne perdre aucun numéro dans ce
champ si par malheur je dois supprimer le dernier
enregistrement)puis exporter cette copie vers la base
dorsale afin qu'elle remplace l'ancienne table

J'ai bien essayé de faire tout ça à partir de la base
frontale en faisant un "import-export" de cette table,
puis en rétablissant les liens entre la dorsale et la
frontale, mais le problème est que lorsque je veux
supprimer l'ancienne table, access me crée des misère car
elle dépend de une ou plusieure relation.

si je savais exactement comment à partir de la base
Frontale:

1°) supprimmer les relations de la table "tblTEST" (champs
de relation "plusieur": [txt]) avec celle de la
table "tblTXT" (champs de relation "un": [txt] aussi)
(???)


2°) Importer "tblTEST" dans ma base frontale (OK)
3°) Exporter la copie de "tblTEST" vers la base Dorsale
(OK)
4°) Rétablir les relations dans la base Dorsale (???)
5°) Rétablir les liens entre Frontale et Dorsale (OK)

Cela me permettrai de ne plus jamais perdre de NumeroAuto
qui me servent de clé primaire dans la table.

On m'a bien conseiller d'utiliser "DMax()+1" mais ça ne
s'applique pas vu que ce genre de formule ne peux être
stocquée dans une table.

Grand merci de m'aider.

Stach ;-)


.



Avatar
Michel Walsh
salut,

Le design de table spécifiera un champ entier long, requis, avec index
ne permettant pas de doublon. Un entier long, pas un autonum.

Le formulaire, dans la procédure Current, aura les lignes de code:

If Me.NewRecord Then
Me.ControleApproprié = 1+ DMax( ... )
End If


C'est tout. Du moins, si on oublie le traitement d'erreur dans le
onError du formulaire, qui, de base, peut ressembler à:


Private Sub Form_Error(DataErr As Integer, Response As Integer)
If 3022 = DataErr Then 'doublon...
Response = acDataErrContinue
Me.ControleApproprié= 1+DMax( ...)
MsgBox "La valeur de ... semble avoir été utilisée, nous l'avons
modifié...bla-bla-bla prière de confirmer et sauvegarder à nouveau..."
End If
End Sub



wrote in message
news:0a0301c39965$877934c0$
Merci pour ta réponse,

Oui, en effet, mes données sont toutes saisies à partir de
formulaire, mais comment faire pour que cette valeur de "1
+ DMax(...)" se retrouve dans ma table où il y a le Champ
NumeroAuto que je veus incrémenter?

Stach ;-)

-----Message d'origine-----
Salut,


La solution envisagée est pire que le problème
initial. Utiliser 1+Dmax

est certainement la chose la plus sage, si les données
sont nécessairement

saisies depuis un formulaire. Moi, je l'utilise dans la
procédure Current:



If Me.NewRecord Then
Me.ControleApproprié = 1+ DMax( ... )
End If

En design the table, je mais un index ne permettant pas
de doublons sur ce

champ.

En design the table, je capture l'erreur passée comme
argument de la

procédure onError et si elle correspond à un échec de
sauvegarde car il y

aurait génération de doublon, je recalcule, simplement
réexécute:


Me.ControleApproprié = 1+ DMax( ... )

et resoumet la sauvegarde (ce problème ne peut survenir
qu'en environnement

impliquant plusieurs utilisateurs). Bien sûr, cela
implique que pour un

nouvel enregistrement, la valeur affichée par 1+Dmax( )
est plutôt une

tentative. Seulement après la sauvegarde devient elle
confirmée... tout

comme le reste des autres valeurs de l'enregistrement, en
fait... mais cette

méchanique, même si elle est tout à fait logique, peut
surprendre le

non-inítié.



Si le 1+Dmax ne convient pas, on peut
toujours "remettre à jour" sans

compacter. Il suffit d'ajouter un enregistrement "bidon"
où on fournit la

valeur n-1 pour le champ autonum. Exemple:

CurrentDb.Execute "INSERT INTO table(
champAutonum) VALUES ( 1567)

", dbFailOnError


(Technique: Il faut fournir une valeur à tous les champs
ne pouvant accepter

un NULL tout en n'ayant pas de valeurs par défaut, si il
y en a, en plus du

champ à numérotation automatique).


Ceci fait, effacer tout de suite après.

CurrentDb.Execute "DELETE FROM table WHERE
champAutonum67"



Le prochain enregistrement aura 1568 comme valeur
générée

automatiquement (c'est à dire, si on ne spécifie pas de
valeurs pour le

champ autogénéré). Noter qu'un champ généré
automatiquement N'IMPLIQUE PAS

qu'il ne produit pas de DOUBLONS. On peut, ainsi, avec
cette technique,

ajouter plusieurs enregistrements avec la valeur 1568, ou
1567 (avec le

INSERT INTO plus haut). Si on ne veut pas de doublons,
faut le préciser! en

plus!


Mais je maintiens que 1+Dmax est le chemin à suivre.


Espérant être utile,
Vanderghast, Access MVP


"Stach" wrote in
message

news:079e01c39939$edf35a40$
Bonjour,

en fait, cette manoeuvre a pour but d'exécuter un module
dans la base dorsale qui permet automatiquement d'importer
une table de la base dorsale contenant un champ NumeroAuto
que je veux incrémenter (et ne perdre aucun numéro dans ce
champ si par malheur je dois supprimer le dernier
enregistrement)puis exporter cette copie vers la base
dorsale afin qu'elle remplace l'ancienne table

J'ai bien essayé de faire tout ça à partir de la base
frontale en faisant un "import-export" de cette table,
puis en rétablissant les liens entre la dorsale et la
frontale, mais le problème est que lorsque je veux
supprimer l'ancienne table, access me crée des misère car
elle dépend de une ou plusieure relation.

si je savais exactement comment à partir de la base
Frontale:

1°) supprimmer les relations de la table "tblTEST" (champs
de relation "plusieur": [txt]) avec celle de la
table "tblTXT" (champs de relation "un": [txt] aussi)
(???)


2°) Importer "tblTEST" dans ma base frontale (OK)
3°) Exporter la copie de "tblTEST" vers la base Dorsale
(OK)
4°) Rétablir les relations dans la base Dorsale (???)
5°) Rétablir les liens entre Frontale et Dorsale (OK)

Cela me permettrai de ne plus jamais perdre de NumeroAuto
qui me servent de clé primaire dans la table.

On m'a bien conseiller d'utiliser "DMax()+1" mais ça ne
s'applique pas vu que ce genre de formule ne peux être
stocquée dans une table.

Grand merci de m'aider.

Stach ;-)


.