Access et requete de mise a jour

Fermé
ppqx Messages postés 6 Date d'inscription dimanche 11 novembre 2007 Statut Membre Dernière intervention 4 décembre 2007 - 11 nov. 2007 à 15:47
brunotours Messages postés 4 Date d'inscription vendredi 23 janvier 2009 Statut Membre Dernière intervention 6 décembre 2018 - 16 mars 2011 à 12:26
Bonjour,

Voilà mon problème : Je cherche à créer une requête qui me permette de mettre à jour les champs d'une table MAIS à la condition que dans mon formulaire, les zone destinées à mettre à jour la table com:prennent une chaine de texte. En résumé, certaines zones de texte de mon formulaire seront remplies et je souhaite que ma requête ne mette à jour (à l'aide d'un seul bouton "valider modifications") que les champs concernés.

Mon formulaire est en fait un formulaire de modification de fiche "Client" (coordonnées, profil, etc.).

Lorsque j'ouvre mon formulaire, une table temporaire est créée. Celle-ci regroupe les champs de ma table principale (Table Clients). J'ai souhaité créer cette table temporaire afin d'éviter les messages d'erreur du type "La Base Client est déjà utilisée par un autre utilisateur ou un application" (lorsque j'exécute une requête de mise à jour, et même si je suis en mode partagé). Ces données temporaires, qui s'affichent dans mon formulaire, sont uniquement destinées à la consultation (pour me permettre de connaître les éléments à modifier, etc.).

Puis, sur mon formulaire, se trouvent différentes zones de texte destinées à apporter les futures modifications (comme "Nouveau Nom Client", "Nouveau prénom client", "Nouvelle adresse client", etc.).

Enfin, mon formulaire comprend un bouton "VALIDER LES MODIFICATIONS". Et c'est là que commence mon problème ! Je n'arrive pas à trouver la solution pour que, lorsque je clic sur le bouton VALIDER, seuls les éléments comprenant une chaîne de texte soient mis à jour dans ma BASE CLIENTS (et non pas dans ma table temporaire).

Qui peut donc m'apporter la solution à ce problème qui me prend un temps monstre !

Merci à l'avance à vous autres,

Bien cordialement,

Patrice
A voir également:

6 réponses

PBGunner Messages postés 64 Date d'inscription mercredi 17 octobre 2007 Statut Membre Dernière intervention 29 juillet 2008 64
12 nov. 2007 à 13:13
Salut!
Ta requete finale est-elle déja créer, ou la crées tu lors du clic sur le bouton VALIDER?
Pour moi, il n 'y a pas de problème majeur a réimporter ce type de donnée... Par contre, il y au moins 2 possibilitées:
1)Soit tu crées une requête mise a jour 'en dur' (j'entend par là qu'elle existe comme un objet de la base de données et qu'elle est accessible depuis la rubrique 'Requetes'. Dans cette requêtes tu ne mets que les champs de type 'texte' et tu les importes tous lorsque tu clic ton bouton VALIDER. A mon avis c'est la solution la plus simple et la plus rapide a mettre en place, mais elle offre peu de souplesse car elle importera systématiquement toutes les données qu'elle contient

2) soit tu crées une requete au moment du clic sur VALIDER sous VBA au format SQL. C'est plus complexe mais ca te donne plus de souplesse car tu peux améliorer ton script pour ne prendre par exemple que les enregistrements (ou les champs d'enregistrement) qui ont réellement été modifiés...
Pour cela, il te faudra utiliser les commandes:
Dim chSQL as String 'variable qui va te permettre de stocker ta ligne SQL
    Set db = CurrentDb()
       chSQL = "UPDATE [ici tu mets ta requete SQL avec les champs qui t'interesse]..." 
    Set MyQuery= db.OpenRecordset(chSQL, dbOpenSnapshot) 'Creation de la requete

Les différents champs de ta requetes seront accessibles par la fonction
MyQuery(i)
de type Field, i étant le numéro du champs.
Si mes souvenirs sont justes, par exemple, pour obtenir le type de données dans le champs 1 utilise le code suivant
 MsgBox MyQuery(1).Type


Si tu ne maitrise pas le SQL, je te conseille vivement de créer ta requête via l'interface 'Nouvelle requetes' d'Access, puis de passer l'affichage en mode SQL. Il ne te reste plus qu'a mettre des variables où tu veux dans ton code VB...
a+
3
brunotours Messages postés 4 Date d'inscription vendredi 23 janvier 2009 Statut Membre Dernière intervention 6 décembre 2018
16 mars 2011 à 12:26
Bonjour ,J'ai essayé d'utiliser votre code acces pour recupérer une valeur calculé via une requette qui a une formule intégrée. le problème est qu'avec les codes "db" et "MyQuery" et un message qui m'indique que les variables ne sont pas déclarées. quand je les déclares,
J'ai un message en anglais "Too few parameters. expended 2"
Pourriez vous m'aider?

Voici le code VBA utilisé:
Dim db
Dim MyQuery
Dim chSQL As String 'variable qui va te permettre de stocker ta ligne SQL
Set db = CurrentDb()
chSQL = "SELECT [Code outil].[id code outil], [Code outil]![Quantitée(s)]-[Forms]![recherche outil]![Qté_emprunte] AS qte_calculé FROM [Code outil]WHERE ((([Code outil].[id code outil])=Str([Forms]![recherche outil]![Affichage Recherche Code outil iso].[Form]![id code outil])));"
Set MyQuery = db.OpenRecordset(chSQL, dbOpenSnapshot) 'Creation de la requete

MsgBox MyQuery(2).Type
0
ppqx Messages postés 6 Date d'inscription dimanche 11 novembre 2007 Statut Membre Dernière intervention 4 décembre 2007
12 nov. 2007 à 15:09
Salut PBGunner,

Merci beaucoup pour ta réponse. CEPENDANT, je ne maîtrise absolument pas le SQL ni le code VBA. Donc, là, je m'engage dans du flou total.

Si j'utilise ta première solution "en dur", cela veut donc dire que je dois saisir à chaque fois tous les champs. Et ceci afin d'éviter que ma mise à jour prenne en compte en compte les champs vide de mon formulaire (pour lesquels je n'ai pas apporté de modification). Hors, je souhaiterais que le bouton VALIDER, sur clic, ne mette à jour que les champs qui sont subi une modification sur mon formulaire.

Pour la deuxième solution, flou total, je ne connais rien au langage VBA et SQL. Je ne sais même pas où écrire le code ou le coller. Je ne sais même pas comment procéder.

Où puis-je trouver d'ailleurs des infos sur le langage VBA et les rquêtes SQL ?

Merci de ta réponse,

Bien cordialement,

Patrice
0
PBGunner Messages postés 64 Date d'inscription mercredi 17 octobre 2007 Statut Membre Dernière intervention 29 juillet 2008 64
12 nov. 2007 à 22:41
salut,
Donc ca n'est pas simple. Comment lance tu la mise a jour depuis le bouton VALIDER? C'est l'assitant formulaire qui t'a créé la macro correspondante? Je n'avais pas tout a fait saisi ce que tu entendais par 'chaine de texte'. En fait tu voulais dire un champs pour lequel tu as rempli une information.

Abandonnons pour le moment la seconde solution.

Puis-je savoir quels sont les champs de ta table temporaire? L'exemple sera plus compréhensible avec le nom de tes champs...
0
Salut,

Merci de l'intérêt que tu portes à ma demande.

Réponse à ta première question : c'est moi qui est créé la macro pour le bouton VALIDER. En fait, j'avais une requête de mise à jour pour chaque champs. La macro "VALIDER MODIFICATION CLIENT" comprenait une action "ouvrir requête" pour chacune de celles-ci. L'exécution de la requête devait théoriquement se faire selon la condition [Est pas Null] ou encore [Est pas ""] (si chaine pas vide ?). Mais ça ne fonctionne pas. Si une modification est effectuée à partir d'une requête, et qu'une deuxième doit être effectuée, ACCESS bloque l'action en indiquant que "La BASE CLIENT est déjà utilisée par un autre utilisateur ou ...". Pourtant, je suis en mode partagé.

Donc j'ai ensuite essayé, au niveau de la macro, les opérations suivantes pour l'exécution de chaque requête : 1 - Ouvrir requête sous condition / 2 - Fermer Requête après exécution (dans l'objectif de libérer la table BASE CLIENT pour permettre l'exécution des autres si les conditions sont remplies). MAIS, ça ne marche toujours pas.

LE PROBLEME EST ESSENTIELLEMENT LE SUIVANT : Soit j'essaye avec une macro et au quel cas, les requêtes ne peuvent toutes s'exécuter. Soit j'essaye de faire une requête pour l'ensemble des modifications à mettre à jour dans la base CLIENT, mais avec des mises à jour sous condition (si le champ a été modifié).

J'ai rencontré également le cas de figure : ma requête met à jour même les champs auxquels je n'ai pas apporté de modifications. Et donc, elle remplace les données de la Table CLIENT par un champ vide.

Alors voici comment est organisé mon formulaire :

Une table temporaire est créée à l'ouverture du formulaire (macro du bouton OUVRIR BASE DE CONSULTATION CLIENT du formulaire d'accueil de mon application). Cette table est destinée à la consultation des informations sur le client. Une requête de sélection affiche les informations du client sélectionné dans différents petits cadre (selon leur thème).

En bas du formulaire se trouvent les champs destinés à apporter les éventuelles modifications de la fiche client. Un bouton de commande "VALIDER LES MODIFICATIONS" doit permettre de valider les modifications apportées (nouvelle adresse, etc.). DONC mettre à jour seulement les champs pour lesquels les modifications ont été apportées.

Voici les champs à mettre à jour si ils comportent des modifications :

Champs de la table CLIENT

NOM CLIENT
PRENOM CLIENT
ADRESSE CLIENT
CODE POSTAL
VILLE

Les noms des champs du formulaire dans lesquels on apporte des modifications :

NOUV NOM CLIENT
NOUV PRENOM CLIENT
NOUV ADRESSE CLIENT
NOUV CODE POSTAL CLIENT
NOUV VILLE CLIENT

Voilà,

En attendant de tes nouvelles ...

Merci à toi,

Patrice
0

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

Posez votre question
PBGunner Messages postés 64 Date d'inscription mercredi 17 octobre 2007 Statut Membre Dernière intervention 29 juillet 2008 64
13 nov. 2007 à 13:15
Salut,
Peux tu m'envoyer ton adresse mail en message privé afin que je puisse te donner la mienne, pour que tu m'envois ta base...
Je ne pense pas que le problème soit compliqué a résoudre, mais j'ai besoin de regarder un peu plus dans le détail la structure de ta base.
0
PBGunner Messages postés 64 Date d'inscription mercredi 17 octobre 2007 Statut Membre Dernière intervention 29 juillet 2008 64
22 nov. 2007 à 12:55
Salut!

Désolé, je n'ai pas pu m'occuper de ta base avant aujourd'hui car j'ai du effectuer un déplacement a l'étranger...
J'ai trouvé l'erreur!
Dans ta macro "VALIDER MODIF FICHE CLIENT" la syntaxe de la condition n'est pas bonne. Remplace "=Pas Null" par "Est Pas Null" et le tour est joué!

a+
0