Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Requêtes et SQL.
Requêtes et SQL. Tout ce qui concerne vos questions sur les requêtes et le SQL sous Access se trouve ici.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/11/2010, 11h22   #1
Futur Membre du Club
 
Inscription : octobre 2010
Messages : 65
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : octobre 2010
Messages : 65
Points : 18
Points : 18
Par défaut Problème valeur CheckBox requête

Bonjour,

J'ai un problème concernant la transmission de l'information sur les valeurs des cases à cocher par les requêtes.

Contexte :
L'utilisateur effectue une recherche, selectionne un resultat et ouvre le formulaire correspondant à son résultat.
En VBA, lorsque l'utilisateur clic sur le bouton pour ouvrir le formulaire, une marco execute des commande SQL sur plusieurs tables, le resultat de ces requetes est ensuite inseré dans le formulaire. Jusqu'ici pas de probléme.

Mais (parce qu'il y a toujours un mais) la table contenant les informations possède des champs Oui/Non. Lorsque la macro exécute une commande Select puis OpenRecordSet, la valeur de ma case à cocher dans le formulaire est VRAI/FAUX, alors que lorsque l'utilisateur change la valeur de la case à cocher dans le formulaire, la valeur et 0/-1.

Donc lorsque l'utilisateur sauvegarde les changement en cliquant sur un bouton, la macro exécute la commande SQL Update et toutes les cases à cocher qui ont des valeurs VRAI/FAUX (donc celles où l'utilisateur n'a rien changé) ne sont pas prises en compte et la commande Update renvoie 0 pour ces cases. J'ai donc perte des informations si l'utilisateur ne remet pas manuellement les valeur à 0 ou -1 dans chaque case à cocher.

Y a-t-il un moyen d’harmoniser tout ça ?
Ma requête Select pour les cases à cocher ne peut-elle pas renvoyer 0 ou -1 au lieu de vrai/faux ?
GohanSSj2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2010, 11h42   #2
Futur Membre du Club
 
Inscription : octobre 2010
Messages : 65
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : octobre 2010
Messages : 65
Points : 18
Points : 18
Bon une solution consiste à écrire un nouveau code à la suite de la requete SELECT pour changer les valeur vrai/faux en 0/-1 :

Code :
1
2
3
4
5
If CheckBox1.Value = True Then
CheckBox1.Value = -1
ElseIf CheckBox1.Value = False Then
CheckBox1.Value = 0
End If
Enfin je trouve ça assez fou et surtout assez lourd sachant que j'ai une 20éne de case à cocher.

Si quelqu'un à la solution miracle qui permet de configurer en amont dans la table et/ou dans Access pour changer cette aberration je suis preneur.
GohanSSj2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2010, 11h51   #3
Membre éclairé
 
Homme Pierre-Jean
Développeur informatique
Inscription : février 2010
Messages : 306
Détails du profil
Informations personnelles :
Nom : Homme Pierre-Jean
Âge : 31
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : février 2010
Messages : 306
Points : 330
Points : 330
Envoyer un message via MSN à paidge
Bonjour,
Je n'ai quasiment pas travaillé sur ACCESS 2007 et je ne suis encore qu'un débutant sur ACCESS 2003. Mais si tu as une 20aine de contrôles à modifier, tu peux faire un truc du genre :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
For Each ctl In Me.Controls
' ===== Sélectionne les 3 premiers caractères du nom du contrôle en cours =====
    Select Case Left(ctl.Name, 3)
    Case "chk"
        If ctl.Value = True Then
            ctl.Value = -1
        Else
            ctl.Value = 0
        End If
    End Select
Next ctl                                    ' Prochain contrôle
ça va te parcourir tous tes contrôles Checkbox dont le nom commence par "chk"
paidge est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2010, 12h14   #4
Futur Membre du Club
 
Inscription : octobre 2010
Messages : 65
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : octobre 2010
Messages : 65
Points : 18
Points : 18
Bien vu mais le CheckBox1 était un exemple, aucune de mes cases à cocher à une partie de nom commune.

J'ai créer mes 30 conditions (j'en avais pas une vingtaine mais une trentaine !)mais c'est vraiment trop encombrant.
GohanSSj2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2010, 12h19   #5
Membre chevronné
 
Avatar de alassanediakite
 
Homme Alassane Diakité
Conseil - Consultant en systèmes d'information
Inscription : août 2006
Messages : 536
Détails du profil
Informations personnelles :
Nom : Homme Alassane Diakité
Âge : 34
Localisation : Mali

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information

Informations forums :
Inscription : août 2006
Messages : 536
Points : 601
Points : 601
Envoyer un message via Yahoo à alassanediakite
Salut
VBA et SQL ne traitent pas les champs boolean de la même manière: pour VBA c'est "true" et "false" pour SQL c'est "yes" et "no"
@+
__________________
Le monde est trop bien programmé pour être l’œuvre du hasard…
alassanediakite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2010, 13h28   #6
Membre éclairé
 
Homme Pierre-Jean
Développeur informatique
Inscription : février 2010
Messages : 306
Détails du profil
Informations personnelles :
Nom : Homme Pierre-Jean
Âge : 31
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : février 2010
Messages : 306
Points : 330
Points : 330
Envoyer un message via MSN à paidge
Citation:
Envoyé par GohanSSj2 Voir le message
Bien vu mais le CheckBox1 était un exemple, aucune de mes cases à cocher à une partie de nom commune.
D'où l'intérêt de normaliser le nom des contrôles

Au début je ne le faisais pas mais c'est super pratique et on ne peux plus s'en passer après ! Il y a un article très bien fait sur le sujet dans les tutos il me semble.
Par exemple pour les :
-textbox : txt_nomDuControle
-Label : lbl_nomDuControle
-Checkbox : chk_nomDuControle
-Liste : lst_nomDuControle
-bouton : btn_nomDuControle
etc.

Non seulement ça permet d'utiliser l'algorithme que je t'ai cité par exemple mais d'un seul coup d'oeil, tu sais de quel type de controle il s'agit
paidge est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2010, 13h29   #7
Futur Membre du Club
 
Inscription : octobre 2010
Messages : 65
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : octobre 2010
Messages : 65
Points : 18
Points : 18
Pourtant avec le code que j'est écrit plus haut, SQL semble comprendre 0 et -1.

De plus ma requete renvoie VRAI ou FAUX dans la case a cocher sans modification. Ce que je ne comprend pas c'est que sans rien modifier, la requete update ne comprend pas Vrai/Faux.

Exemple:
On a à disposition une table nommée Table1 avec un Champs "Prenom" en type Oui/Non.
Dans le formulaire1:
Code :
1
2
3
4
5
6
7
8
ReqInfoROE = "SELECT Table1.*, Table1.Id " & _
"FROM Table1 " & _
"WHERE (((Table1.Id)='" & Id & "'));"
 
Set ResReqInfo = CurrentDb.OpenRecordset(ReqInfo)
ResReqInfo.MoveFirst
 
Forms!Formulaire2.Form!Prenom = ResReqInfoROE("Prenom")
C'est un exemple bidon mais bon c'est pour le principe. Donc quand l'utilisateur clic sur le bouton, cela exécute la commande ci-dessus, la case à cocher nommée "Prenom" est cochée ou non avec la valeur vrai ou faux.

Lorsque l'utilisateur valide des changement dans le formulaire2 ce exécute :

Code :
1
2
UPDATE Table1 SET Table1.Prenom = '" & Prenom & "'
WHERE  (((Table1.Id)='" & Id & "'));
Donc si "Prenom" prend les valeurs 0 ou -1 cela se passe bien, si "Prenom" prend les valeurs vrai ou faux, cela ne marche pas et "Prenom prend 0 comme valeur
GohanSSj2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2010, 13h40   #8
Membre éclairé
 
Homme Pierre-Jean
Développeur informatique
Inscription : février 2010
Messages : 306
Détails du profil
Informations personnelles :
Nom : Homme Pierre-Jean
Âge : 31
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : février 2010
Messages : 306
Points : 330
Points : 330
Envoyer un message via MSN à paidge
Je n'ai peut-être pas assez de détails concernant ton appli, mais jusqu'alors, lorsque j'utilises des champs booléens dans mes tables, les formulaires sont directement basés sur les tables. Comme ça, lorsque l'utilisateur coche une case, elle est aussi cochée dans la table. Ce qui évite de passer par une requête UPDATE. Peut-être qu'en revoyant la conception de tes formulaires il est possible de faire ainsi (filtrage des formulaires pour un ID particulier par exemple)
paidge est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2010, 13h42   #9
Futur Membre du Club
 
Inscription : octobre 2010
Messages : 65
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : octobre 2010
Messages : 65
Points : 18
Points : 18
Ok Paidge, je prend note, j'ai mis du temps mais je viens de comprendre ton raisonnement lol.

Efectivement cela pourrait me permettre de simplifier mes 30 conversions.

En fait je me sers de la génération automatique de formulaire dans Access pour copier la structure et donc les noms des contrôles correspondent aux noms des champs. Ce qui me simplifie la visibilité dans VBA et cela m'évite de retaper le nom de tous les contrôles.

Mais je prend note de ta remarque
GohanSSj2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2010, 13h46   #10
Futur Membre du Club
 
Inscription : octobre 2010
Messages : 65
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : octobre 2010
Messages : 65
Points : 18
Points : 18
lol ya un décalage dans nos réponse on va finir par faire des amalgame ^^.

Je ne voulais pas passer uniquement par la génération de formulaire car il n'y a pas assez de contrôle sur l'intégrité des données. La au moins l'utilisateur clique sur le bouton "Valider", je lui repose ensuite la question de savoir si il est sure de vouloir faire des changement et seulement après la mise à jour s’effectue.

Avec la génération automatique de formulaire, les données sont mis a jour en direct, donc si il y a une fausse manip, les données sont faussées.
GohanSSj2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2010, 13h49   #11
Membre éclairé
 
Homme Pierre-Jean
Développeur informatique
Inscription : février 2010
Messages : 306
Détails du profil
Informations personnelles :
Nom : Homme Pierre-Jean
Âge : 31
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : février 2010
Messages : 306
Points : 330
Points : 330
Envoyer un message via MSN à paidge
Je t'accorde que ça peut paraître un peu lourd (et long) de renommer tous les contrôles. Mais c'est du temps de gagner pour plus tard Surtout quand tu relis ton code, quelques jours (pour les petites têtes comme moi :p) ou quelques mois après.

Par exmple dans ton code :
Code :
1
2
3
4
5
6
7
8
9
 
ReqInfoROE = "SELECT Table1.*, Table1.Id " & _
"FROM Table1 " & _
"WHERE (((Table1.Id)='" & Id & "'));"
 
Set ResReqInfo = CurrentDb.OpenRecordset(ReqInfo)
ResReqInfo.MoveFirst
 
Forms!Formulaire2.Form!Prenom = ResReqInfoROE("Prenom")
Il faut savoir que "Prenom" est une checkbox....Si tu l'avais appelé "chk_prenom", tu saurais qu'il s'agit d'une case à cocher concernant le prénom. CQFD


Citation:
Avec la génération automatique de formulaire, les données sont mis a jour en direct, donc si il y a une fausse manip, les données sont faussées.
Il y a une solution pour ça dans la FAQ

EDIT : facile à retrouver en plus : juste >>ICI<< ou >>LA<<
paidge est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2010, 14h01   #12
Futur Membre du Club
 
Inscription : octobre 2010
Messages : 65
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : octobre 2010
Messages : 65
Points : 18
Points : 18


Merci beaucoup, je pense revoir (à mon grand regret) ma base de données.

Encore merci du coup de main.

Au passage, l'énigme de base n'a pas été résolue. C'est un problème connu et on fait avec ou c'est un problème dans ma base?
Mais on va dire que c'est pour la curiosité.
GohanSSj2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2010, 14h06   #13
Futur Membre du Club
 
Inscription : octobre 2010
Messages : 65
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : octobre 2010
Messages : 65
Points : 18
Points : 18
Un dernier p'tit truc :

Ma méthode me permettais d'afficher les informations d'un seul enregistrement.
La génération de formulaire met un compteur d’enregistrement en bas pour naviguer entre eux et choisir quel enregistrement modifier. Peut-on afficher les informations d'un seul enregistrement dans la génération automatique de formulaire ?
Il faut obligatoirement passer par une requête et indiquer la clause WHERE ?
GohanSSj2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2010, 14h10   #14
Membre éclairé
 
Homme Pierre-Jean
Développeur informatique
Inscription : février 2010
Messages : 306
Détails du profil
Informations personnelles :
Nom : Homme Pierre-Jean
Âge : 31
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : février 2010
Messages : 306
Points : 330
Points : 330
Envoyer un message via MSN à paidge
Citation:
C'est un problème connu et on fait avec ou c'est un problème dans ma base?
Faut faire avec. J'avais déjà remarqué cela aussi une fois....
Perso j'ai fait ma première grosse appli en 6 mois. Cétait tellement le bordel dans les noms des contrôles et les bouts de code récupérés à droite et à gauche que j'ai tout recommencé...Mais l'expérience aidant, j'ai mis 3 mois au lieu de 6 à la refaire avec encore plus de fonctionnalités, du code bien propre et bien commenté et qui pèse deux fois moins lourd ! C'est comme ça qu'on apprend

Citation:
Envoyé par GohanSSj2 Voir le message
Un dernier p'tit truc :
La génération de formulaire met un compteur d’enregistrement en bas pour naviguer entre eux et choisir quel enregistrement modifier.
Tu peux masquer tout ça dans les propriétés des formulaires (je te laisse le soin de chercher, tu retiendras mieux et c'est pas compliqué à trouver).
Citation:
Envoyé par GohanSSj2 Voir le message
Peut-on afficher les informations d'un seul enregistrement dans la génération automatique de formulaire ?
Il faut obligatoirement passer par une requête et indiquer la clause WHERE ?
Oui tu peux et non tu n'es pas obligé d'utiliser une requête avec clause WHERE. Tu peux ouvrir un formulaire sur un enregistrement spécifique avec la commande Docmd.openForm. Cette commande peut disposer d'un argument qui est l'équivalent de la clause WHERE

NB : quand tu te trouves dans VBE pour afficher ton code, place ton cursuer sur les mots-clés et appuies sur F1. L'aide est très bien faite
paidge est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2010, 14h28   #15
Futur Membre du Club
 
Inscription : octobre 2010
Messages : 65
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : octobre 2010
Messages : 65
Points : 18
Points : 18
Citation:
Envoyé par paidge Voir le message
Faut faire avec. J'avais déjà remarqué cela aussi une fois....
Perso j'ai fait ma première grosse appli en 6 mois. Cétait tellement le bordel dans les noms des contrôles et les bouts de code récupérés à droite et à gauche que j'ai tout recommencé...Mais l'expérience aidant, j'ai mis 3 mois au lieu de 6 à la refaire avec encore plus de fonctionnalités, du code bien propre et bien commenté et qui pèse deux fois moins lourd ! C'est comme ça qu'on apprend
Idem, sauf que je n'ai que 3 mois pour la faire ^^. Enfin ça fait 1 mois et demi ... chu large

Citation:
Envoyé par paidge Voir le message
Tu peux masquer tout ça dans les propriétés des formulaires (je te laisse le soin de chercher, tu retiendras mieux et c'est pas compliqué à trouver).
Oui, ça il n'y a pas de problème c'était pour resituer la chose, mais merci tout de même de l'indication

Citation:
Envoyé par paidge Voir le message
Oui tu peux et non tu n'es pas obligé d'utiliser une requête avec clause WHERE. Tu peux ouvrir un formulaire sur un enregistrement spécifique avec la commande Docmd.openForm. Cette commande peut disposer d'un argument qui est l'équivalent de la clause WHERE
A ouki je n'avais jamais prêté attention à l’ensemble des arguments de cette fonction

Aprés toutes ces émotions je pense pouvoir dire que le sujet est résolue !
Merci à toi Paidge
GohanSSj2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h14.


 
 
 
 
Partenaires

Hébergement Web