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 01/02/2011, 12h02   #1
Invité régulier
 
Marius Pipeau
Inscription : octobre 2010
Messages : 35
Détails du profil
Informations personnelles :
Nom : Marius Pipeau

Informations forums :
Inscription : octobre 2010
Messages : 35
Points : 9
Points : 9
Par défaut Recherche date la plus proche

Bonjour les jeunes !
J ai bien trouvé des informations sur le problème que je cherche à résoudre mais mes connaissance m'empeche de comprendre mes erreurs.
En réalité j ai fait un mix de ce que j ai trouvé ici :
http://www.developpez.net/forums/d97...e-plus-proche/

L'outil : j ai un formulaire dans lequel je rentre les différents fournisseurs. Un premier sous formulaire me permet pour chaque fournisseurs de différencier le secteur (peu d'infos) et un deuxième sous formulaire me détaille pour chaque fournisseur pour chaque secteur les flux qui rentrent et qui sortent.

Les tables sont donc hierarchisées de la sorte : Fournisseurs ->Secteur->Flux

Sans aucun rapport j'ai deux autres tables qui sont liées : TDate (Numauto,Date) -> CurrencyRate(NumAuto,Monnaie,To,MonnaieDate)

But : Lorsque je rentre un flux, l'outil regarde la date à laquelle il a eu lieu. On va fouiller dans la table TDate pour trouver la date la plus proche et on retourne le taux de la table CurrencyRate correspondant pour convertir en euros.

Mon mix :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
Private Sub Flux_AfterUpdate()
 
 
    Dim sSql As String
    Dim Rst As New ADODB.Recordset
    Dim CN As ADODB.Connection
    Set CN = CurrentProject.Connection
 
    sSql = "TOP 1 CurrencyRate.To" _
        & " FROM TDate INNER JOIN CurrencyRate" _
        & " WHERE ((CurrencyRate.Monnaie) = "[Forms]![NewFournisseur]![Secteur Sous-formulaire3].[Form]![Flux (euros)]"))" _
    Rst.Open sSql, CN, adOpenStatic
    [Forms]![NewFournisseur]![Flux Sous-formulaire7].[Form]![Exchange Rate] = Nz(Rst(0))
Merci par avance aux personnes qui prendront le temps de me répondre (ou d'y réfléchir !)
Marius76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 16h42   #2
Invité régulier
 
Marius Pipeau
Inscription : octobre 2010
Messages : 35
Détails du profil
Informations personnelles :
Nom : Marius Pipeau

Informations forums :
Inscription : octobre 2010
Messages : 35
Points : 9
Points : 9
Re bonjour.
Après qq heures de lectures sur les DAO je me suis rapproché du résultat mais ce n est toujorus pas cela.
Je suis arrivé à cela mais ca me dit que l'expression entre les # est erroné quelqu un pourrait t i m aider svp ? :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Private Sub Flux_AfterUpdate()
 
Dim gpi As DAO.Database
Dim req As DAO.Recordset 
Dim Tosql As String
Dim sDev As String
 
sDev = [Forms]![NewFournisseur]!Secteur Sous-formulaire3].[Form]![Modifiable10]
dDate = [Forms]![NewFournisseur]![Flux Sous-formulaire7].[Form]![Investment date]
 
Set gpi = CurrentDb()
 
Tosql = "SELECT TOP 1 CurrencyRate.To" _
      & " FROM TDate INNER JOIN CurrencyRate ON DateCurrency.NumAutoDate = CurrencyRate.CurrencyDate" _
      & " WHERE (((CurrencyRate.Monnaie) = '" & sDev & "'))" _
      & " ORDER BY Abs((CLng([DateC]))-(CLng(#dDate#)));"
 
Set req = gpi.OpenRecordset(Tosql)
 
 [Forms]![NewFournisseur]![Texte14] = req 'Jai mi ca qq part pour voir ce que ca me retournait
End Sub
Marius76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 18h30   #3
Rédacteur/Modérateur
 
Avatar de Philippe JOCHMANS
 
Homme Philippe JOCHMANS
Développeur informatique
Inscription : mai 2005
Messages : 17 609
Détails du profil
Informations personnelles :
Nom : Homme Philippe JOCHMANS
Âge : 44
Localisation : France, Loir et Cher (Centre)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Communication - Médias

Informations forums :
Inscription : mai 2005
Messages : 17 609
Points : 30 959
Points : 30 959
Envoyer un message via MSN à Philippe JOCHMANS Envoyer un message via Skype™ à Philippe JOCHMANS
Bonjour

Ta variable de dDate est à entrer par concaténation comme tu l'as fait avec sDev, et si ta variable est bien de type Date, il faut utiliser les #.

Philippe
__________________
Détaillez vos questions, sinon vous aurez des réponses erronées et vous irez tout droit dans le et lisez les règles sinon
Si vous pensez commencer sans un livre, oublier : livres pour débuter
Vous pouvez consulter mes articles sur Access et PowerPoint
Le blog Office.

Inutile de m'envoyer un MP pour des questions techniques ou de me relancer , je n'y répondrais pas.
Philippe JOCHMANS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 19h07   #4
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 410
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 410
Points : 4 439
Points : 4 439
bonsoir,

Code sql :
1
2
... FROM TDate INNER JOIN CurrencyRate 
ON DateCurrency.NumAutoDate = CurrencyRate.CurrencyDate...

il n'y a pas de table DateCurrency dans la clause FROM

probablement à remplacer par TDate:
Code sql :
1
2
... FROM TDate INNER JOIN CurrencyRate 
ON TDate.NumAutoDate = CurrencyRate.CurrencyDate...
f-leb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 11h51   #5
Invité régulier
 
Marius Pipeau
Inscription : octobre 2010
Messages : 35
Détails du profil
Informations personnelles :
Nom : Marius Pipeau

Informations forums :
Inscription : octobre 2010
Messages : 35
Points : 9
Points : 9
Bonjour et merci pour vos réponses et votre oeil de lynx !

J'ai bien pris en compte vos remarque et j ai renommé les différentes variables car j ai lu que le problème venait de là mais je me retrouve maintenant avec l erreur type de données incompatible (3464).
Je me demande si la dDate est dans le bon format.
dDate reprend la valeur d' une zone de texte qui a pour source une données de type Date/heure dans une table d'Access.

Merci pour votre aide je vous poste ce que j ai changé :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Private Sub Flux_AfterUpdate()
 
Dim gpi As DAO.Database
Dim req As DAO.Recordset
Dim sSql As String
Dim sDev As String
Dim dDate As Date
 
sDev = [Forms]![NewFournisseur]![Fourn Sous-formulaire3].[Form]![Modifiable10]
dDate = [Forms]![NewFournisseur]![Fourn Sous-formulaire7].[Form]![Investment date]
 
Set gpi = CurrentDb()
 
sSql = "SELECT TOP 1 CurrencyRate.CurrencyeRateR" _
      & " FROM DateCurrency INNER JOIN CurrencyRate ON DateCurrency.NumAutoDate = CurrencyRate.CurrencyDate" _
      & " WHERE (((CurrencyRate.CurrencyR) = '" & sDev & "'))" _
      & " ORDER BY Abs((CLng([DateCur]))-(CLng('# & dDate & #')));"
 
Set req = gpi.OpenRecordset(sSql)
 
 [Forms]![NewFournisseur]![Texte14] = req
 
End Sub
Marius76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 18h05   #6
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 410
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 410
Points : 4 439
Points : 4 439
bonsoir Marius76,

je tenterais bien:

Code :
& " ORDER BY Abs(CLng([DateCur])-CLng(#" & format(dDate,"mm/dd/yyyy") & "#));"
f-leb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2011, 17h46   #7
Invité régulier
 
Marius Pipeau
Inscription : octobre 2010
Messages : 35
Détails du profil
Informations personnelles :
Nom : Marius Pipeau

Informations forums :
Inscription : octobre 2010
Messages : 35
Points : 9
Points : 9
merci poru cette nouvelle réponse mais je n'ai toujours pas bouclé cette maudite fonction.
J'ai essayé du coup de le faire avec plusisuers dlookup mais je ne pense pas que ce soit la bonne solution.
Du coup je me suis replongé dans le magnifique doc sur les DAO de christophe Warin mais j ai beau essayé les différentes écriture je tombe toujours sur une nouvelle erreur.

Code :
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
Private Sub Flux_AfterUpdate()
 
Dim oRst As DAO.Recordset
Dim oDb As DAO.Database
Dim sCurrencyR As String
Dim sDev As String
Dim dDate As Date
 
sDev = [Forms]![NewFournisseur]![Fourn Sous-formulaire3].[Form]![Modifiable10]
dDate = [Forms]![NewFournisseur]![Benchmark Sous-formulaire7].[Form]![Investment date]
 
 
Set oDb = CurrentDb
Set oRst = oDb.OpenRecordset( _
    "SELECT TOP 1 CurrencyRate.CurrencyeRateR" _
      & " FROM DateCurrency INNER JOIN CurrencyRate ON DateCurrency.NumAutoDate = CurrencyRate.CurrencyDate" _
      & " WHERE (((CurrencyRate.CurrencyR) = '" & sDev & "'))" _
      & " ORDER BY Abs(CLng([DateCur])-CLng(#" & Format(dDate, "mm/dd/yyyy") & "#));", dbOpenDynaset)
 
MsgBox "le taux est de : " & rst.Fields("CurrencyeRateR").Value
oDb.Close
oRst.Close
 
Set oDb = Nothing
Set oRst = Nothing
 
[Forms]![NewFournisseur]![Texte14] = "sCurrencyR"
 
End Sub
Au moment ou j'ecris ces lignes je suis confronté à l'Erreur d execution 424, Objet requis au niveau du message box.

Merci par avance pour votre aidre
Marius76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2011, 18h25   #8
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 410
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 410
Points : 4 439
Points : 4 439
déjà le RecordSet se nomme oRst:
Code :
1
2
MsgBox "le taux est de : " & oRst.Fields("CurrencyeRateR").Value
f-leb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2011, 15h19   #9
Invité régulier
 
Marius Pipeau
Inscription : octobre 2010
Messages : 35
Détails du profil
Informations personnelles :
Nom : Marius Pipeau

Informations forums :
Inscription : octobre 2010
Messages : 35
Points : 9
Points : 9
Bonjour tout le monde et merci f_leb pour ton aide.

J ai passé plusieurs heures à essayer de résoudre le problème mais je n ai pas réussi à me familiariser avec les Recordset. Au final je dois avouer que je l ai joué petit bras et que j ai résolu tout cela avec des Dlookup...
Je poste la fonction que j ai mise en place et qui marche parfaitement pour que si un d'entre vous avait un peu de temps à perdre puisse me dire ce qui n allait pas

Code :
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
Public Function ExchangeRate(EnterDate As Date, EnterCurrency As String) As Double
 
Dim a As Integer
Dim varDate As Date
Dim varDateplus As Date
Dim varDatemoins As Date
Dim dNumCur As Single
Dim iNumCurDate As Integer
 
'principe : on arrondit les dates au premier du mois pour pouvoir ensuite parcourir le temps jusqu'à trouver la bonne
'date. Ceci implique par contre que les taux de change entrés le soient au 01/XX/XXXX
 
If EnterCurrency <> "€" Then
    varDate = EnterDate
    a = 0
    'initialise la variable date à la date d'investissement/sortie et on la ramène au premier du mois
    varDate = DateSerial(Year(varDate), Month(varDate), 1)
 
    'création de varibles qui vont s'incrémenter et se décrémenter pour parcourir la table des dates afin de trouver la date la plus prochce
    If Month(varDate) = 12 Then
    varDateplus = DateSerial(Year(varDate) + 1, 1, 1)
    Else
    varDateplus = DateSerial(Year(varDate), Month(varDate) + 1, 1)
    End If
    If Month(varDate) = 1 Then
    varDatemoins = DateSerial(Year(varDate) - 1, 12, 1)
    Else
    varDatemoins = DateSerial(Year(varDate), Month(varDate) - 1, 1)
    End If
 
 
    'tant que date plus proche non trouvée (a=0) on rajoute/enlève un mois aux variables
    Do While (a = 0)
 
    If IsNull(DLookup("[NumAutoDate]", "DateCurrency", "[DateCur] = #" & Format(varDate, "mm/dd/yyyy") & "#")) = "True" Then
 
        If IsNull(DLookup("[NumAutoDate]", "DateCurrency", "[DateCur] = #" & Format(varDateplus, "mm/dd/yyyy") & "#")) = "True" Then
 
            If IsNull(DLookup("[NumAutoDate]", "DateCurrency", "[DateCur] = #" & Format(varDatemoins, "mm/dd/yyyy") & "#")) = "True" Then
 
                If Month(varDatemoins) = 1 Then
                varDatemoins = DateSerial(Year(varDatemoins) - 1, 12, 1)
                Else
                varDatemoins = DateSerial(Year(varDatemoins), Month(varDatemoins) - 1, 1)
                End If
 
            Else
            a = 1
            varDate = varDatemoins
            End If
 
            If Month(varDateplus) = 12 Then
            varDateplus = DateSerial(Year(varDateplus) + 1, 1, 1)
            Else
            varDateplus = DateSerial(Year(varDateplus), Month(varDateplus) + 1, 1)
            End If
 
        Else
        a = 1
        varDate = varDateplus
        End If
 
    Else
    a = 1
    End If
 
    Loop
 
    iNumCurDate = (DLookup("[NumAutoDate]", "DateCurrency", "[DateCur] = #" & Format(varDate, "mm/dd/yyyy") & "#"))
    ExchangeRate = (DLookup("[CurrencyeRateR]", "CurrencyRate", "[CurrencyDate] = " & iNumCurDate & "And [CurrencyR] ='" & EnterCurrency & "'"))
 'sinon c'est deja en euro
 Else
 ExchangeRate = 1
 
 End If
Encore merci pour ton aide f leb.
Marius76 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 07h05.


 
 
 
 
Partenaires

Hébergement Web