Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > IHM
IHM Ce forum est dédié aux questions relatives à la création de formulaires et d'états, avec ou sans code VBA, et macros.
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 21/12/2010, 13h07   #1
Candidat au titre de Membre du Club
 
Inscription : février 2007
Messages : 37
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 37
Points : 11
Points : 11
Par défaut SQL comme source de contrôle d'une zone de texte

Bonjour,

Je cherche le moyen de mettre le résultat d'un SELECT SQL dans une zone de texte.

J'ai essayé en mettant la requête SQL dans la source de contrôle (ControlSource) de la zone de texte (TextBox) mais cela ne fonctionne pas.
Pourtant, dans la doc d'Access, pour la propriété ControlSource il est dit que "Le contrôle est dépendant d'un champ d'une table, d'une requête ou d'une instruction SQL."

Quelqu'un aurait-il des explications ou une autre idée ?

Merci d'avance.
voxov est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2010, 13h27   #2
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 458
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 458
Points : 7 531
Points : 7 531
On ne peut simplement pas le faire directement.

Tu peux par contre utiliser
Code :
=DFirst("NomChamp","NomSource","Critere")
qui va te retourner la 1ere valeur trouvée pour le champ NomChamp dans une table ou une requête NomSource selon le critère contenu dans critere. Cette fonction retourne Null si aucun enregistrement ne correspond.

A+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/12/2010, 13h40   #3
Membre du Club
 
Inscription : août 2008
Messages : 86
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 86
Points : 43
Points : 43
Seconde solution, passer par du code VBA, à insérer dans un module et à mettre dans la propriété "onclick" d'un commandbutton par exemple

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
Public Function afficher_texte()
 
Dim db as DAO.databse
Dim rst as DAO.recordset
 
Set db = currentdb()
Set rst = db.openrecordset("Ta requête SQL")
 
Forms("Ton Formulaire").Controls("Ton Textbox").Value = Chr(34) & rst.Fields(x).Value & Chr(34)   'Chr(34) si tu affiches du texte
 
rst.Close
 
Set rst = Nothing
 
End Function
Glherbier est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/12/2010, 13h48   #4
Rédacteur/Modérateur
 
Avatar de GAYOT
 
Homme Jean-Damien GAYOT
Inscription : novembre 2004
Messages : 2 071
Détails du profil
Informations personnelles :
Nom : Homme Jean-Damien GAYOT
Âge : 56
Localisation : France, Meuse (Lorraine)

Informations professionnelles :
Secteur : Distribution

Informations forums :
Inscription : novembre 2004
Messages : 2 071
Points : 4 382
Points : 4 382
Envoyer un message via Skype™ à GAYOT
Bonjour à tous
Et si ta requête te retourne plusieurs enregistrements, tu peux lire ceci:
http://jdgayot.developpez.com/tutori...ultats-labels/

Avec toutes les réponses que tu as eu, tu dois pouvoir y arriver.
__________________
Plus j'avance et plus j'ai l'impression de ne rien savoir. Et comme j'essaie d'aller loin..!!.

Tutoriels sur:http://jdgayot.developpez.com

Pas de sujets techniques par Mp. Sinon
GAYOT est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/12/2010, 14h04   #5
Candidat au titre de Membre du Club
 
Inscription : février 2007
Messages : 37
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 37
Points : 11
Points : 11
Merci pour vos réponses.

La solution par les domain aggregate functions (ex. DFirst) est assez simple, mais est-ce qu'on peut mettre dans le second paramètre une requête SQL sur plusieurs tables avec p.ex. des outer joins ? Je pensais que la fonction ne marche que sur une table.

La solution en passant par l'intermédiaire d'un recordset est ce que je veux contourner : c'est lourd !

Je ne vois pas pourquoi mettre une donnée dans zone de texte par une requête SQL n'est pas possible alors que c'est possible avec une liste déroulante par :
Origine source : table/requête
Contenu : (la requête SQL)

Y aurait-il un autre objet qu'une zone de texte ou un autre moyen pour afficher dans une zone une valeur unique résultat d'une requête sur plusieurs tables ?
voxov est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2010, 18h11   #6
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 458
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 458
Points : 7 531
Points : 7 531
Non, tu ne peux pas mettre de SQL dans le DFirst mais tu peux mettre le nom d'une requête.

Pour la source de zone de texte SQL, écrit à Bill GATES pour te plaindre :-). J'imagine que c'est parce que Access a toujours fait tout ce qu'il pouvait pour masquer le SQL dérière une interface.

Tu pourrais peut-être utiliser une zone de liste à une seule ligne cela devrait sensiblement donner le même résultat qu'une zone de texte monoligne.

A+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2010, 18h42   #7
Candidat au titre de Membre du Club
 
Inscription : février 2007
Messages : 37
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 37
Points : 11
Points : 11
Merci.
Oui, une zone de liste à la place d'une zone de texte. Je l'ai déjà fait, mais ce n'est pas idéal surtout quand l'utilisateur va cliquer dessus.
Merci à tous pour vos réponses.
voxov est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2010, 02h10   #8
Membre Expert
 
Homme Pierre ANTOINE
Inscription : février 2008
Messages : 650
Détails du profil
Informations personnelles :
Nom : Homme Pierre ANTOINE
Âge : 43
Localisation : France, Côte d'Or (Bourgogne)

Informations professionnelles :
Secteur : Enseignement

Informations forums :
Inscription : février 2008
Messages : 650
Points : 1 302
Points : 1 302
Bonjour

En partant du principe indiqué par GAYOT, mais sans utiliser les recordset, voici ce que je ferais.

Une liste avec comme source le code sql. Cette liste est invisible.
Un controle texte à qui on affecte la valeur de la liste.

Quelque chose comme :

Code :
1
2
Me.Modifiable1 = Me.Modifiable1.ItemData(0)
Me.Texte3 = Me.Modifiable1
Pierre
pier.antoine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2010, 08h32   #9
Rédacteur/Modérateur
 
Avatar de GAYOT
 
Homme Jean-Damien GAYOT
Inscription : novembre 2004
Messages : 2 071
Détails du profil
Informations personnelles :
Nom : Homme Jean-Damien GAYOT
Âge : 56
Localisation : France, Meuse (Lorraine)

Informations professionnelles :
Secteur : Distribution

Informations forums :
Inscription : novembre 2004
Messages : 2 071
Points : 4 382
Points : 4 382
Envoyer un message via Skype™ à GAYOT
Bonjour à tous
Tous les moyens sont bons, mais la solution par Recordset n'est pas si lourde que celà, surtout si tu es certain que ta requête te renvoie un enregistrement unique.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  Dim oDb As DAO.Database
    Dim oRst As DAO.Recordset
    Dim Result As Variant 'j'ai mis Variant car je ne connais pas le type de tes données
    Set oDb = CurrentDb
    Set oRst = oDb.openRecordSet("SELECT XXXXXX" & _
                                 "FROM Tbl_YYYY ", dbOpenSnapshot)
 
   If oRst.EOF Then
   MsgBox "Pas d'enregistrements"
   Else
   Result = oRst.Fields(0) 'renvoie la valeur de la première colonne de la ligne1
   Me.Txt_NomDeTaZone.ControlSource = "=" & Result
   End If
   oDb.Close
   Set oDb = Nothing
   Set oRst = Nothing
A adapter, mais je n'ai pas l'impression que se soit si compliqué.
Cela rejoint en grande partie le code de Glherbier.
Mais les autres méthodes fonctionnent également.
Donc à toi de voir...
__________________
Plus j'avance et plus j'ai l'impression de ne rien savoir. Et comme j'essaie d'aller loin..!!.

Tutoriels sur:http://jdgayot.developpez.com

Pas de sujets techniques par Mp. Sinon
GAYOT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2010, 14h57   #10
Candidat au titre de Membre du Club
 
Inscription : février 2007
Messages : 37
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 37
Points : 11
Points : 11
Merci Pierre pour ton astuce. Le passage par l'intermédiaire d'une zone de liste reste toutefois une méthode indirecte.

Merci aussi à toi GAYOT. Pas si lourd ? Plus lourd quand même que :

Me.MaZoneTexte.ControlSource.sql = "SELECT ..."

Une seule ligne, et pas de risque de bloquer des ressources.
J'invente le .sql mais il est là pour des raisons évidentes.

D'après la doc, on aurait pu s'attendre à ce que ce soit possible : "Le contrôle est dépendant d'un champ d'une table, d'une requête ou d'une instruction SQL."
voxov est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2010, 16h28   #11
Candidat au titre de Membre du Club
 
Inscription : février 2007
Messages : 37
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 37
Points : 11
Points : 11
Je vais créer une fonction du genre :

Function ResultFromSQL(RequeteSQL as string) as Variant

pour s'occuper de la cuisine avec le recordset.

Ainsi je pourrai arriver au même résultat, mais en passant par du code VBA pour mettre le résultat de la requête dans la zone de texte :

Me.MyZoneTexte = ResultFromSQL("Select ...")
voxov 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 06h42.


 
 
 
 
Partenaires

Hébergement Web