Flux rss
Collection CommentCaMarche.net
Rechercher : dans
Par : Pertinence Date Nom d'utilisateur
Statut : Non résolu

Exuter une requête dans un formulaire access

superbatto, le jeudi 13 mars 2008 à 14:18:13
Bonjour à tous !

J'aurais besoin d'un petit coup de main, je suis sur un projet Access nécéssitant la création d'un formulaire. Je débute un peu et me trouve déjà confronté à un problème:

Je dispose d'une table contenant en colonne : type de produit, année de souscription, année de résiliation, nombre de contrats.
Chaque ligne contient donc le nombre de contrats selon les 3 autres caractéristiques.

Le but est de pouvoir gérer la base de données par formulaire, et donc de la mettre à jour lors de l'ajout de nouveaux contrats.

Le problème étant, pour ajouter un contrat, il faut vérifier si la ligne existe déjà ou pas ( si oui, augmenter le nombre de contrats, sinon non, créer la ligne correspondante).

J'ai une requête mise à jour et une requête ajout pour chacun des cas, ainsi qu'une requête affichage qui m'affiche la ligne existante si elle existe, et qui affiche une table vide sinon.

J'aimerais, lorsque je clique sur le bouton du formulaire, qu'Access lance la requête affichage (facile), puis qu'il vérifie si le tableau affiché est vide ou non (si oui, lancer la requête ajout de ligne, si non, augmenter le nombre de contrats de la ligne existante).

Bêtement, j'écris:

Dim requeteaffichage As String
requeteaffichage = "AfficheLigneSiElleExisteDeja"
Dim requeteajout As String
requeteajout = "ajoutligne"
Dim MAJ As String
MAJ = "requeteMAJ"

If requeteaffichage.dtt.Rows.Count > 0 Then DoCmd.OpenQuery MAJ, acNormal, acEdit
else DoCmd.OpenQuery requeteajout, acNormal, acEdit

Mais.. comme vous vous en doutez, ça ne marche pas..

Si vous pouvez m'aider, je vous serais bien reconnaissant !

Cordialement,

Yves
Configuration: Windows XP
Firefox 1.0.4
Répondre à superbatto  Signaler ce message aux modérateurs Aller au dernier message

1


  • 1
    Ce message vous semble utile, votez !
  • Ce message ne vous semble pas utile, votez !
  • Signaler ce message aux modérateurs
Le Pingou, le jeudi 13 mars 2008 à 16:30:52
Bonjour,
C'est pas simple.... je résume se que je comprend:
Un table avec champs : type de produit, année de souscription, année de résiliation, nombre de contrats !

Qestion: pourquoi nombre de contrats ? ......

Si vous ajoutez un nouveau contrat qu'elles sont les champs qui doivent être différents ??

Par principe on va ouvrir le formulaire pour ajouter un contrat et à se niveau on contrôle si oui ou non ?

Salutations.
Jean-Pierre
Répondre à Le Pingou

2


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
superbatto, le jeudi 13 mars 2008 à 17:36:36
Bonjour,

Merci de votre attention.

C'est plutôt simple:
imaginons qu'il y ait 2 types de produits, le produit A et le produit B.
Si j'ai 3 contrats de type A (dans mon portefeuille ie dans ma table) qui ont été souscrits en 2002 et résiliés en 2005, j'aurai 3 dans la case "nombre de contrats" de la ligne correspondante. C'est pour éviter d'avoir une ligne par contrat (et donc d'avoir des tonnes de lignes !)

Mettons que je veuille ajouter un contrat qui répond à ces même caractéristiques, je vais alors simplement passer le nombre de contrat à 4. Si par contre je veux ajouter un contrat A souscrit égalemment en 2002, mais résilié en 2006, et que mon portefeuille n'en contient aucun pour le moment , alors il n'y a aucune ligne dans ma table qui réponde à ces caractéristiques, et il faudra l'ajouter.

Alors effectivement on pourrait à chaque ajout de contrat vérifier si la ligne existe déjà, mais j'aimerais justement qu'on n'ait pas besoin de le faire :-)
Répondre à superbatto

5


  • 1
    Ce message vous semble utile, votez !
  • Ce message ne vous semble pas utile, votez !
  • Signaler ce message aux modérateurs
fmvgld, le jeudi 13 mars 2008 à 18:40:10
salut
quel version d'access
sur la 2000 tu peut ecrire ceci
If requeteaffichage.recordcount> 0 Then DoCmd.OpenQuery MAJ, acNormal, acEdit
else DoCmd.OpenQuery requeteajout, acNormal, acEdit

le test requeteaffichage.recordcount va teconter le nombre d'enregistrement présent dans tas requete
Répondre à fmvgld

3


  • 1
    Ce message vous semble utile, votez !
  • Ce message ne vous semble pas utile, votez !
  • Signaler ce message aux modérateurs
Le Pingou, le jeudi 13 mars 2008 à 18:30:40
Bonsoir,
Si je vous comprends bien le contrôle se fait sur le type date souscription et date résiliation.
Je pense qu'il est mieux pour vous de réaliser cela avec le tableur Excel, on dirait que c'est de la statistique ou je me trompe.
Dans le cas ou vous désirez absolument passer par Access il faut créer un formulaire indépendant de la table ou vous entrez les valeurs pour les 3 champs : type de produit, année de souscription, année de résiliation et créer un code qui va prendre ces 3 valeurs et les comparer à votre table. le résultat de la comparaison vous donneras soit vers nouvel enregistrment soit augmentation du nombre de contrats.

Salutations.
Jean-Pierre
Répondre à Le Pingou

4


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
superbatto, le jeudi 13 mars 2008 à 18:35:21
Exactement ce que je veux faire (et je suis obligé d'utiliser Access ) !

C'est dans le code que j'ai des soucis justement, je n'arrive pas à mettre une condition sur l'exécution d'une requete ou d'une autre lors du clic sur le bouton du formulaire.

J'ai déjà une requête pour tester si la ligne existe ou s'il faut l'ajouter, mais je n'arriver pas à coder tout ca.. (cf mon premier message où j'ai détaillé :-) )

Merci !
Répondre à superbatto

6


  • 1
    Ce message vous semble utile, votez !
  • Ce message ne vous semble pas utile, votez !
  • Signaler ce message aux modérateurs
Le Pingou, le jeudi 13 mars 2008 à 18:59:22
Bonsoir,
Pouvez-vous mettre une copie de votre base sur http://www.cjoint.com/ se sera plus simple !

Salutations.
Jean-Pierre
Répondre à Le Pingou

7


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
superbatto, le jeudi 13 mars 2008 à 19:43:06
Ma base de données dépasse 500 ko je ne peux pas la mettre sur cjoint.. :(

Alors que pour l'instant elle ne contient pas grand chose !

Le formulaire est quasi vide, il ne s'agit que d'une maquette.

J'ai cependant un autre problème (si vous les jugez débile, ce qui est probable vu mon niveau en access / vba, n'hésitez pas à me dire de trouver tout seul !)

J'ai une table Choix qui contiendra les données remplies dans le formulaire, et je n'arrive pas à lier les zones de texte du formulaire avec les champs de la table Choix, pour que ces dernières se remplissent automatiquement lorsque l'on rempli le formulaire ! Ca doit être pourtant simple..

Mais là n'est pas le vrai problème:
le principe est que la table choix soit remplie justement avec le nouveau contrat que l'ont veut ajouter.
Ma requete VérificationPrésence vérifie si la table des contrats contient déjà une ligne similaire à celle de la table Choix.
Si oui, au augmente le nombre de contrats, si non, on crée une ligne.

La syntaxe que tu me proposes (fmvgld) ne marche malheureusement pas, j'ai le message d'erreur INVALID QUALIFIER si lje tape
"If Vérif.RecordCount = 0 Then DoCmd.OpenQuery ajout, acNormal, acEdit"

J'espère que je ne vous assomme pas avec la longueur de mes posts !
Répondre à superbatto

8


  • 1
    Ce message vous semble utile, votez !
  • Ce message ne vous semble pas utile, votez !
  • Signaler ce message aux modérateurs
Le Pingou, le jeudi 13 mars 2008 à 20:23:42
Bonsoir,
oui je vous comprend, essayez de compacter votre base de données, pour cela vous l'ouvrer et sur Outils / Utilitaires de la base de données et clic sur Compacter un base de données .....
La taille va diminuer et il vous sera possible de l'envoyer......

Ou passer par la concurence http://www.cijoint.fr/

Salutations.
Jean-Pierre
Répondre à Le Pingou

9


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
superbatto, le jeudi 13 mars 2008 à 20:27:16
Bonjour !

Merci pour cette astuce:
La base de données est là:
http://cjoint.com/data/dnuAQs1qmV.htm

Cordialement,
Répondre à superbatto

10


  • 1
    Ce message vous semble utile, votez !
  • Ce message ne vous semble pas utile, votez !
  • Signaler ce message aux modérateurs
fmvgld, le jeudi 13 mars 2008 à 20:44:45
Dim Vérif, mabd
Set mabd = DBEngine.Workspaces(0).Databases(0)
Set Vérif = mabd.openrecordset("Vérification Présence")

ajout = "Ajoute Ligne Dans AutreSortie"


If Vérif.RecordCount = 0 Then DoCmd.OpenQuery ajout, acNormal, acEdit
Répondre à fmvgld

11


  • 1
    Ce message vous semble utile, votez !
  • Ce message ne vous semble pas utile, votez !
  • Signaler ce message aux modérateurs
Le Pingou, le jeudi 13 mars 2008 à 20:46:52
Bonsoir,
OK j'ai téléchargé votre base.
Pouvez-vous me préciser quelle est la table et la requete à prendre en compte..!
Merci.
Salutations.
Jean-Pierre
Répondre à Le Pingou

12


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
superbatto, le jeudi 13 mars 2008 à 20:52:19
Il s'agit dans notre exemple de l'ajout dun contrat dans la table AUTRE SORTIE
Les données seront rentrées dans la table CHOIX à l'aide du formulaire.
La requete VERIFICATION PRESENCE affiche une table contenant la ligne si des contrats contenant le meme produit, la meme année de souscription et la meme année de résiliation existent déjà dans la table AUTRE SORTIE, et est vide sinon.

Il faut donc effectuer le test sur cette requete VERIFICATION PRESENCE, si elle est vide, ajouter la ligne grace à la requete "ajout ligne dans autre sortie", sinon augmenter le nombre de contrat de la ligne existante avec une requete que je n'ai pas encore crée. :)
Répondre à superbatto

13


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
superbatto, le jeudi 13 mars 2008 à 21:04:20
Bonsoir fmgvld,

Le code a l'air de marcher !
Il m'a bien ajouté la ligne dans AUTRE SORTIE puisqu'elle n'existait pas.

Si vous acceptez toujours de continuer à m'aider, je bloque sur l'autre requête, à savoir celle qui augmente le nombre de contrats de la ligne si elle existe déjà (le then..)
Pas évident pour moi, car il faut ajouter le nombre de contrats figurant dans la ligne de la table CHOIX à la ligne correspondante de la table AUTRE SORTIE trouvée par la requête vérification présence..

Je n'ai absolument aucune idée de comment faire cela !
Répondre à superbatto

15


  • 1
    Ce message vous semble utile, votez !
  • Ce message ne vous semble pas utile, votez !
  • Signaler ce message aux modérateurs
fmvgld, le jeudi 13 mars 2008 à 21:16:41
explique moi un peu plus precisement quel valeur tu veut ajouter et dans quoi (pb de comprehension)
je pense qu'il va falloir passer par la creation de sql via vba
Répondre à fmvgld

16


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
superbatto, le jeudi 13 mars 2008 à 21:27:29
Alors en gros:

Tous mes contrats qui sont dans l'état (il y a 4 états) AUTRE SORTIE figurent dans la table "autre sortie"

Dans la table Choix, figure un contrat que l'on veut ajouter (via le formulaire)
Quand on rempli le formulaire avec les données du contrat à ajouter, elles vont automatiquement dans la table choix (ce que je n'arrive pas non plus à faire au passage)

Il faut ensuite comparer les tables choix et autre sortie, car en effet dans la table choix on n'a pas une ligne par contrat, mais une ligne pour tous les contrats qui ont le meme produit, la meme année de souscription, la meme année de naissance et la meme année de sortie.
Deux cas possibles :

Il y a déjà des contrats qui ont les caractéristiques (les 3 années et le types de produit) identiques à celles du ou des contrat que l'on veut ajouter. Dans ce cas, il faut augmenter (dans la table autre sortie) le nombre de contrats dans la case qui existe déjà (s'il y en avait 4 et qu'on en ajoute 3, il faut modifier le 4 par un 7).

Il n'y a pas de contrat qui ont ces caractéristiques, et il faut ajouter une ligne, ce qui marche très bien grace au code que tu m'as fourni tout à l'heure.

Merci pour tout ce temps consacré à mon problème !
Répondre à superbatto

18


  • 1
    Ce message vous semble utile, votez !
  • Ce message ne vous semble pas utile, votez !
  • Signaler ce message aux modérateurs
fmvgld, le jeudi 13 mars 2008 à 21:33:48
je regarderais demain a tete reposer car pas beaucoup de temps ce soir
Répondre à fmvgld

14


  • 1
    Ce message vous semble utile, votez !
  • Ce message ne vous semble pas utile, votez !
  • Signaler ce message aux modérateurs
Le Pingou, le jeudi 13 mars 2008 à 21:05:58
Bonsoir superbatto,
Merci pour les informations.
Se soir je m'arrête et je reprendrai le tout dès demain.
Bonne soirée.
Salutations.
Jean-Pierre
Répondre à Le Pingou

17


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
superbatto, le jeudi 13 mars 2008 à 21:28:07
Merci beaucoup pour ton aide !
Répondre à superbatto

19


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
superbatto, le jeudi 13 mars 2008 à 21:38:15
D'accord, merci beaucoup !
Répondre à superbatto

20


  • 1
    Ce message vous semble utile, votez !
  • Ce message ne vous semble pas utile, votez !
  • Signaler ce message aux modérateurs
fmvgld, le vendredi 14 mars 2008 à 08:47:07
je cite
"Il y a déjà des contrats qui ont les caractéristiques (les 3 années et le types de produit) identiques à celles du ou des contrat que l'on veut ajouter. Dans ce cas, il faut augmenter (dans la table autre sortie) le nombre de contrats dans la case qui existe déjà (s'il y en avait 4 et qu'on en ajoute 3, il faut modifier le 4 par un 7). "

peut il existe plusieurs lignes correspondant a ces criteres et dans cd cas on incremente quoi
- tous les lignes
-.....

de plus voici ta base revu http://cjoint.com/?doiWIbLjqq
changement du code du bouton + changement des champs
doit tu obligatoirement transferer les données que tu saisi dans tes champs dans ta table choix? en vu d'une tracabilité?
Répondre à fmvgld

24


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
superbatto, le vendredi 14 mars 2008 à 21:07:24
Bonjour,
Merci pour toute cette aide !

A priori, toutes les lignes concernent deux contrats différents : il ne peut pas y avoir deux lignes qui contiennent des contrats ayant comme objet le même type de produit, la même année de souscription, de naissance et de sortie (ces quatres critères définissent entièrement un contrat).
D'ou la colonne "Nb contrats" qui contient le nombre de contrats vérifiant exactement les 4 critères.

Il n'y a donc normalement pas de doublons (à moins que ma base de données soit truffée d'erreurs..)

S'il n'y en a pas, pas de problème, on incrémente simplement le nombre de contrats de la ligne qui vérifie les 4 critères du contrat que l'on a à ajouter (si celle ci existe), sinon on la crée.

Il est vrai que je ne suis pas obligé de passer par la table Choix, mais c'est l'idée la plus simple qui m'est venue à l'esprit !
Je suis ouvert à d'autres propositions.. :)

Il va me falloir un peu de temps pour comprendre la requete sql que tu m'as codée vu que je ne connais pas du tout ce langage !

Merci beaucoup,

Yves
Répondre à superbatto

26


  • 1
    Ce message vous semble utile, votez !
  • Ce message ne vous semble pas utile, votez !
  • Signaler ce message aux modérateurs
fmvgld, le vendredi 14 mars 2008 à 21:30:54
donc pas besoin de cette table. par contre il faudra rajout une cle de parcour afin de pouvoir recherche l'enregistrement a modifier et donc le modifier.
je regarderais des que je peut afin de modifier le code en question
Répondre à fmvgld

27


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
superbatto, le vendredi 14 mars 2008 à 21:33:54
Si je comprends bien, une clé primaire dans la table autre sortie suffirait à repérer la ligne qu'il faut incrémenter, pour pouvoir la mettre à jour simplement avec une requete ?

Merci pour l'aide, ne t'encombre pas avec ça ce soir je pars prendre un train !
Répondre à superbatto

21


  • 1
    Ce message vous semble utile, votez !
  • Ce message ne vous semble pas utile, votez !
  • Signaler ce message aux modérateurs
Le Pingou, le vendredi 14 mars 2008 à 11:44:10
Bonjour superbatto,
Première étape :
Vous dites : je n'arrive pas à lier les zones de texte du formulaire avec les champs de la table Choix

Solution: vous ouvrez le formulaire "Form1" en mode création (Modifier) puis ouvrir les propriétés du formulaire, faire clic droit sur le petit carrée noir à gauche en haut juste au dessous du nom "Form1 : Formulaire" puis clic sur "Propriétés".
Ensuite clic onglet "Données" et pour la propriété "Source" clic sur la flèche du menue déroulant (à droite de la case) et clic sur le nom de votre table.
Une fenêtre s'affiche avec les noms des champs disponibles. Il vous suffit de faire un glisser/coller pour les mettre sur le formulaire.
Note vous pouvez supprimer les autres champs déjà présents.
Et voila pour cette partie.
Salutations.
Jean-Pierre
Répondre à Le Pingou

22


  • 1
    Ce message vous semble utile, votez !
  • Ce message ne vous semble pas utile, votez !
  • Signaler ce message aux modérateurs
Le Pingou, le vendredi 14 mars 2008 à 13:38:40
Bonjour superbatto,
Merci de préciser la table contrat n'existe pas; alors ou j'enregistre "Si oui, au augmente le nombre de contrats, si non, on crée une ligne" ?

Salutations.
Jean-Pierre
Répondre à Le Pingou

23


  • 1
    Ce message vous semble utile, votez !
  • Ce message ne vous semble pas utile, votez !
  • Signaler ce message aux modérateurs
Le Pingou, le vendredi 14 mars 2008 à 18:47:48
Bonjour superbatto,
J'ai admis que la table contrat est "AutreSortie".
Dans un premier temps : le formulaire Fo_Choix" (ancien Form1) fonctionne. J'ai renommé la légende du bouton de commande, c'est plus explicite. Elle fonctionne pour le cas d'un ajout d'un contrat dans la table Ta_AutreSortie
Pour le cumul du nombre de contrats elle ne fait rien pour l'instant.

Votre table Ta_AutreSortie comporte une grande quantité de doublons (visible dans la requête "Rechercher les doublons pour Ta_AutreSortie") ---- que doit’ on faire ?

Dans votre requête "Re_Vérification Présence" vous avez 4 critères d'égalités alors que dans vos textes vous parlez toujours de 3 ----- qu'est ce qui est correct ?

En pièce jointe l'ébauche de votre BD http://cjoint.com/?dosVLQhiqB

Merci de vos renseignements pour la suite
Salutations.
Jean-Pierre
Répondre à Le Pingou

25


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
superbatto, le vendredi 14 mars 2008 à 21:29:47
Bonsoir,

Merci grandement d'aider les néophytes comme moi !

Alors, la manip pour lier les champs de la table Choix avec les cases du formulaire marche nickel !

Pour ce qui est de la table contenant les contrats, il s'agit bien de la table AUTRE SORTIE, désole de ne pas l'avoir bien précisé.

La distinction des contrats se fait quant à elle sur 4 critères distincts, et non pas 3 comme je l'ai malheureusement dit:
Le type de produit
L'année de souscription
L'année de naissance (du souscripteur)
L'année de sortie

Il n'y a donc finalement pas de problème de doublon.

La partie du boulot consistant à créer la ligne dans AUTRE SORTIE si aucun contrat existant n'a les mêmes caractéristiques que le contrat que l'on veut ajouter est donc réglée.
Il faudrait maintenant une requete qui augmente le nombre de contrats de la ligne correspondante si elle existe déjà.
Mettons que la ligne 26 de la table contienne des contrats ayant exactement les mêmes caractéristiques que ceux que je veux rajouter. Il convient donc de faire :
AUTRESORTIE.ligne_26.NbContrats <- AUTRESORTIE.ligne_26.NbContrats + Choix.NbContrats
Je n'arrive malheureusement pas à créer cette requete :(

Je vous remercie sincèrement pour votre aide.

A bientôt j'espère !
Répondre à superbatto

28


  • 1
    Ce message vous semble utile, votez !
  • Ce message ne vous semble pas utile, votez !
  • Signaler ce message aux modérateurs
Le Pingou, le vendredi 14 mars 2008 à 22:52:06
Bonsoir superbatto,
Merci pour les informations, maintenant c'est tout clair.
J'arrive à la même conclusion que fmvgld, la table "Choix" n'est pas nécessaire et de plus on évite d'avoir les informations en double (table AutreSortie et Choix).
Il reste à réaliser le cas de cumul des nombres de contrats, je vais dans le même sens que fmvgld qui certainement sera prêt avant moi car je suis absent ce samedi.
Merci à fmvgld de vous rendre service.
Salutations.
Jean-Pierre
Répondre à Le Pingou

29


  • 1
    Ce message vous semble utile, votez !
  • Ce message ne vous semble pas utile, votez !
  • Signaler ce message aux modérateurs
fmvgld, le samedi 15 mars 2008 à 13:23:40
http://cjoint.com/?dpnwiHN5NZ
derniere mouture de ta base. Test si un enregistrement existe en fonction des 3 date et du produit
creation d'un ligne si pas d"'enregistrement et incrementation du nb de contrat si existe

voila je reste a ta dispo si besoin
Répondre à fmvgld

30


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
superbatto, le dimanche 16 mars 2008 à 17:37:05
Bonjour fmvgld

Merci beaucoup pour tout ce travail !
Je vois que ça marche et j'en suis très content, mais j'aimerais quand même comprendre quelques trucs:
(Je n'ai jamais programmé en SQL)
Je comprends le principe de ce qui suit (requete selection dans la table AutreSortie selon les 4 critères rentrés dans le formulaire), mais j'aimerais savoir:
Pourquoi ces guillemets partout ?
pourquoi avoir séparé ainsi les bouts de la définition de s ? je veux dire, pourquoi ne pas avoir tout collé tout simplement ? est ce que c'est le langage sql qui l'oblige ?

Const guillemet = """"
Const bout1 = "SELECT AutreSortie.Produits, AutreSortie.AnnéeSouscrip, AutreSortie.AnnéeNaiss, AutreSortie.AnnéeSortie, AutreSortie.NbContrats FROM AutreSortie "
Const bout3 = "WHERE (((AutreSortie.Produits) Like " & guillemet
Const bout4 = ")AND ((AutreSortie.AnnéeSouscrip) Like "
Const bout5 = ") AND ((AutreSortie.AnnéeNaiss) Like "
Const bout6 = ") AND ((AutreSortie.AnnéeSortie) Like "
s = bout1 & bout3 & [Forms]![form2]![type_produit] & guillemet & bout4 & [Forms]![form2]![dsous] & bout5 & [Forms]![form2]![anaiss]
s = s & bout6 & [Forms]![form2]![asortie] & "));"