[ACCESS VBA]Condition et enregistrement

Fermé
Selune Messages postés 15 Date d'inscription mercredi 15 novembre 2006 Statut Membre Dernière intervention 16 novembre 2007 - 5 mars 2007 à 10:37
Selune Messages postés 15 Date d'inscription mercredi 15 novembre 2006 Statut Membre Dernière intervention 16 novembre 2007 - 6 mars 2007 à 13:52
Bonjour a tous,
Je vous écris car j'ai un petit problème et il me semble ne pas avoir trouver de solution.

Alors voila je fais un projet sous access 2003
Access reste un peu flou pour moi donc si je m'explique mal n'hesitez pas a me le dire je corrigerai avec plaisir

Donc voila j'ai 2tables Batterie (Id_batt, Nom_Batt,Emplacement)et Portique(Id_equip,Equip,ID batterie) et une requete que j'ai nommée battreq qui regroupe les 2 tables précédement nommées.

Sur un de mes formulaires je veux pouvoir enregistrer un nouveau portique. grace a 3 zones de textes ou je precise l'emplacement, le nom de la batterie ,et le portique (equipement). Quand j'appuie sur un joli bouton Valider , les informations que j'ai rentrées s'enregistre effectivement dans ma base.
Voici mon code:

Private sub Valider_Click()
set base= CurrentDb
set data = base.openrecordset("batteriereq",dbopendynaset)
data.addnew
data![emplacement]= emplacement
data![Nom_batt]=batterie
data![Equipement]=Equipement
data.update
sql="select * from batteriereq where emplacement=' "+emplacement+" ' and.....(on a compris la suite)
set data= base.openrecordset(sql,dbopendynaset)
data.movefirst
End sub

ça sa marche. Cependant si j'appuie 20 fois sur valider l'enregistrement ce fait 20 fois dans ma base et je ne veux pas de cela. Si un portique existe deja je ne veux pas qu'il rentre une deuxieme fois dans ma base.
D'ou mon probleme je ne sais pas utiliser les conditions

Jvous ecris ce que j'ai fais

Private sub Valider_Click()
set base= CurrentDb
set data = base.openrecordset("batteriereq",dbopendynaset)
data.addnew
data![emplacement]= emplacement
data![Nom_batt]=batterie
data![Equipement]=Equipement

If (portique existant <> portique venant d'être entré) then
If (batterie existante<> batterie venant d'etre entré) then
If (emplamcement existant<> emplacement venant d'etre entré) then
data.update
sql="select * from batteriereq where emplacement=' "+emplacement+" ' and.....(on a compris la suite)
set data= base.openrecordset(sql,dbopendynaset)
data.movefirst
end if
else
(id batterie existant= id batterie venant d'etre entré)
end if
else
Msg box ("ce portique existe déja")
end if
end sub

la evidement il zap toute les instructions et m'affiche Ce portique existe déja....

j'espere avoir été clair je vous remercie si vous pouvez m'aider a ajuster mon code ou me renvoyer vers un site pouvant m'expliquer cela.
A voir également:

18 réponses

blux Messages postés 26310 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 25 septembre 2024 3 300
5 mars 2007 à 16:29
Je simplifierais la table Batterie en mettant comme clé primaire la concaténation de batterie, emplacement et un lien avec la table portique sur cette clé...

Batterie(Nom_Batterie,Emplacement)

Comme ça tu pourras avoir plusieurs batteries de même nom, mais aucune ne pourra être en lien avec le même emplacement...
1
blux Messages postés 26310 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 25 septembre 2024 3 300
5 mars 2007 à 10:59
Salut,

si un portique peut exister deux fois, c'est que la clé de la table a été mal choisie (Id_Equip).

Dans le cas où ce serait une clé primaire, ACCESS contrôle qu'elle n'existe pas déjà et affiche un message d'anomalie (que l'on peut intercepter et remplacer par une zolie boite de dialogue...)
0
Selune Messages postés 15 Date d'inscription mercredi 15 novembre 2006 Statut Membre Dernière intervention 16 novembre 2007
5 mars 2007 à 11:03
les clé de mes table sont
Id_Equipement pour ma table portique
et Id_batterie pour ma table batterie

ces 2 clés sont des numéros automatique.
0
blux Messages postés 26310 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 25 septembre 2024 3 300
5 mars 2007 à 11:19
Donc le problème vient de là : un numéroauto n'a jamais de doublon...

Il faut modifier ta table (au moins 'batterie'), pour trouver un numéro unique discriminant (numéro de série, d'inventaire, d'ordre...). A moins que ce ne soit pour enregistrer des couples batterie-portique qui ont vocation à être 'historisés'...

Tu veux faire quoi, au juste ? Car je pense qu'on peut simplifier la base au moins au niveau conception...
0

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

Posez votre question
Selune Messages postés 15 Date d'inscription mercredi 15 novembre 2006 Statut Membre Dernière intervention 16 novembre 2007
5 mars 2007 à 11:33
déja merci de bien vouloir t'attarder un peu sur mon probleme
je t'explique ma base de donnée

voila
j'ai plusieurs portiques,plusieurs emplacements, plusieurs batteries

A un emplacement appartient plusieurs batteries (qui sont parfois repérées par le meme nom par exemple EST j'ai 2 batteries de portique nommées ESt ,l'une appartenant a l'emplacement 3A et l'autre a la 3B)d'ou la necessité de leur attribuer des numéros.
Une batterie contient plusieurs portiques par contre tout les portiques (44 pour le moment) ont des noms différents je leur ai attribué un numéro par souci de rigueur on va dire.

mes portiques enregistrent le nombres de personnes passés et les différentes alarmes.

Donc ma base de donnée va regrouper ces différents enregistrements. Grace a acces et aux différentes mise a jour je pourrais consulter le nombre de personnes passé dans tel laps de temp tel jour a tel heure.
Le formulaire qui pour le moment me pose problème est présent si on ajoute un nouveau portiqe si on crée une nouvelle batterie ou si l'on créé un nouvel emplacement. Ainsi je pourrai consulter les enregistrements de ces nouveaux portiques une fois qu'ils seront reliés au serveur.

J'espere avoir été assez clair et ne pas avoir donné trop d'informations inutiles.
0
blux Messages postés 26310 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 25 septembre 2024 3 300
5 mars 2007 à 12:59
J'ai un peu de mal à saisir :

une batterie contient plusieurs portiques ?

On n'a pas un emplacement contient plusieurs portiques qui contiennent plusieurs batteries ?

Tu peux me dire qui est dans quoi, et combien de fois ? (ça s'appelle trouver les cardinalités :-))
0
Selune Messages postés 15 Date d'inscription mercredi 15 novembre 2006 Statut Membre Dernière intervention 16 novembre 2007
5 mars 2007 à 13:50
oki je recommence

un emplacement est un nom que l'on donne a un lieu.
une batterie est un regroupement de portique.
un portique est un detecteur de métal.

donc sur un emplacement j'ai plusieurs batteries.
une batterie appartient a un unique emplacement.
une batterie regroupe plusieur portique.
un portique appartient a une unique batterie.

emplacement1->batterie ouest->portique 1X,1Y,1Z
emplacement1->batterie est-> portique 1A,1B,1C

emplacement2->batterie ouest->portique 2X,2Y,2Z
emplacement 2->batterie nord ->portique 2R,2T

Comme tu peux le voir dans l'exemple il peut y avoir 2 batterie de mm nom et cela placé a des emplacement différent. cependant chaque portique a un nom unique.

je rappelle ma table batterie : (Id_batterie,Nom_batterie,Emplacement)
Portique (Id_equipement,Nom_equipement,Id_batterie)

en quelque sorte emplacement et portique sont des entités physique. L'un représentant un lieu l'autre le détecteur.
Batterie est une entité fictive qui représente le regroupement des portiques.
0
Selune Messages postés 15 Date d'inscription mercredi 15 novembre 2006 Statut Membre Dernière intervention 16 novembre 2007
6 mars 2007 à 09:55
bonjour blux
dsl de repondre que maintenant ce projet est fait dans le cadre de mon travail donc je ne boss dessus qu'au boulot ^^

oki donc jvais tenter avec la concaténation que tu ma conseillé.
>_< faut que je change ma requete aussi du coup ^^

ok jvais m'occuper de ça en attendant que tu reponde a une question général.

sur mon code que j'ai écris plus haut:

Private sub Valider_Click()
set base= CurrentDb
set data = base.openrecordset("batteriereq",dbopendynaset)
data.addnew
data![emplacement]= emplacement
data![Nom_batt]=batterie
data![Equipement]=Equipement

If (portique existant <> portique venant d'être entré) then
If (batterie existante<> batterie venant d'etre entré) then
If (emplamcement existant<> emplacement venant d'etre entré) then
data.update
sql="select * from batteriereq where emplacement=' "+emplacement+" ' and.....(on a compris la suite)
set data= base.openrecordset(sql,dbopendynaset)
data.movefirst
end if
else
(id batterie existant= id batterie venant d'etre entré)
end if
else
Msg box ("ce portique existe déja")
end if
end sub

ceci est donc sans la concaténation que tu m'as conseillé.
Afin de mieux comprendre le VBA sql (je suis débutante) j'aimerai savoir comment je peut traduire cela pour mon programme et si c'est possible. Je bloque sur les condition je sais que mon algo est bon mais je ne sais pas comment traduire mes conditions c'est a dire:

If (portique existant <> portique venant d'être entré) then

If (batterie existante<> batterie venant d'etre entré) then

If (emplamcement existant<> emplacement venant d'etre entré) then

et (id batterie existant= id batterie venant d'etre entré)

il est evident qu'apres modification de mes tables le code sera modifié ^^
0
blux Messages postés 26310 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 25 septembre 2024 3 300
6 mars 2007 à 10:08
Le mieux que tu aies à faire n'est pas forcément de regarder si tout existe, mais d'insérer tes données et de voir si ACCESS te retourne une anomalie car la ligne existe déjà...
0
Selune Messages postés 15 Date d'inscription mercredi 15 novembre 2006 Statut Membre Dernière intervention 16 novembre 2007
6 mars 2007 à 10:20
mmmh dans ce cas cela voudrais dire qu'etant donné que chaque portique est unique je n'est donc nul besoin de mon id_equipement donc je le supprime aussi.
Donc quand je vais entrer mes données dans le formulaire en cas de doublons access le signalera directement donc j'enverais une msg box a mon utilisateur pour lui dire que le portique est deja existant.
Comme ça c'est bon tu penses?
0
blux Messages postés 26310 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 25 septembre 2024 3 300
6 mars 2007 à 10:36
Je verrais un truc comme ça :

Batterie(Nom_Batterie,Emplacement,...)
Portique(Id_Portique,Nom_Batterie,Emplacement,...)

Avec une relation 1-n entre Batterie et Portique sur Nom_Batterie,Emplacement

Dans l'absolu, il faudrait tout simplifier comme tu l'as prévu au début, mais ça force à gérer tous les doublons lors de la création des batteries...
0
Selune Messages postés 15 Date d'inscription mercredi 15 novembre 2006 Statut Membre Dernière intervention 16 novembre 2007
6 mars 2007 à 10:37
donc je garderai mon Id_equipement quand meme.
oki
il me restera quand meme une condition à traduire,

If (portique existant <> portique venant d'être entré) then
non?
0
blux Messages postés 26310 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 25 septembre 2024 3 300
6 mars 2007 à 10:41
Ben non, dans ton formulaire, quand tu crées un portique et que tu l'ajoutes, il va te dire qu'il existe déjà...

Ensuite, tu définis à quelle batterie il appartient...
0
Selune Messages postés 15 Date d'inscription mercredi 15 novembre 2006 Statut Membre Dernière intervention 16 novembre 2007
6 mars 2007 à 10:54
petite question a part (jsuis vraiment désolé)
J'ai tenu a garder ma base précédente quand meme histoire d'avoir une sauvegarde.
Donc jai copier mon ancienne base jlai collée ailleur et j'ai fais les modifications necessaire. Quand je lance ma base modifiée je rentre mon portique mon emplacement ma batterie et la le programme me dit que c'est en lecture seul. Moi yen a pas comprendre car quand je fais clic droit propriété la case lecture seule n'est pas coché. Tu saurais a quoi c'est du?
0
blux Messages postés 26310 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 25 septembre 2024 3 300
6 mars 2007 à 11:01
Peut-être que tu veux faire des modifs via un formulaire où on ne peut pas faire de modifs...
0
Selune Messages postés 15 Date d'inscription mercredi 15 novembre 2006 Statut Membre Dernière intervention 16 novembre 2007
6 mars 2007 à 11:36
jsui blasé la ça marche pu... lecture seule elle va me faire peter un cable cette base de données!!!!
est ce que cela peut etre du aux relations?
0
blux Messages postés 26310 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 25 septembre 2024 3 300
6 mars 2007 à 12:47
Non, mais peut-être que le formulaire n'uatorise pas les modifs (voir dans ses propriétés...)
0
Selune Messages postés 15 Date d'inscription mercredi 15 novembre 2006 Statut Membre Dernière intervention 16 novembre 2007
6 mars 2007 à 13:52
mais je n'ai rien changer dans mon formulaire !!
J'ai modifié mes 2 tables , ma requete ma relation mais en aucun cas mon formulaire.

jte fais voir vite fais ma relation (le & represente les clés, ---represente les liens , et// c'est pour faire les espace car on peut pas sur le fofo)

PORTIQUE ////////BATTERIEREQ///////// BATTERIE
&Id_equip ////////Nom_batterie----------&Nom_batterie
Equipement-------Equipement //////////&Emplacement
Nom_batterie/////Emplacement
0