Bonjour,
Comment, autrement que par passage par table/mode création, supprimer un champ par code en VBA ou SQL ?
Auriez-vous une solutions ?
Bonjour,
Comment, autrement que par passage par table/mode création, supprimer un champ par code en VBA ou SQL ?
Auriez-vous une solutions ?
Salut,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 CurrentDb.Execute "ALTER TABLE NomTable DROP COLUMN NomChamp;", dbFailOnError 'supprimer un champ CurrentDb.Execute "ALTER TABLE NomTable DROP INDEX NomIndex;", dbFailOnError 'supprimer un index
Merci de ta réponse.
Voici le résultat :
1) j'utilise ALTER TABLE pour supprimer le champ, erreur :
, ce qui est bien le cas du champ que je voulais supprimer.Envoyé par Access
2) je recommence donc avec DROP INDEX, pas d"erreur signalée, mais l'index est toujours là.
Ainsi il faut d'abord supprimer l’index, ce qui est facile en allant dans le mode création de la table et se fait d'un clic.
Il doit certainement être possible de faire cette manœuvre par le code.
Qu'en penses-tu ?
Inversez l'ordre d'exécution
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 CurrentDb.Execute "ALTER TABLE NomTable DROP INDEX NomIndex;", dbFailOnError 'supprimer un index CurrentDb.Execute "ALTER TABLE NomTable DROP COLUMN NomChamp;", dbFailOnError 'supprimer un champ
Merci de ta rapide réaction.
Malheureusement ça ne va pas mieux en inversant l'ordre d'exécution :
En effet la commande suppression d'index m'annonce une erreur d'exécutionOr cet index est bien là et bien entendu la suppression de column ne peut se faire.Envoyé par Access
L'index est une clé classique "oui- Pas de doublons" pour un champ entier long.
Alors ?
Éh, éh ! Et n'y aurait-il pas une relation associée à ce champ ?
Non, aucune relation associée à ce champ.
Pour vérifier, j'ai utilisé une table créée spécialement, donc sans aucun lien avec d'autres tables.
1) suppression de l'index : pas d'erreur signalée, mais l'index est toujours présent
2) suppression du champ : erreur "impossible de supprimer un champ indexé"
3) nouvelle supp d'index : "le champ indiqué n'existe pas " !
Si je referme la base, puis recommence, c'est le même cycle qui se reproduit sans aucune modification de la table.
Je ne comprends plus !
Bonjour,
J'ai essayé le code de suppression de l'index, mais je n'ai pas de souci. Le champ indexé est correctement supprimé.
Peut-on avoir la table en question pour vérifier et voir.
Cordialement.
madefemere @
Pas de pb pour envoyer la petite table mdb sur laquelle j'ai fait mon test, mais sous quelle forme : fichier Excel ?
Je n'ai encore jamais envoyé de PJ sur le forum.
Merci de l'aide.
Je dirai plus tôt en mdb ou accdb pour ton exemple de tbl.
Mais pourrais-tu essayer les 2 proc ci-dessous sur évènement sur click de 2 btn de commande
Celle-ci permet de créer la tbl films avec des champs. Le champ nom est indexé (idxnom).
et
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 Private Sub Commande34_Click() DoCmd.SetWarnings False CurrentDb.Execute "CREATE TABLE films (" & _ "nf AutoIncrement CONSTRAINT idxnf Primary Key," & _ "nom TEXT(100) NOT NULL," & _ "type TEXT(3) ," & _ "affiche TEXT(100)," & _ "mo INTEGER," & _ "duree INTEGER," & _ "ngenre INTEGER," & _ "norigine INTEGER," & _ "annee TEXT(4)," & _ "web TEXT(100)," & _ "resume YESNO," & _ "nrea INTEGER);", dbFailOnError CurrentDb.Execute "CREATE INDEX idxnom ON films(nom);", dbFailOnError DoCmd.SetWarnings True RefreshDatabaseWindow End Sub
Celle-ci permet de supprimer l'index (idxnom) puis le champ nom
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Private Sub Commande35_Click() CurrentDb.Execute "DROP INDEX idxnom ON films;", dbFailOnError CurrentDb.Execute "ALTER TABLE films DROP COLUMN nom;", dbFailOnError End Sub
Je viens de mettre en place, comme u me le suggérais, les 2 boutons,.
Avec la sub 34, la table films se crée bien, mais le champ nom a disparu et le seul champ indexé est le champ nf numero auto.
J'arrête pour ce soir (fatigue des yeux !).
Demain, je rajouterai manuellement le champ nom indexé pou nouvelle tentative avec la cmd36.
Bonne soirée
Sub34
Cette Sub crée la tbl films composée de champs dont le champ nom
L5 le champ nom est bien créé.
L16 l'index idxnom du champ nom est bien créé également.
Je ne comprends pas comment le champ nom pourrait disparaitre !
Sub35
L2 supprime l'index idxnom
L3 le champ nom est enfin supprimé.
J'ai recommencé en repartant à zéro.
sub34 : en mode création de table, le champ nom existe bien avec index avec doublons, mais sans icone "clé" en marge gauche alors qu'il y en a une pour le champ nf (auto) en clé primaire sans doublons.
C'est ce qui m'a conduit à écrire qu'il n'avait pas d'index.
Sub36: suppression d'index refusé, car "aucun index nom n'existe".
Il y a manifestement un problème dans mon Access2007.
Je reprendrai cet AM
Merci de votre aide.
Bonjour,
Peux-tu poster le code du sub36 que tu as s'il te plait.
Parce que dans le code qu'a posté hyperion13, l'index du champ nom se nomme idxnom
Or l'erreur que tu indiques
Code : Sélectionner tout - Visualiser dans une fenêtre à part CurrentDb.Execute "CREATE INDEX idxnom ON films(nom);", dbFailOnError
parle d'un index du nom de index nom !Sub36: suppression d'index refusé, car "aucun index nom n'existe".
Pour la première partie de ton message :
"icone "clé" en marge gauche" => indique que c'est la clé primairesub34 : en mode création de table, le champ nom existe bien avec index avec doublons, mais sans icone "clé" en marge gauche alors qu'il y en a une pour le champ nf (auto) en clé primaire sans doublons.
C'est ce qui m'a conduit à écrire qu'il n'avait pas d'index.
Tu peux avoir un champ "indexé" sans être une clé primaire.
Pour vérifier si un champ est indexé, tu peux effectivement voir dans sa propriété ou en mode création, tu appuies sur le bouton éclair jaune avec liste de champ
Cordialement.
Vous pourriez faire une capture en mode création de la tbl que vous traitez ?
Parce que vous évoquez index, et pictogramme clé primaire.
Pour info, un champ indéxé n'est pas forcément clé primaire ou clé primaire composée !
madefemere@
Voici le code que j'ai utilisé pour la 36
C'est peut-être effectivement lui qui est en cause.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Private Sub cmd36X_Click() CurrentDb.Execute "DROP INDEX nom ON films;", dbFailOnError CurrentDb.Execute "ALTER TABLE films DROP COLUMN nom;", dbFailOnError End Sub
re-Bonjour,
Je commente les instructions essentielles :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 Private Sub Commande34_Click() DoCmd.SetWarnings False CurrentDb.Execute "CREATE TABLE films (" & _ "nf AutoIncrement CONSTRAINT idxnf Primary Key," & _ "nom TEXT(100) NOT NULL," & _ "type TEXT(3) ," & _ "affiche TEXT(100)," & _ "mo INTEGER," & _ "duree INTEGER," & _ "ngenre INTEGER," & _ "norigine INTEGER," & _ "annee TEXT(4)," & _ "web TEXT(100)," & _ "resume YESNO," & _ "nrea INTEGER);", dbFailOnError CurrentDb.Execute "CREATE INDEX idxnom ON films(nom);", dbFailOnError ' On crée l'index qui porte le nom de "idxnom" DoCmd.SetWarnings True RefreshDatabaseWindow End SubIl n'y a plus qu'à...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Private Sub cmd36X_Click() CurrentDb.Execute "DROP INDEX nom ON films;", dbFailOnError 'Tu supprimes l'index qui se nomme "nom". Normal si cela lève une erreur 'CurrentDb.Execute "ALTER TABLE films DROP COLUMN nom;", dbFailOnError 'Cette ligne est inutile si tu veux voir la suppression de l'index. Il faut la commenter End Sub
Cordialement.
Grâce à hyperion13 et à madefemere, que je remercie j'ai appris comment créer et supprimer un index clé non primaire, ce qui est déjà beaucoup pour moi.
Mais ce que je recherchais concernait un index clé primaire, ce que j'aurais dû préciser dès le début et je m'excuse de cet oubli.
Et cette opération semble impossible par le code, à moins que j'aie mal compris vos explications;
J'ai plusieurs tables de même structure, affectées chacune à un opérateur avec laquelle il relève des informations relatives à la généalogie, par exemple les tables décennales d'une ville.
Ces tables ont une clé primaire : un numéro automatique.
Avant de les concaténer dans une table globale, on modifie le N° auto en le multipliant par 10 et en lui ajoutant le code à un chiffre de l'opérateur.
On est donc ainsi certain de ne pas avoir de doublons lors de la concaténation, qui rate parce qu'il y a d'autres clés cette clé primaire.
Je vais donc revoir tout le processus, en tenant compte de nos discussions, dont J'ai aussi retenu qu'il fallait donner un nom à l'index.
Comment peut-on connaître ce nom pour une table donnée sans passer par mode création ?
Par défaut il me semble que c'est le nom du champ.
Cordialement.
Effectivement
Créer une tbl avec une clé primaire
Supprimer la clé primaire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Private Sub Commande37_Click() DoCmd.SetWarnings False CurrentDb.Execute "CREATE TABLE tblfilms (" & _ "idfilm AutoIncrement CONSTRAINT idxid PRIMARY KEY," & _ "nomfilm TEXT(100) NOT NULL," & _ "typefilm TEXT(25));", dbFailOnError DoCmd.SetWarnings True RefreshDatabaseWindow End Sub
Créer une tbl avec une clé primaire composée
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Private Sub Commande37_Click() CurrentDb.Execute "ALTER TABLE tblfilms DROP CONSTRAINT idxid;", dbFailOnError End Sub
Supprimer clé primaire composée et les index
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 Private Sub Commande37_Click() DoCmd.SetWarnings False CurrentDb.Execute "CREATE TABLE tblfilms (" & _ "idfilm AutoIncrement," & _ "nomfilm TEXT(100) NOT NULL," & _ "typefilm TEXT(25) ," & _ "CONSTRAINT CleComposee PRIMARY KEY(idfilm, nomfilm));", dbFailOnError CurrentDb.Execute "CREATE UNIQUE INDEX idxnf ON tblfilms(idfilm);", dbFailOnError CurrentDb.Execute "CREATE UNIQUE INDEX idxnom ON tblfilms(nomfilm);", dbFailOnError DoCmd.SetWarnings True RefreshDatabaseWindow End Sub
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Private Sub Commande37_Click() CurrentDb.Execute "ALTER TABLE tblfilms DROP CONSTRAINT CleComposee;", dbFailOnError CurrentDb.Execute "ALTER TABLE tblfilms DROP CONSTRAINT idxnf;", dbFailOnError CurrentDb.Execute "ALTER TABLE tblfilms DROP CONSTRAINT idxnom;", dbFailOnError End Sub
Bonsoir,
C'est possible. hyperion13 te donne le code et c'est le même code depuis le début.Mais ce que je recherchais concernait un index clé primaire, ce que j'aurais dû préciser dès le début et je m'excuse de cet oubli.
Et cette opération semble impossible par le code, à moins que j'aie mal compris vos explications;
Effectivement, c'est dans ton processus que tu as du mal suite à une incompréhension des clé primaires et index.
Si j'ai bien compris, tu as des opérateurs qui font des saisies dans des tables ayant le même structure avec un numéro automatique et tu intègres ces données dans une base de données globale avec une table ayant aussi la même structure. Et tu es embêté par l'identifiant unique.
La solution serait pour moi de rajouter directement dans les tables de saisi le numéro de l'opérateur. La clé primaire peu rester le numéro de l'opérateur.
Il faut aussi rajouter dans la table globale ce champ numéro de l'opérateur, mais la clé primaire serait la combinaison d'un champ numérique et du numéro de l'opérateur. Ainsi, lors de l'insertion des données, l'unicité des données serait toujours respectée. Tu peux rajouter un numéro automatique identifiant les données (il serait indépendant des données).
Cordialement.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager