Est-ce que celà signifie que l'affectation de mon Recordset : oRstn'est pas bonne?
Est-ce que celà signifie que l'affectation de mon Recordset : oRstn'est pas bonne?
Je joint un fichier VBE.jpg retraçant mes remarques
Pièce jointe 5322
1/ J'ose supposer que "R_Hist_Carrière_Tous_parDate" est un SELECT conforme et fonctionnel !!!
2/ On ne nomme jamais un module comme un nom de fonction ou de procédure.
Allez, encore un peu de lecture...
Argy
Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.
Ils comptent sur vous...
Web Site ‡ @Mail
Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
MDB Viewer : Visionneuse Access v4.0
*** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***
Voici mon Etat :
Pièce jointe 5324
Il affiche le résultat de ma requête paramétrée dans l'ordre décroissant.
Cependant, dans la zone de texte Ancienneté Corps, il m'affiche #Erreur,
Alors que je devrais voir apparaître 14 correspondant à la dernière ligne, puisque mon IGE n'a pas changé.
Que donne :
tel que demandé ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Sub testCorps() .... End Sub
Argy
Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.
Ils comptent sur vous...
Web Site ‡ @Mail
Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
MDB Viewer : Visionneuse Access v4.0
*** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***
Oui j'ai placé cette procédure avant la fonction AnciennetéCorps()
et cette fois-ci le message suivant s'affiche :
Puisqu'il faut 2 paramètres, je pense à ma requête de sélection paramétrée qui comporte effectivement 2 critères voir fichier joint :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Erreur d'exécution '3061' Trop peu de paramètres. 2 attendu
Pièce jointe 5326
Mes formulaires Date et Fonctionnaires sont tous deux ouverts, pour que la requête puisse s'exécuter.
Quand bien même, il faut pas utiliser cette facilité d'affecter des données de formulaire en guise de critère dans les requêtes...
C'est trop lourd et pas souple...
Ta requête doit être totalement paramétrable, par exemple :
C'est pour ça que ça marche pas...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 Function AnciennetéCorps(ByVal Corps As String) Dim strAncCorps As String Dim strCorpsSuivant As String Dim oRst As DAO.Recordset Dim oDB As DAO.Database Dim SQL As String strAncCorps = "" 'Instancie la base de données Set oDB = CurrentDb 'Ouvre curseur retournant le résultat de la requête SQL = "SELECT * FROM MaTable WHERE MonChamp =" & Chr(34) & Corps & Chr(34) & ";" Set oRst = oDB.OpenRecordset(SQL, dbOpenDynaset) With oRst If Not .EOF Then
Argy
Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.
Ils comptent sur vous...
Web Site ‡ @Mail
Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
MDB Viewer : Visionneuse Access v4.0
*** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***
Bon je n'arrive pas à m'en sortir,
La condition Date_Effet<formulaires!Date.Date est indispensable car fonctionnellement parlant, lorsque l'utilisateur veut connaître l'historique d'une personne à partir d'une date qu'il aura saisie dans un formulaire, alors le résultat doit lui retourner que les Date_Effet qui lui sont inférieure.
Merci pour ton aide, car grâce à toi j'ai approfondi mes connaissances sur Access.
Bon, lorsque tu veux générer un état, tu le fais depuis un bouton sur un formuulaire...
De là, ton bouton est codé avec un :
Dans ce code, tu peux très bien générer dynamiquement la requête qui sera la source de cet état:
Code : Sélectionner tout - Visualiser dans une fenêtre à part DoCmd.OpenReport "Mon état"
Par exemple...
où GenererRequete() est une fonction qui créée ou met à jour une requête.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 Sub cmdImprimerRapport() Const REQUETE As String = "R_Hist_Carrière_Tous_parDate" Dim dtmDateEtat As Date Dim lngIDEmploye As Long Dim blnSucces As Boolean   If Not IsNull(Me!DateEtat) And Not IsNull(Me!ID_Employe) Then     dtmDateEtat = Me!DateEtat     lngIDEmploye = Me!ID_Employe     blnSucces = GenererRequete(REQUETE, dtmDateEtat, lngIDEmploye)   End If      If blnSucces Then     DoCmd.OpenReport "Mon état"   Else     MsgBox "Impossible de créer la requête '" & REQUETE & "' !", vbExclamation   End If End Sub
Pour la fonction AnciennetéCorps(), c'est le même principe, la requête doit exister pour être exploitée par le code...
Bon courage;
Argy
Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.
Ils comptent sur vous...
Web Site ‡ @Mail
Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
MDB Viewer : Visionneuse Access v4.0
*** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***
Est-ce que dans cette ligne de code,
Code : Sélectionner tout - Visualiser dans une fenêtre à part blnSucces = GenererRequete(REQUETE, dtmDateEtat, lngIDEmploye)
1)blnSucces est une variable de type Boolean ? Si oui doit-je la déclarer
comme suit
2)GenererRequete(...) est une méthode qui existe sous VBA?
Code : Sélectionner tout - Visualiser dans une fenêtre à part Dim blnSucces As Boolean
1/ Oui
2/ GenererRequete() est une fonction que tu dois écrire....
Code : Sélectionner tout - Visualiser dans une fenêtre à part Dim blnSucces As Boolean
Hé oui, c'est du travail un développement...
Mais le tuto de Tofalu est très bien rédigé et tu devrais t'en sortir, tu es déjà bien lancé...
Argy
Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.
Ils comptent sur vous...
Web Site ‡ @Mail
Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
MDB Viewer : Visionneuse Access v4.0
*** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***
Bon, je vais cogiter sur ce sujet ce soir, en espérant que la nuit appotera sa part de lumière et de magie
Bonne soirée à toi.
Bonjour Argy et les autres,
J'ai enfin un premier résultat de ce que je désire , en employant les étapes suivantes :
1) J'ai créé une requête Dynamique rqtHistCarrièreParEG (sur ce sujet merci aussi à Tofalu pr ton Tutor)
2) puis un formulaire Date comportant une zone de texte pour la saisie d'une Date par l'utilisateur nommé DateEtat, puis un bouton(BtnOuvreRqt) pour ouvrir la requête dynamique
.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 Private Sub Etat_parEGDate_Click() On Error GoTo Err_Etat_parEGDate_Click Dim stDocName As String Dim Db As DAO.Database Dim rqtModele As DAO.QueryDef Dim strSQLModele As String Dim strNomRqtModele As String Dim strNomRqt As String Dim dtmDateEtat As Date Dim strNomRpt As String strNomRpt = "SE_Hist_Carrière_parEGDate" dtmDateEtat = Me.DateEtat strNomRqtModele = "R_Hist_Carrière_parEG_Modele" strNomRqt = "rqtHistCarrièreParEG" Set Db = CurrentDb Set rqtModele = Db.QueryDefs(strNomRqtModele) strSQLModele = rqtModele.Sql 'Effectue le remplacement du critère [CritereDate] 'par la date saisie dans la zone de texte dateEtat du formulaire Date strSQLModele = Replace(strSQLModele, "[CritereDate]", "#" & dtmDateEtat & "#") 'Si la requête existe déjà, alors If TesteExistenceRqt(strNomRqt) Then 'Modifier le code de la requête Db.QueryDefs(strNomRqt).Sql = strSQLModele 'Sinon Else 'Créer la nouvelle requête Db.CreateQueryDef strNomRqt, strSQLModele End If DoCmd.OpenQuery strNomRqt 'DoCmd.Close acQuery, strNomRqt 'DoCmd.OpenReport strNomRpt Exit_Etat_parEGDate_Click: Exit Sub Err_Etat_parEGDate_Click: MsgBox "Une erreur est survenue", vbCritical, "Saisir une date" Resume Exit_Etat_parEGDate_Click End Sub
3) puis un Etat SE_Hist_Carrière_parEGDate dont la source est la requête dynamique.
J'ouvre mon formulaire Date pour saisir une date, je clique sur le bouton pour ouvrir ma requête dynamique. Jusqu'ici çà fonctionne correctement.
Je veux ouvrir ensuite mon Etat, pour l'instant je pars de la fenêtre base de données puis je doubleclic sur mon Etat, il s'ouvre et la fonction Ancienneté() fonctionne correctement code ci-dessous :
Maintenant, je souhaite modifier le code du bouton BtnOuvreRqt pour ouvrir directement mon Etat, je modifie le code du bouton et je rajoute une ligne en bleu :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 Function AnciennetéCorps(ByVal Corps As String) Dim strAncCorps As String Dim strCorpsSuivant As String Dim Rst As DAO.Recordset Dim Db As DAO.Database Dim Sql As String strAncCorps = "" 'Instancie la base de données Set Db = CurrentDb 'Ouvre curseur retournant le résultat de la requête: rqtHistCarrièreParEG Set Rst = Db.OpenRecordset("rqtHistCarrièreParEG") With Rst If Not .EOF Then 'Recherche comparative paramètre Corps avec les autres champs Corps Do While Not .EOF strAncCorps = .Fields("AnneeCorps") strCorpsSuivant = .Fields("Corps") If strCorpsSuivant <> Corps Then .MovePrevious strAncCorps = .Fields("AnneeCorps") Exit Do End If .MoveNext Loop End If End With 'Libération des objets Rst.Close Db.Close Set Rst = Nothing Set Db = Nothing AnciennetéCorps = strAncCorps End Function
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 ... DoCmd.OpenQuery strNomRqt DoCmd.OpenReport strNomRpt, acViewNormal, , , acWindowNormal ....
et là il m'imprime directement mon Etat, or je veux seulement le visualiser.
Avez-vous une explication?
Merci.
Etre arrivé jusque là !!! génial... Au moins tu as compris.
Pour ton état, il suffit de substituer la constante acViewNormal par acPreview...
Argy
Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.
Ils comptent sur vous...
Web Site ‡ @Mail
Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
MDB Viewer : Visionneuse Access v4.0
*** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***
Sans ton aide, je n'aurais pas réussi, merci encore et mes respects...
Si tu veux bien, je continue à soliciter ton aide.
Je voudrais améliorer ma fonction AnciennetéCorps()
Je voudrais qu'elle me retourne la valeur du champ AncCorps et MoisCorps
Ma question :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 Function AnciennetéCorps(ByVal Corps As String) Dim strAncCorps As String Dim strMoisCorps As String ..... strAncCorps = "" strMoisCorps = "" ..... With Rst If Not .EOF Then Do While Not .EOF strAncCorps = .Fields("AnneeCorps") strMoisCorps = .Fields("MoisCorps") strCorpsSuivant = .Fields("Corps") If strCorpsSuivant <> Corps Then .MovePrevious strAncCorps = .Fields("AnneeCorps") strMoisCorps = .Fields("MoisCorps") Exit Do End If .MoveNext Loop End If End With 'Libération des objets Rst.Close Db.Close Set Rst = Nothing Set Db = Nothing AnciennetéCorps = strAncCorps End Function
Comment faire pour affecter ma fonction avec mon deuxième champ:
Code : Sélectionner tout - Visualiser dans une fenêtre à part AnciennetéCorps = strAncCorps
Eh bien tu renommes ta fonction et tu la rends générique, par exemple :
ce qui fait que tu emploies une seule et même fonction pour n'importe quel champ critère et n'importe quel valeur de champ voulue...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 Function ObtenirValeurChampSelon(ByVal NomDuChampRetour As String, ByVal _     NomDuChampCritere As String, ByVal ValeurChampCritere As String) Dim strChampRetour As String Dim strChampCritereSuivant As String Dim oRst As DAO.Recordset Dim oDB As DAO.Database          strChampRetour = ""     'Instancie la base de données     Set oDB = CurrentDb     'Ouvre curseur retournant le résultat de la requête     Set oRst = oDB.OpenRecordset("R_HistCarrièreTousParDate", dbOpenDynaset)     With oRst       If Not .EOF Then         'Recherche comparative paramètre Corps avec les autres champs Corps         Do While Not .EOF           strChampRetour = .Fields(NomDuChampRetour)           strChampCritereSuivant = .Fields(NomDuChampCritere)           If strChampCritereSuivant <> .Fields(NomDuChampCritere) Then             .MovePrevious             strChampRetour = .Fields(NomDuChampRetour)             Exit Do           End If           .MoveNext         Loop       End If     End With     'Libération des objets     oRst.Close     oDB.Close     Set oRst = Nothing     Set oDB = Nothing     ObtenirValeurChampSelon = strChampRetour End Function Sub testFonction()   Debug.Print ObtenirValeurChampSelon("Grade", "Corps", "IGE") End Sub
Argy
Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.
Ils comptent sur vous...
Web Site ‡ @Mail
Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
MDB Viewer : Visionneuse Access v4.0
*** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***
Depuis mon dernier message, le serveur Web est tombé en rade, il vient seulement de redémarrer... Bref
Je me suis réjoui trop vite car ce matin j'ai testé avec un seul employé et ma requête dynamique comporte un seul critère donc çà marche sans pb.
Mais quand j'entre un 2è, puis 3è employé çà ne marche plus,
En effet mon Etat qui, édite le nb de pages en fonction du nb d'employé (ici 3), affiche correctement les résultats de ma requête selon la personne.
Par contre les résultats de la fonction AnciennetéCorps() sont incorrects selon l'employé.
Ma question (pls en fait) :
1)Faut-il ajouter un 2è critère [CritereIDEmploye]dans ma requête Dynamique?
2)quelle modification à apporter dans la fonction AnciennetéCorps()?
Une question à la fois serait bien
Je t'ai répondu à celle de "Aujourd'hui, 12h21"
Tu en es où et tu veux quoi en finalité ?
Si tu ne poses pas toutes les conditions sur un bout de papier, il est évident que tu vas être confronté à un jeu interminable de "AhBenOuiMais..."
Donc avant d'être atteint de cette maladie que contracte souvent les développeurs qui débutent, je te conseille de te poser les bonnes questions.
Argy
Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.
Ils comptent sur vous...
Web Site ‡ @Mail
Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
MDB Viewer : Visionneuse Access v4.0
*** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***
Je sais, mais je ne pensais pas que les pbs se découvrent au fur et à mesure.
Au final, je veux pour chaque employé un Etat qui m'affiche
1) Son historique avec pour critère son historique<DateEtat
Cette historique est fournie par la requête dynamique logique puisqu'elle est la source de l'Etat.
2) Son ancienneté pour les champs suivants Corps, Grade, et Echelon(le plus facile à obtenir même sans eploiter une fonction).
Pour le Corps et le Grade je fais appel à la fonction AnciennetéCorps().
Rmq : ma requête dynamique me fournit les champs suivants :
ID_Employé : je ne sais pas s'il faut placé un critère sur ce champ?
Date_Effet : champ sur lequel j'ai placé un critère [CritereDate]
Corps : les valeurs peuvent être différentes
Grade : les valeurs peuvent être différentes
Echelon : les valeurs peuvent être différentes
AncCorps : champ calculé me donnant le nb d'années
MoisCorps : champ calculé me donnant le nb de mois
Cette fois c'est bien le but final...
Eh bien tu peux jouer avec la fonction générique que je t'ai postée...
A toi de l'adapter au niveau des paramètres.
Après tu as à contruire une requête dynamique comme tu as appris à le faire avec tous les champs dont tu as besoin pour ton état.
Après, tu peux envisager d'adapter également la visibilité de certains champs selon certaines conditions et des besoins.
Ta demande est en finalité assez simple. Il suffit de savoir ce que tu veux;
Comme tu as pu le voir, tu disposes d'à peu près tout pour réaliser ton projet.
Argy
Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.
Ils comptent sur vous...
Web Site ‡ @Mail
Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
MDB Viewer : Visionneuse Access v4.0
*** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager