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   -
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

5 réponses

blux Messages postés 27842 Date d'inscription   Statut Modérateur Dernière intervention   3 364
 
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.
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"
0
giess54 Messages postés 13 Statut Membre
 
Salut,
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
0
purrofixe Messages postés 490 Date d'inscription   Statut Membre Dernière intervention   95
 
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
0
blux Messages postés 27842 Date d'inscription   Statut Modérateur Dernière intervention   3 364
 
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
 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"
0
purrofixe Messages postés 490 Date d'inscription   Statut Membre Dernière intervention   95 > blux Messages postés 27842 Date d'inscription   Statut Modérateur Dernière intervention  
 
Bonjour,
Merci pour l'information
En effet en passant par 2 requêtes cela semble plus efficace et de plus nous avons 2 Tables biens distinctes.
Bonne semaine.
Jean-Pierre
0
giess54 Messages postés 13 Statut Membre
 
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
0
blux Messages postés 27842 Date d'inscription   Statut Modérateur Dernière intervention   3 364
 
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
 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"
0
giess54 Messages postés 13 Statut Membre
 
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
0
blux Messages postés 27842 Date d'inscription   Statut Modérateur Dernière intervention   3 364
 
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 :
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"
0
giess54 Messages postés 13 Statut Membre > blux Messages postés 27842 Date d'inscription   Statut Modérateur Dernière intervention  
 
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
0
giess54 Messages postés 13 Statut Membre > blux Messages postés 27842 Date d'inscription   Statut Modérateur Dernière intervention  
 
J'ai trouvé la solution à mon pb de guillemets.
Je continue mon projet et te demanderai peut-être d'autres rens
Merci pour tout.
Alain
0
blux Messages postés 27842 Date d'inscription   Statut Modérateur Dernière intervention   3 364 > giess54 Messages postés 13 Statut Membre
 
J'attendais la remarque ! :-)

Tu dois donc mettre des apostrophes comme délimiteur de chaine (attention cependant si ta chaine en contient déjà !)
StrSql = StrSql + " WHERE numcli = '" + forms.form1.aff_numcli.value + "' ;"

A+ Blux
 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
purrofixe Messages postés 490 Date d'inscription   Statut Membre Dernière intervention   95
 
Bonjour,
Je vous propose de rechercher dans l'aide sur MS Visual Basic la fonction "Runsql" cela vous aidera certainement.
Atteindre MSVB: "Outils/Macro/Visual Basic Editor" ensuite dans la fenêtre drecherche taper "runsql" puis valider
Salutations
Jean-Pierre
0