IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

IHM Discussion :

Utilisation de la fonction update


Sujet :

IHM

  1. #1
    Membre régulier Avatar de Marcopololo
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 288
    Points : 84
    Points
    84
    Par défaut Utilisation de la fonction update
    Bonjour,

    Avant le crash j'avais posé une question concernant le remplacement d'une donnée située dans plusieurs tables par une autre.
    Une personne très sympa (dont j'ai malheureusement oublié le nom m'a transmis le bout de code ci dessous.
    J'ai une petite question concernant la variable db. Il s'agit du nom de la base, si j'ai bien compris, mais la j'ai un bug.
    Les tables étant dans une base liée, est ce le nom de cette table qu'il faut utiliser ?

    Encore merci à tous

    Marcopololo


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     Dim CodeA As Variant            'variable correspondant au code client actuel
        Dim CodeN As Variant            'variable correspondant au nouveau code client
     
    CodeA = CodeClientActuel.Value
    CodeN = CodeClientNouveau.Value
     
    Dim db As Odile_Ext_2008.Database
    Set db = CurrentDb
    db.Execute "Update Observations client Set Code Client=" & CodeN & " Where Code Client=" & CodeA
    db.Execute "Update Liste extincteurs Set Code Client=" & CodeN & " Where Code Client=" & CodeA
    db.Execute "Update Clients Set Code Client=" & CodeN & " Where Code Client=" & CodeA
        Debug.Print "Records Affected = " & db.RecordsAffected
        db.Close

  2. #2
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    N'emploie jamais d'espaces dans les noms de champs, cela, t'obligeras à poser des [ ] ce qui est une contrainte majeure d'une part et sort totalement de la normalisation, d'autre part.

    Ton code doit être alors rédigé ainsi :
    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
    Sub UpdateData()
    Dim CodeA                               As Variant    'variable correspondant au code client actuel
    Dim CodeN                               As Variant    'variable correspondant au nouveau code client
    Dim DB                                  As DAO.Database
     
        CodeA = Me!CodeClientActuel
        CodeN = Me!CodeClientNouveau
     
        Set DB = CurrentDb
        DB.Execute "UPDATE [Observations client] SET [Code Client] =" & CodeN & " WHERE [Code Client]=" & CodeA
        DB.Execute "UPDATE [Liste extincteurs] SET [Code Client] =" & CodeN & " WHERE [Code Client]=" & CodeA
        DB.Execute "UPDATE Clients SET [Code Client] =" & CodeN & " WHERE [Code Client]=" & CodeA
        Debug.Print "Records Affected = " & DB.RecordsAffected
        DB.Close
        Set DB = Nothing
    End Sub
    Par ailleurs, il serait bon de vérifier la non nullité de CodeA et CodeN

    Argy

  3. #3
    Membre régulier Avatar de Marcopololo
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 288
    Points : 84
    Points
    84
    Par défaut
    Merci Argyronet.

    Pour le contrôle de nullité j'utilise nz ?
    Et pour la variable DAO il s'agit de la base ouverte ou de tout autre chose ?

    MArcopololo


    Pour DAO j'ai trouvé; il faut rajouter la référence Microsoft 3.6 dans la liste des références VBA. Et ca fonctionne

  4. #4
    Membre régulier Avatar de Marcopololo
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 288
    Points : 84
    Points
    84
    Par défaut
    J'ai crié victoire trop vite.

    Le remplacement fonctionne mais si je sélectionne un N° client autre que le premier de la liste.

    Le remplacement du client sélectionné se passe bien, mais :

    Si je remplace 25 par 26
    alors le N° juste avant (par ex 20 devient 25 tut en gardant les données des 2 autres tables avec 20.

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    Private Sub Remplacer_Click()
     
    Dim CodeA                               As Variant      'variable correspondant au code client actuel
    Dim CodeN                               As Variant      'variable correspondant au nouveau code client
    Dim DB                                  As DAO.Database 'Référence Microsoft DAO 3.6 à valider dans liste de sréférences
     
        CodeA = Me!CodeClientActuel     'Zone de liste code client actuel
        CodeN = Me!CodeClientNouveau    'Zone de texte nouveau code client
     
     
            Me.NomParCode = DLookup("NomEntreprise", "Clients", "[Code Client]=" & Me.CodeClientActuel)
              'zone de texte        champ requête    nom table            nom champ requête comparé     nom champ liste
     
     
        Set DB = CurrentDb
     
        'Remplace le code client actuel dans la table observations client
        DB.Execute "UPDATE [Observations client] SET [Code Client] =" & CodeN & " WHERE [Code Client]=" & CodeA
        'Remplace le code client actuel dans la table liste extincteurs
        DB.Execute "UPDATE[Liste extincteurs] SET [Code Client] =" & CodeN & " WHERE [Code Client]=" & CodeA
        'Remplace le code client actuel dans la table clients
        DB.Execute "UPDATE Clients SET [Code Client] =" & CodeN & " WHERE [Code Client]=" & CodeA
        Debug.Print "Records Affected = " & DB.RecordsAffected
        DB.Close
        Set DB = Nothing
     
     
        DoCmd.Close acForm, Me.Name
        DoCmd.OpenForm ("Info modif code"), acNormal
     
    End Sub
    MArcopololo

  5. #5
    Membre régulier Avatar de Marcopololo
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 288
    Points : 84
    Points
    84
    Par défaut
    Bonjour,

    J'ai fait d'autres essais.
    Il s'avère que mon code update ne fait pas qu'un remplacement du champ client dans les tables il prend aussi le premier code de ma zone de liste (qui apparait à l'ouverture du formulaire) et mais l'ancien code du client modifié :

    Code apparaissant dans zone de liste à l'ouverture formulaire = 20 (premier de la liste)

    Code choisi dans la liste = 200
    Nouveau code = 250
    Alors tous les champs des tables de 200 deviennent 250

    Mais champ de la table clients (uniquement) de 20 devient 200.


    Faut il actualiser la zone de liste ?

    Merci d'avance de votre aide.

    Marcopololo


    Je viens de faire un nouveau test :

    Si le nouveau N° est inférieur à l'ancien N° alors tout se passe bien j'ai juste une boite d'alerte de conflit d'écriture. Je fais annulé et tout est OK.


    Concernant le conflit d'écriture, j'ai réglé le problème avec un


  6. #6
    Membre régulier Avatar de Marcopololo
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 288
    Points : 84
    Points
    84
    Par défaut
    Je reviens à la charge, parce que là je sèche.

    J'ai fait tout une batterie de test et c'est la première ligne (sur la table Clients) qu'il y a un problème.
    Pour les 2 autres lignes update pas de problème..
    Alors je remet le code.
    En plus la fonction Me.refresh ne fonctionne qui si le code sélectionné est le premier de la liste. Sinon il y a un bug.


    Code sql : 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    Dim CodeA                               As Variant      'variable correspondant au code client actuel
    Dim CodeN                               As Variant      'variable correspondant au nouveau code client
    Dim DB                                  As DAO.Database 'Référence Microsoft DAO 3.6 à valider dans liste de sréférences
     
        CodeA = Me!CodeClientActuel     'Zone de liste code client actuel
        CodeN = Me!CodeClientNouveau    'Zone de texte nouveau code client
     
     
            Me.NomParCode = DLookup("NomEntreprise", "Clients", "[Code Client]=" & Me.CodeClientActuel)
              'zone de texte        champ requête    nom table            nom champ requête comparé     nom champ liste
     
     
        Set DB = CurrentDb
              'Me.Refresh
              Me.Repaint
        'Remplace le code client actuel dans la table clients
        DB.Execute "UPDATE [Clients] SET [Code Client] =" & CodeN & " WHERE [Code Client]=" & CodeA
        'Remplace le code client actuel dans la table observations client
        DB.Execute "UPDATE [Observations client] SET [Code Client] =" & CodeN & " WHERE [Code Client]=" & CodeA
        'Remplace le code client actuel dans la table liste extincteurs
        DB.Execute "UPDATE[Liste extincteurs] SET [Code Client] =" & CodeN & " WHERE [Code Client]=" & CodeA
    
        Debug.Print "Records Affected = " & DB.RecordsAffected
        DB.Close
        Set DB = Nothing
    
            
            DoCmd.Close acForm, Me.Name
            DoCmd.OpenForm ("Info modif code"), acNormal

    Merci d'avance

    Marcopololo

  7. #7
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    C'est normal car lors de ton UPDATE, il n'ya que la base de données qui est affectée et pas ton formulaire, enfin dans l'absolu, il n'est pas encore au courant puisqu'il est déjà chargé...

    Donc il faut effectivement le rafraîchir.

    Pour cela, tu forces sa propriété RecordSource par le biais de l'événement Current() par exemple ou sur un événement de ton choix.

    Argy

  8. #8
    Membre régulier Avatar de Marcopololo
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 288
    Points : 84
    Points
    84
    Par défaut
    Je commence à comprendre.
    J'ai essayé le code en utilisant non pas une zone de liste mais un champ texte et là tout fonctionne.
    Il faut donc que j'utilise recordsource sur la zone de liste pour la mettre à jour ?

    Encore merci Argyronet

    J'ai mis dans la propriété source du formulaire la requête suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Clients.[Code Client], Clients.NomEntreprise FROM Clients;
    Mais cela ne donne rien de mieux

  9. #9
    Membre régulier Avatar de Marcopololo
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 288
    Points : 84
    Points
    84
    Par défaut
    Bonjour,

    La mise en place d'une requête sur la source ne fonctionnant pas j'ai mis le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Form_Current()          'Rafraichi la zone de liste sur activation du formulaire
     
            Forms![Remplacement Code Client].RecordSource = "SELECT [Code Client] FROM Clients"
    End Sub
    Remplacement Code Client étant le nom de mon formulaire, Code Client le nom du champ de la table et Clients le nom de ma table.
    Cela ne fonctionne pas mieux toujours le problème de décalage. Faut il mettre une condition supplémentaire pour inclure le nom de la zone de liste ?

    Merci d'avance

    Marcopololo

  10. #10
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    Dans le formulaire lui-même, tu écris simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Me.RecordSource="SELECT Clients.[Code Client], _
    Clients.NomEntreprise FROM Clients;"
    Argy

  11. #11
    Membre régulier Avatar de Marcopololo
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 288
    Points : 84
    Points
    84
    Par défaut
    Ca ne fonctionne pas,

    J'ai essayé de mettre le bout de code de Argyronet, mais dès que je prend un code différent du premier de la liste, il y a bug, quel que soit la condition que j'utilise (sur ouverture...)

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Set DB = CurrentDb
                Me.Repaint
                Me.RecordSource = "SELECT Clients.[Code Client], Clients.NomEntreprise FROM Clients;"
        'Remplace le code client actuel dans la table clients
        DB.Execute "UPDATE [Clients] SET [Code Client] =" & CodeN & " WHERE [Code Client]=" & CodeA
        'Remplace le code client actuel dans la table observations client
        DB.Execute "UPDATE [Observations client] SET [Code Client] =" & CodeN & " WHERE [Code Client]=" & CodeA
        'Remplace le code client actuel dans la table liste extincteurs
        DB.Execute "UPDATE[Liste extincteurs] SET [Code Client] =" & CodeN & " WHERE [Code Client]=" & CodeA
     
        Debug.Print "Records Affected = " & DB.RecordsAffected
        DB.Close
        Set DB = Nothing

    Je n'arrive pas à actualiser et le remplacement ne se fait toujours pas correctement sur la table clients.

    Merci d'avance

    Marcopololo

  12. #12
    Membre régulier Avatar de Marcopololo
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 288
    Points : 84
    Points
    84
    Par défaut
    Au lieu d'utiliser un recordsource j'ai utilisé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim Rst                                 As DAO.Recordset
    Set Rst = Me.Recordset
    Et je n'ai plus le message qui m'indique un conflit d'écriture.
    Par contre toujours mon problème d'update sur le champ clients qui l'inverse avec un autre champ.

    Je mets la base test au cas où.

    Merci d'avance

    MArcopololo

  13. #13
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    Il serait judicieux d'expliquer ce que tu veux faire au juste car, fournir ta BDD n'est pas une solution : cela m'étonnerais que quelqu'un plonge dedans considérant que tu ne spécifies pas ce que tu souhaites faire.

    Par exemple :
    J'ouvre un formulaire mais avant, je veux effectuer un UPDATE des Tables suivantes [].....;
    Mon formulaire est basé sur la requête TRUC et je souhaiterais que le champ MACHIN contienne la valeur BIDULE etc...


    Là, j'ai le sentiment d'un égarement profond où la solution finale ne sera pas forcément la meilleure.

    Argy

  14. #14
    Membre régulier Avatar de Marcopololo
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 288
    Points : 84
    Points
    84
    Par défaut
    C'est vrai qu'à force je m'égare un peu en cherchant des solutions dans tous les sens. Désolé.

    Alors je vais réexpliquer :

    Dans ma base j'ai un formulaire Remplacement Code client qui doit me permettre en sélectionnant un Code client existant dans une zone de liste, de remplacer son code par celui saisi dans une zone texte du formulaire.
    Lorsque je clique su Remplacer cela devrait mettre le nouveau code à la place de l'ancien et ceci dans 3 tables différentes.

    Problème actuel :

    Lorsque je choisi le premier Code Client de la zone de liste et que je lui donne un code <= au code suivant tout fonctionne.

    Si le code choisi n'est pas le premier les 2 tables annexes sont bien mises à jour mais dans la table principale (clients) le premier client de liste (que je ne change pas) prend l'ancien code du client modifié.

    J'ai fait un autre test et si je ne prend pas de zone de liste pour choisir le code à modifier cela fonctionne. Donc je suppose que le problème vient de ma zone de liste.

    Et malheureusement je bataille depuis plusieurs jours.

    Alors encore merci à ceux qui ont le courage de me lire.

    Marcopololo

  15. #15
    Membre régulier Avatar de Marcopololo
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 288
    Points : 84
    Points
    84
    Par défaut
    Bonsoir à tous,

    J'ai enfin trouvé la solution.

    Comme c'était ma zone de liste qui me posait problème. J'ai créé une requête lié à mon formulaire. Comme cela je ne passe plus directement par les tables pour afficher le code client.

    Et hop le tour est joué. Dur dur, mais c'est en forgeant que l'on devient forgeron.

    Marcopololo

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation de la fonction REPLACE dans un UPDATE
    Par vincent_cda dans le forum SQL
    Réponses: 5
    Dernier message: 16/08/2011, 13h29
  2. Réponses: 5
    Dernier message: 28/01/2007, 13h50
  3. Utilisation de la fonction qsort
    Par Jsmeline dans le forum C
    Réponses: 8
    Dernier message: 28/01/2005, 12h40
  4. [LG]librairies : utiliser seulement quelques fonctions
    Par wwwroom dans le forum Langage
    Réponses: 13
    Dernier message: 14/05/2004, 22h50
  5. [Update TQuery]Lenteur de la fonction Update
    Par Eric SAULNIER dans le forum Bases de données
    Réponses: 2
    Dernier message: 11/05/2004, 01h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo