Visites

   visiteurs

   visiteurs en ligne

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...frown
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 biggrin

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 wink

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....eek
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 tongue

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.

 


DébutPrécédent [ 1 2 3 ] SuivantFin

[ Retour à la liste des sujets ]

Recherche



Préférences

Se reconnecter
---

Votre nom (ou pseudo) :

Votre code secret


 Nombre de membres 1 membre


Connectés :

( personne )

Haut