|
Sujet n°200 |
Requête multi critères.
par Verhulst
le 24/10/2008 : 12:45 |
Bonjour,
Voilà j'ai un requête qui a en critère [N° de réparation] qui fonctionne très bien et qui au moment de l'ouverture de celle-ci me demande l'encodage du N° et qui me l'affiche sans problèmes.
Ce que je souhaiterais c'est de pouvoir entrer plusieurs N° de manière à ce que la requête m'affiche plusieurs enregistrement.
Merci d'avance.
|
Réponse n° 1 |
par 3Stone le 26/10/2008 : 18:01 |
Bonjour,
La méthode que tu utilises est limitées à l'usage que tu en fait...
Pour faire ce que tu souhaites, il faut dans le VBA, écrire la requête "à la volée" et puis la renseigner comme source d'un éventuel formulaire ou état.
Autre solution, c'est de lire l'SQL de la requête enregistre et adapter le critère selon tes souhaits.
PS: Au final, le critère devra ressembler à queque chose comme: "Where [NoReparation]= 123 OR [NoReparation]= 234 OR [NoReparation]=345"
Autre méthode, tu passes par "Filtrer par formulaire" proposé par Access et qui n'a pas besoin d'être programmé. L'interface est toute prête.
Cordialement, Pierre(3stone)
|
Réponse n° 2 |
par verhulst
le 26/10/2008 : 19:03 |
Bonsoir Pierre,
Au fait j'ai un bouton sur mon formulaire(formulaire d'impression) qui permet l'impression d'un état qui a comme source cette requête. S'il s'agissait d'un formulaire
Dixit..."Filtrer par formulaire" aurait été la solution... Pour faire facile... Car moi le VBA... Ne serait-il pas possible de rajouter un champ sur mon formulaire d'impression qui pourrais paramétrer les critères de cette requête pour n'imprimer que les enregistrements souhaités. Je penses à cela car j'ai déjà observé certaines applications access où cela se faisait en renseignant dans mon cas les N° de réparations par exemples espacés par un point virgule ?
Actuellement ma requête enSQL:
SELECT [Réparations Machines].[SERIAL NUMBER], [Réparations Machines].[N° CLIENT], [Réparations Machines].[N° REPARATION], [Réparations Machines].[Date Dépôt Caffè mobile], [Réparations Machines].[Réf Réparateur], [Réparations Machines].Observations, [Réparations Machines].Réparateur, [Réparations Machines].[Compteur avant réparation], [Réparations Machines].[Compteur après réparation], [Réparations Machines].[Prix réparateur HTVA], [Réparations Machines].Remarques, Clients.Société, [Réparations Machines].[Nbr RETOUR], [Réparations Machines].[Date d'enlèvement (Transporteur)], [Réparations Machines].[Date de demande d'enlèvement], [Réparations Machines].[Date Reprise Réparateur] FROM Clients INNER JOIN [Réparations Machines] ON Clients.[N° CLIENT] = [Réparations Machines].[N° CLIENT] WHERE ((([Réparations Machines].[N° REPARATION])=[N° Réparation])) ORDER BY [Réparations Machines].[Date Dépôt Caffè mobile];
Merci beaucoup !!!
|
Réponse n° 3 |
par 3Stone le 27/10/2008 : 02:42 |
Bonjour,
Dixit...Je penses à cela car j'ai déjà observé certaines applications access où cela se faisait en renseignant dans mon cas les N° de réparations par exemples espacés par un point virgule ?
Bien sûr, tout est possible... par VBA
Bon, ta requête doit être une requête enregistrée...
Sur le formulaire, tu ajoutes une zone de texte indépendante que tu nommes "txtCriteres".
Sous le bouton qui ouvre l'état, tu devrais avoir quelque chose comme ceci (à condition d'avoir créé le bouton avec l'assistant):
Private Sub cmdOpenReport_Click() On Error GoTo Err_cmdOpenReport_Click Dim stDocName As String
stDocName = "Nom de la requête" DoCmd.OpenReport stDocName, acViewNormal
Exit_cmdOpenReport_Click: Exit Sub
Err_cmdOpenReport_Click: MsgBox Err.Description Resume Exit_cmdOpenReport_Click
End Sub
Tu complètes pour obtenir le code ci-dessous en au besoin les deux noms signalés "Nom de la requête" et juste dessous le "Nom du champ"
Dixit... Private Sub cmdOpenReport_Click() On Error GoTo Err_cmdOpenReport_Click Dim stDocName As String
'// début code à ajouter
Dim sSQL As String Dim sSelect As String Dim sWhere As String Dim sOrder As String
Dim sReq As String, sChamp As String Dim l As Long Dim Db As DAO.Database, Qdf As DAO.QueryDef
If Not IsNull(Me!txtCriteres) Then Set Db = CurrentDb
'/--- Nom de la requête sReq = "req_MultiCriteres"
'/--- Nom du champ sChamp = "[Réparations Machines].[N° REPARATION]"
sSQL = CurrentDb.QueryDefs(sReq).SQL
l = InStr(1, sSQL, "Where") - 1 sSelect = Left(sSQL, l)
sWhere = "Where " & sChamp & " IN (" _ & Replace(txtCriteres, ";", ",") _ & ")"
l = InStr(1, sSQL, "Order") - 1 sOrder = Mid(sSQL, l)
sSQL = sSelect & " " & sWhere & " " & sOrder
Db.QueryDefs.Delete (sReq) Set Qdf = Db.CreateQueryDef(sReq, sSQL) Db.QueryDefs.Refresh
Set Db = Nothing Set Qdf = Nothing End If
'// fin code à ajouter
stDocName = sReq DoCmd.OpenReport stDocName, acViewNormal
Exit_cmdOpenReport_Click: Exit Sub
Err_cmdOpenReport_Click: MsgBox Err.Description Resume Exit_cmdOpenReport_Click
End Sub
Note: Le code est fait pour que tu n'aies rien à ajuster en dehors des deux noms... sReq et sChamp
Cordialement, Pierre(3stone)
|
Réponse n° 4 |
par Verhulst
le 27/10/2008 : 13:58 |
Bonjour Pierre,
Et tout d'abord merci pour cette solution qui est certainement plus que correct mais dont je fait probablement très mal usages.... Après encodage du code et test j'obtiens le message: Argument ou appel de procédure incorrect.
Voici copie du code:
Private Sub Commande20_Click() On Error GoTo Err_Commande20_Click
Dim stDocName As String
Dim sSQL As String Dim sSelect As String Dim sWhere As String Dim sOrder As String
Dim sReq As String, sChamp As String Dim l As Long Dim Db As DAO.Database, Qdf As DAO.QueryDef
If Not IsNull(Me!txtCriteres) Then Set Db = CurrentDb
'/--- Nom de la requête sReq = "Rapport intervention pour SAECO"
'/--- Nom du champ sChamp = "[Réparations Machines].[N° REPARATION]"
sSQL = CurrentDb.QueryDefs(sReq).SQL
l = InStr(1, sSQL, "Where") - 1 sSelect = Left(sSQL, l)
sWhere = "Where " & sChamp & " IN (" _ & Replace(txtCriteres, ";", ",") _ & ")"
l = InStr(1, sSQL, "Order") - 1 sOrder = Mid(sSQL, l)
sSQL = sSelect & " " & sWhere & " " & sOrder
Db.QueryDefs.Delete (sReq) Set Qdf = Db.CreateQueryDef(sReq, sSQL) Db.QueryDefs.Refresh
Set Db = Nothing Set Qdf = Nothing End If
stDocName = sReq DoCmd.OpenReport stDocName, acNormal
Exit_Commande20_Click: Exit Sub
Err_Commande20_Click: MsgBox Err.Description Resume Exit_Commande20_Click End Sub
Ps: Le nom de ma requête est bien "Rapport intervention pour SAECO" et le nom du champs si j'ai bien compris tu l'avais déjà compléter à savoir
Dixit...sChamp = "[Réparations Machines].[N° REPARATION]"
Le nom de l'état est "Rapport d'intervention pour SAECO"
Voilà sinon je suis gêné d'encore faire appel à toi alors que tu a fait tout le travail et que je ne parviens pas à trouver mon erreur !!!!
Je te remercie encore beaucoup !!!
|
Réponse n° 5 |
par 3Stone le 27/10/2008 : 17:15 |
Bonjour, Commence par supprimer les espaces et autres signes barbares de tes noms d'objets Il est inutile et surtout contre productif de vouloir faire de la litérature lorsque l'on nomme des champs, tables, requêtes, formulaires et autres états... Tu peux essayer dans un premier temps de corriger cela en placant ces satanés crochets "[" et "]" pour délimiter ces appellations phantaisistes. "ReparationsMachines" au lieu de "[Réparations Machines]" "NoReparation" au lieu de "[N° REPARATION]" "rptInterventionSaeco" au lieu de "[Rapport intervention pour SAECO]" Pas d'espaces, pas de caractères accentués ou barbares ( ' ° - ) Sinon, cela t'oblige à tout encadrer pas des crochets "[" et "]" Ce sont les descriptions des champs et les étiquettes qui sont là pour être lues par l'utilisateur. Amicalement, Pierre(3stone) |
Réponse n° 6 |
par Verhulst
le 28/10/2008 : 12:53 |
Bonjour Pierre,
Voilà j'ai modifié les noms comme ci-dessous:
Table: RéparationsMachines Champ: NoREPARATION Etat: rptInterventionSaeco Requête: RqtInterventionRptSAECO
puis j'ai modifié le code comme ceci:
Private Sub Commande29_Click() On Error GoTo Err_Commande29_Click
Dim stDocName As String
'// début code à ajouter
Dim sSQL As String Dim sSelect As String Dim sWhere As String Dim sOrder As String
Dim sReq As String, sChamp As String Dim l As Long Dim Db As DAO.Database, Qdf As DAO.QueryDef
If Not IsNull(Me!txtCriteres) Then Set Db = CurrentDb
'/--- Nom de la requête sReq = "RqtInterventionRptSAECO"
'/--- Nom du champ sChamp = "[RéparationsMachines].[NoREPARATION]"
sSQL = CurrentDb.QueryDefs(sReq).SQL
l = InStr(1, sSQL, "Where") - 1 sSelect = Left(sSQL, l)
sWhere = "Where " & sChamp & " IN (" _ & Replace(txtCriteres, ";", ",") _ & ")"
l = InStr(1, sSQL, "Order") - 1 sOrder = Mid(sSQL, l)
sSQL = sSelect & " " & sWhere & " " & sOrder
Db.QueryDefs.Delete (sReq) Set Qdf = Db.CreateQueryDef(sReq, sSQL) Db.QueryDefs.Refresh
Set Db = Nothing Set Qdf = Nothing End If
'// fin code à ajouter
stDocName = "rptInterventionSaeco" DoCmd.OpenReport stDocName, acNormal
Exit_Commande29_Click: Exit Sub
Err_Commande29_Click: MsgBox Err.Description Resume Exit_Commande29_Click End Sub
Et j'ai malheureusement tjrs le message: Argument ou appel de procédure incorrect.
Merci.
|
Réponse n° 7 |
par 3Stone le 28/10/2008 : 13:55 |
Bonjour,
Pose un point d'arrêt (clic dans la zone grise à gauche) au début du code et exécute en pas à pas (par appui sur F8) Cela t'indiquera la ligne qui engendre l'erreur.
Cordialement, Pierre(3stone)
|
Réponse n° 8 |
par Verhulst
le 28/10/2008 : 14:47 |
Bonjour Pierre, A hauteur de la première ligne: Private Sub Commande29_Click() lorsque je click sur la zone grise à gauche il y a un rond rouge qui apparaît sur la zone grise et le texte ci-dessus se mets en subrillance rouge. Après j'appuye F8 et un signale sonnore se fait mais rien de plus... Est-ce normal ? Merci. |
[ Retour à la liste des sujets ]
| Recherche
Préférences
1 membre
Connectés :
( personne )
|