Access 2002 sous WXP

giess54 Messages postés 13 Statut Membre -  
blux Messages postés 2058 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

  1. blux Messages postés 2058 Date d'inscription   Statut Modérateur Dernière intervention   3 455
     
    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
    1. 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
  2. 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
    1. blux Messages postés 2058 Date d'inscription   Statut Modérateur Dernière intervention   3 455
       
      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
      1. purrofixe Messages postés 490 Date d'inscription   Statut Membre Dernière intervention   95 > blux Messages postés 2058 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
  3. 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
  4. blux Messages postés 2058 Date d'inscription   Statut Modérateur Dernière intervention   3 455
     
    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
    1. 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
    2. blux Messages postés 2058 Date d'inscription   Statut Modérateur Dernière intervention   3 455
       
      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
    3. giess54 Messages postés 13 Statut Membre > blux Messages postés 2058 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
    4. giess54 Messages postés 13 Statut Membre > blux Messages postés 2058 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
    5. blux Messages postés 2058 Date d'inscription   Statut Modérateur Dernière intervention   3 455 > 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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. 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