Access 2002 sous WXP
giess54
Messages postés
13
Statut
Membre
-
blux Messages postés 27842 Date d'inscription Statut Modérateur Dernière intervention -
blux Messages postés 27842 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour,
Question sur Access 2002 :
Je cherche le moyen le + efficace de supprimer un enregistrement d'une table via un bouton d'un formulaire et de le sauvegarder dans une autre table pour réaliser une sorte d'historique des enregistrements. Je pensais réaliser une macro mais cela s'avère assez restrictif puis à le faire via une commande SQL mais cela me semble compliqué.
Merci de votre aide
Question sur Access 2002 :
Je cherche le moyen le + efficace de supprimer un enregistrement d'une table via un bouton d'un formulaire et de le sauvegarder dans une autre table pour réaliser une sorte d'historique des enregistrements. Je pensais réaliser une macro mais cela s'avère assez restrictif puis à le faire via une commande SQL mais cela me semble compliqué.
Merci de votre aide
A voir également:
- Access 2002 sous WXP
- Acer quick access - Forum Logiciels
- Access appdata - Guide
- Mysqli::real_connect(): (hy000/2002): aucune connexion n’a pu être établie car l’ordinateur cible l’a expressément refusée. - Forum PHP
- Exemple base de données access à télécharger gratuit - Forum Access
- Exemple base de données Access de gestion ✓ - Forum Logiciels
5 réponses
Salut,
ce n'est pas très compliqué :
un peu de code attaché à ton bouton, avec l'exécution de 2 requêtes : l'une pour ajouter dans ta table historique et l'autre pour supprimer de la table en cours.
A+ Blux
ce n'est pas très compliqué :
un peu de code attaché à ton bouton, avec l'exécution de 2 requêtes : l'une pour ajouter dans ta table historique et l'autre pour supprimer de la table en cours.
docmd.runsql "INSERT INTO histo SELECT * FROM tab_courante WHERE..." docmd.runsql "DELETE * FROM tab_courante WHERE..."Ca devrait suffire... :-)
A+ Blux
"Les cons, ça ose tout. C'est même à ça qu'on les reconnait"
Bonjour,
Je vous propose de garder tous vos enrégistrements. Vous ajoutez un champ pour différentier si ACTIF ou Suppr (par expl en utilisant un menu déroulant) et vous imposez le choix par défaut de ce champ comme ACTIF. Votre bouton supprimer n'est plus nécessaire car il vous suffit de changer l'etat du champ via le menu déroulant du champ du formulaire.
Vos enregistrements dit "Suppr" sont donc toujours présent, il suffit de les retrouver via un filtre sur le champ concerné.
Pensez à introduire une date lors de la dite "Suppr" ......
Bon courage.
Jean-Pierre
Je vous propose de garder tous vos enrégistrements. Vous ajoutez un champ pour différentier si ACTIF ou Suppr (par expl en utilisant un menu déroulant) et vous imposez le choix par défaut de ce champ comme ACTIF. Votre bouton supprimer n'est plus nécessaire car il vous suffit de changer l'etat du champ via le menu déroulant du champ du formulaire.
Vos enregistrements dit "Suppr" sont donc toujours présent, il suffit de les retrouver via un filtre sur le champ concerné.
Pensez à introduire une date lors de la dite "Suppr" ......
Bon courage.
Jean-Pierre
C'est effectivement une solution que de les marquer 'logiquement' effacés, mais le risque est grand, si la table est 'mouvante' de se retrouver un jour avec une quantité d'enregistrements dont on aura que faire, et qui ralentiront les traitements (mise à jour des index, parcours des tables lors d'un FTS si pas d'index...)
A+ Blux
A+ Blux
"Les cons, ça ose tout. C'est même à ça qu'on les reconnait"
Salut,
J'ai effectivement tenté de saisir tes commandes sans succès en voulant les affecter au bouton dans mon formulaire. Cela se présente comme cela :
Private sub commande_click()
' là, je tape tes commandes mais cela bloque à la compil sur le nom de la table de destination (alors qu'elle est bien crée) j'ai saisi :
DoCmd.RunSQL InsertInto tabledest from tableinit.[champs1],tableinit[champs2] from tableinit;
De plus je ne sais pas si ce genre de requête ne va pas prendre en compte tous les enregistrements de ma table initiale pour les inclure (quand ça marchera) dans ma table de destination alors que je ne veux que seul, l'enregistrement sur lequel je me trouve dans le formulaire, parte dans ma table archive.
J'espère avoir été clair.
Merci coop
Alain
J'ai effectivement tenté de saisir tes commandes sans succès en voulant les affecter au bouton dans mon formulaire. Cela se présente comme cela :
Private sub commande_click()
' là, je tape tes commandes mais cela bloque à la compil sur le nom de la table de destination (alors qu'elle est bien crée) j'ai saisi :
DoCmd.RunSQL InsertInto tabledest from tableinit.[champs1],tableinit[champs2] from tableinit;
De plus je ne sais pas si ce genre de requête ne va pas prendre en compte tous les enregistrements de ma table initiale pour les inclure (quand ça marchera) dans ma table de destination alors que je ne veux que seul, l'enregistrement sur lequel je me trouve dans le formulaire, parte dans ma table archive.
J'espère avoir été clair.
Merci coop
Alain
Il faut déjà mettre le code SQL entre guillemets et ne pas oublier que l'on écrit INSERT INTO et non InsertInto...
Pour limiter l'étendue de la requête, il faut mettre une condition WHERE qui référence l'enregistrement souhaité...
A+ Blux
Pour limiter l'étendue de la requête, il faut mettre une condition WHERE qui référence l'enregistrement souhaité...
A+ Blux
"Les cons, ça ose tout. C'est même à ça qu'on les reconnait"
Bonjour Blux,
Merci pour les rens et pour le temps pris pour répondre à mes interrogations.
Ok pour les guillemets et la séparation Insert de into
Dernière question :
si je voulais mettre à jour puis supprimer un enr particulier, je n'aurais pas de pb puisque je le spécifierais dans ma condition (where table.champs="xxx") mais là, je veux faire la manip sur l'enregistrement sur lequel je metrouve dans mon formulaire, la syntaxe est certainement différente ...
A+
Alain
Merci pour les rens et pour le temps pris pour répondre à mes interrogations.
Ok pour les guillemets et la séparation Insert de into
Dernière question :
si je voulais mettre à jour puis supprimer un enr particulier, je n'aurais pas de pb puisque je le spécifierais dans ma condition (where table.champs="xxx") mais là, je veux faire la manip sur l'enregistrement sur lequel je metrouve dans mon formulaire, la syntaxe est certainement différente ...
A+
Alain
Oui, chaque zone dans ton fomulaire a un nom, il suffit de prendre la valeur qui t'intéresse dedans. Explication (par l'exemple) :
- Tu as un fomulaire qui contient des renseignements 'client', comme le nom, le prénom, le numéro de client...
- Le formulaire dans lequel on affiche ces renseignements est nommé 'form1', et les champs (appelés 'contrôles' en VBA) sont respectivement appelés aff_nom, aff_prenom, aff_numcli...
- Il suffit de paramétrer ta requête pour lui dire d'aller chercher la valeur de numéro de client qui est affichée lorsque tu cliques sur le bouton
- C'est une syntaxe particulière : forms.form1.aff_numcli.value, qui veut dire : dans la série des formulaires, je traite celui nommé form1 et je prends la valeur de l'élément aff_numcli qui le constitue.
Mais tu ne pourras pas taper cette syntaxe directement, il faut passer par une chaîne de caractères.
Dans ton bouton, tu rajoutes une ligne DIM StrSql as STRING, puis tu crées le contenu de cette chaîne avant de le passer à RUNSQL :
Ca irait comme ça ? :-)
Attention cependant à ne pas faire référence à une zone non discriminante de ta table, e.g : si tu testes sur prénom client et qu'il a la valeur 'pierre', alors tu supprimeras tous les clients prénommés 'pierre'. Embêtant, non ? ;-)
A+ Blux
- Tu as un fomulaire qui contient des renseignements 'client', comme le nom, le prénom, le numéro de client...
- Le formulaire dans lequel on affiche ces renseignements est nommé 'form1', et les champs (appelés 'contrôles' en VBA) sont respectivement appelés aff_nom, aff_prenom, aff_numcli...
- Il suffit de paramétrer ta requête pour lui dire d'aller chercher la valeur de numéro de client qui est affichée lorsque tu cliques sur le bouton
- C'est une syntaxe particulière : forms.form1.aff_numcli.value, qui veut dire : dans la série des formulaires, je traite celui nommé form1 et je prends la valeur de l'élément aff_numcli qui le constitue.
Mais tu ne pourras pas taper cette syntaxe directement, il faut passer par une chaîne de caractères.
Dans ton bouton, tu rajoutes une ligne DIM StrSql as STRING, puis tu crées le contenu de cette chaîne avant de le passer à RUNSQL :
StrSql = "INSERT INTO .... FROM ... " StrSql = StrSql + " WHERE numcli = " + forms.form1.aff_numcli.value + " ;" DoCmd.runsql StrSql
Ca irait comme ça ? :-)
Attention cependant à ne pas faire référence à une zone non discriminante de ta table, e.g : si tu testes sur prénom client et qu'il a la valeur 'pierre', alors tu supprimeras tous les clients prénommés 'pierre'. Embêtant, non ? ;-)
A+ Blux
"Les cons, ça ose tout. C'est même à ça qu'on les reconnait"
Bonjour Blux,
J'ai bien avancé avec tes renseignements.
C'est exactement ce que je voulais.
La seule chose est que la valeur sur laquelle je fixe mon enregistrement est le nom et qu'il de type texte et la valeur retournée (where...) ne se met pas entre guillemets dans ta variable "StrSql". Ton exemple fonctionne bien en récupérant une valeur numérique.
A+ Alain
J'ai bien avancé avec tes renseignements.
C'est exactement ce que je voulais.
La seule chose est que la valeur sur laquelle je fixe mon enregistrement est le nom et qu'il de type texte et la valeur retournée (where...) ne se met pas entre guillemets dans ta variable "StrSql". Ton exemple fonctionne bien en récupérant une valeur numérique.
A+ Alain
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Merci pour le renseignement.
La proposition de JP me plait également car l'ajout d'un ou deux champs n'alourdira pas ma table étant donné que je n'aurai qu'au maximum une soixantaine d'enr et très peu d'éléments à archiver
Néanmoins, je vais tenter ta solution et me permettrai de te recontacter en cas de blème.
A+ Alain