IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

IHM Discussion :

Recherche date la plus proche


Sujet :

IHM

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 35
    Points : 26
    Points
    26
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !)

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 35
    Points : 26
    Points
    26
    Par défaut
    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 : 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
    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

  3. #3
    Invité
    Invité(e)
    Par défaut
    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

  4. #4
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 629
    Points : 56 892
    Points
    56 892
    Billets dans le blog
    40
    Par défaut
    bonsoir,

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ... FROM TDate INNER JOIN CurrencyRate 
    ON TDate.NumAutoDate = CurrencyRate.CurrencyDate...

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 35
    Points : 26
    Points
    26
    Par défaut
    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 : 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
    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

  6. #6
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 629
    Points : 56 892
    Points
    56 892
    Billets dans le blog
    40
    Par défaut
    bonsoir Marius76,

    je tenterais bien:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    & " ORDER BY Abs(CLng([DateCur])-CLng(#" & format(dDate,"mm/dd/yyyy") & "#));"

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 35
    Points : 26
    Points
    26
    Par défaut
    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 : 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
    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

  8. #8
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 629
    Points : 56 892
    Points
    56 892
    Billets dans le blog
    40
    Par défaut
    déjà le RecordSet se nomme oRst:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MsgBox "le taux est de : " & oRst.Fields("CurrencyeRateR").Value

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 35
    Points : 26
    Points
    26
    Par défaut
    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 : 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
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Recherche donnée à la date la plus proche
    Par Fabfab750 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 28/05/2014, 16h23
  2. Rechercher la date la plus proche
    Par Seth77 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 08/04/2014, 16h27
  3. [XL-2007] Recherche date la plus proche d'aujourd'hui
    Par XceSs dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 23/04/2013, 02h28
  4. [Transact SQL] Rechercher numero le plus proche
    Par jowsuket dans le forum Langage SQL
    Réponses: 2
    Dernier message: 21/03/2007, 13h31
  5. [FireBird] date la plus proche
    Par gudul dans le forum Langage SQL
    Réponses: 1
    Dernier message: 16/05/2006, 09h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo