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

Access Discussion :

Calcul complexe de date et période [AC-2007]


Sujet :

Access

  1. #1
    Membre à l'essai
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Février 2017
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication

    Informations forums :
    Inscription : Février 2017
    Messages : 34
    Points : 14
    Points
    14
    Par défaut Calcul complexe de date et période
    Bonjour à tous,

    Je me permet de vous demander (encore) votre aide.

    Je me fissure le cerveau et je suis sure que la solution est toute bête...

    Voilà mon problème :

    Je souhaite créer une base de location saisonnière avec plusieurs tarifs suivant la période. Basse saison, moyenne saison et haute saison.

    Dans une année, nous retrouvons plusieurs périodes. Exemple : Basse saison du 01 janvier au 01 mars ET du 01 octobre au 15 novembre (par exemple)
    Moyenne saison du 02 mars au 01 avril
    etc....

    Je n'arrive pas à intégrer mon tarif si la location chevauche deux période.
    Exemple : Location du 15 février au 15 mars
    Tarif basse saison du 15 février au 1er mars
    Tarif moyenne saison du 02 mars au 15 mars.

    Ma difficulté c'est que j'y arrive soit si c'est à cheval soit quand la réservation est dans la même période. Autrement je n'y arrive pas ...

    Help

    Merci d’avance à bientot

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 593
    Points : 34 249
    Points
    34 249
    Par défaut
    Salut,

    Partons du principe que tu veux faire un calcul du montant total du séjour (mon vocabulaire sera probablement différent du tien))

    l'idée ici serait de faire une fonction dans laquelle tu prends les dates de début et fin.

    Dans cette fonction, tu vas faire un parcours pour chacune des dates
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Dim dt As Date
    For dt = dtDebut To dtFin
    '
    Next dt
    et pour chaque date, tu récupères le montant qui correspond à la période

    Tu sommes à chaque date le montant total, et tu retournes la valeur en sortie
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Perso, je ne vois pas de solution simple.

    La méthode qui me paraît la plus facile serait une fonction VBA à qui tu passes le début et la fin de ta location et qui découpe cette période en fonction des périodes d'achalandage et qui te retourne un prix.

    Sinon on doit pouvoir arriver au même résultat avec du SQL et une requête qui prend en entrée les périodes d'achalandage et détermine pour chaque période d'achalandage le nombre de jours de la réservation qui y sont inclus. L'avantage de la requête c'est que tu peux facilement voir avoir combien de jours ont été facturés à quel prix.

    Ça donnerai un truc du genre

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select [tblTarifPeriode].*, [prmDateDebutReservation] as DateDebutReservation, [prmDateFinReservation] as DateFinReservation, nbJourPeriodeAchalandage as [ici le calcul en fonction des dates].
    from [tblPeriode]

    où [ici le calcul en fonction des dates] est déterminé par les intersections.

    1. Est-ce que la réservation commence et fini dans la période ? Si oui, nbJourPeriode=nbJourReservation
    2. Est-ce que la réservation commence dans la période et se termine après la fin de période ? Si oui, nbJourPeriode=(DateFinPeriode - DateDebutReservation) + 1
    3. Est-ce que la réservation commence avant la période et se termine dans la période ? Si oui, nbJourPeriode=(DateFinReservation - DateDebutPeriode) + 1
    4. Est-ce que la réservation englobe la période ? Si oui, nbJourPeriode=nbJourPeriode.


    Comme cela fait une formule assez compliqué, je te recommande d'écrire une fonction VBA pour le faire. Ça sera plus compréhensible qu'une série de iif() imbriqués.

    Une fois au point, il faudra éliminé les résultats où le nombre de jours est 0 qui ne servent à rien.


    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Février 2017
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication

    Informations forums :
    Inscription : Février 2017
    Messages : 34
    Points : 14
    Points
    14
    Par défaut
    Je comprend la démarche ou presque lol
    Si je comprend bien, cette fonction va additionner le nombre de jour par période ?

    J'ai une table location : Nom ; Date_Début ; Date_Fin
    Et une table période : Id_Période ; Date_Début_Période ; Date_Fin_Période ; Tarif_Jour

    Question d'un novice
    ou mettre cette fonction ?

    Merci beaucoup

  5. #5
    Membre à l'essai
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Février 2017
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication

    Informations forums :
    Inscription : Février 2017
    Messages : 34
    Points : 14
    Points
    14
    Par défaut
    Ok Merci.

    Je comprend maintenant pourquoi mon cerveau fissure. Mdr

    Je comprend bien que sans sql ou vba c'est compliqué...

    Mes connaissances dans ses langages sont "null". Beaucoup de débrouille avec se que je peux chiner dans des tuto ou autre modèle.

    Si c'est pas simple, me voilà parti à faire une multitude de requête basique... un chemin de croix.


    Est ce que par hasard vous connaîtriez un modèle pour ce genre d'application ?

    En tout cas merci de votre aide. Je vais tester vos conseils comme je peux ....

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Pour les modèles, non je n'en connais pas mais il en existe peut-être.

    Pour simplifier, tu pourrais peut-être faire 4 requêtes correspondant au 4 cas précédents (englobant, début, fin, englobé).
    Ça devrait être assez simple à créer, juste les champs et des critères et le calcul des jours par différence de date et du prix associé.
    Pour les paramètres si tu as un formulaire ouvert tu peux mettre [Forms]![NomTonFormReservation]![DateDebut] et [Forms]![NomTonFormReservation]![DateFin]. Access ira les chercher là.

    Puis une requête d'union qui va les mettre bout à bout.
    La requête UNION ne peut être "dessinée", il faut la taper en SQL mais si tu as bien pris soin que tes requêtes ait le même nombre de champs visibles, la syntaxe est aussi simple que
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select reqEnglobant.* from reqEnglobant
    union all select reqDebut.* from reqDebut
    union all select reqFin.* from reqFin
    union all select reqEnglobe.* from reqEnglobe

    Le * signifie "prend tous les champs".

    En ajoutant une ligne de SQL à la fois et en validant au fur et à mesure pour être certain.

    C'est un peu plus complexe que la solution avec une seule requête mais comme tu n'as que 4 cas, ça reste gérable.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Février 2017
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication

    Informations forums :
    Inscription : Février 2017
    Messages : 34
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par marot_r Voir le message
    1. Est-ce que la réservation commence et fini dans la période ? Si oui, nbJourPeriode=nbJourReservation
    2. Est-ce que la réservation commence dans la période et se termine après la fin de période ? Si oui, nbJourPeriode=(DateFinPeriode - DateDebutReservation) + 1
    3. Est-ce que la réservation commence avant la période et se termine dans la période ? Si oui, nbJourPeriode=(DateFinReservation - DateDebutPeriode) + 1
    4. Est-ce que la réservation englobe la période ? Si oui, nbJourPeriode=nbJourPeriode.

    A+
    RE,

    Alors j'ai un début de quelque chose en faisant un test simple sur 3 mois et 3 saisons (BS[basse saison ; 01/01/20 au 31/01/2020] , MS[Moyenne saison ; 01/02/20 au 29/02/20] et HS[haute saison ; 01/03/2020 au 31/03/20]
    Donc simple

    J'ai fait une requête avec les conditions que vous m'avez donné ci dessus.

    R1 - Est-ce que la réservation commence et fini dans la période ? Si oui, nbJourPeriode=nbJourReservation
    R2 - Est-ce que la réservation commence dans la période et se termine après la fin de période ? Si oui, nbJourPeriode=(DateFinPeriode - DateDebutReservation) + 1
    R3 - Est-ce que la réservation commence avant la période et se termine dans la période ? Si oui, nbJourPeriode=(DateFinReservation - DateDebutPeriode) + 1
    R4 - Est-ce que la réservation englobe la période ? Si oui, nbJourPeriode=nbJourPeriode.

    J'ai simulé une location du 01/01/20 au 15/02/20
    Youpi !
    Resultat :
    R1 = 31 jours
    R2 = 15 jours
    R3 = -14 jours
    R4 = 0 jours

    Somme : 32 jours ...

    J'ai tenté de retourner le calcul ... re

    Je retente demain
    Je crois que j'ai un problème avec nbJourPeriode et nbJourReservation.

  8. #8
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Fait le une requête à la fois. Une fois ton calcul au point pour l'une, passer à l'autre devrait être plus aisé.

    Tu peux aussi poster le SQL :
    1. dans l'éditeur de requête, changer l'affichage pour SQL avec l'icône en haut à gauche
    2. sélectionner tout et copier.
    3. Coller dans ton message.


    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  9. #9
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 593
    Points : 34 249
    Points
    34 249
    Par défaut
    Salut,

    si jamais tu te poses la question du parcours des dates uniquement par SQL, ca rejoint le défi suivant :
    https://www.developpez.net/forums/d7...registrements/
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  10. #10
    Membre à l'essai
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Février 2017
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication

    Informations forums :
    Inscription : Février 2017
    Messages : 34
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par marot_r Voir le message
    Bonjour.



    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select [tblTarifPeriode].*, [prmDateDebutReservation] as DateDebutReservation, [prmDateFinReservation] as DateFinReservation, nbJourPeriodeAchalandage as [ici le calcul en fonction des dates].
    from [tblPeriode]


    1. Est-ce que la réservation commence et fini dans la période ? Si oui, nbJourPeriode=nbJourReservation
    2. Est-ce que la réservation commence dans la période et se termine après la fin de période ? Si oui, nbJourPeriode=(DateFinPeriode - DateDebutReservation) + 1
    3. Est-ce que la réservation commence avant la période et se termine dans la période ? Si oui, nbJourPeriode=(DateFinReservation - DateDebutPeriode) + 1
    4. Est-ce que la réservation englobe la période ? Si oui, nbJourPeriode=nbJourPeriode.


    A+
    Bonjour,

    Aprés quelque test, c'est pas bon. Je ne voulais pas passer par le SQL vu que n'y connait rien. donc vu que j'ai loupé une étape ... patatrak !

    Je me lance donc dans le SQL! lol

    En tout cas, merci de votre patience.

    Alors j'ai 3 tables :
    Location : Id_Loc_ (n° Facture), Nom , DDR (pour Date début de réservation), DFR (pour Date Fin de réservation)
    Période : Id_période (BS1 pour Basse Saison, etc...), TP_DDP (pour Date Début Période), TP_DFP (pour Date Fin de période)
    Tarif : Id-période (lié a la table Période), Tarif_P (pour le tarif de la période)

    J'ai essayé de reprendre votre code SQL ci dessus.

    1 - prmDateDebutReservation > ? Prm ?
    2 - from [tblPeriode] > s'agit-il bien de la même table que moi sus nommé 'période' ?
    3 - nbJourPeriodeAchalandage as [ici le calcul en fonction des dates] > Ici on calcul le nombre de jour DFR - DDR ? Achalandage ?
    4 -

    Je pars de zero en SQL. dsl si ca vous parait bete ...

  11. #11
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Je pars de zero en SQL. dsl si ca vous parait bete ...
    Et où penses-tu qu'on a tous commencé ? Directement au niveau "Expert" ? :-).

    Bon revenons à ton problème, je t'ai fait une maquette avec les requêtes et un formulaire (frmReservation) pour visualiser le résultat.
    Ça sera plus rapide qu'un long discours.
    J'ai éliminé le besoin de paramètre en utilisant un sous-formulaire pour afficher le résultat.
    Ça filtre automatiquement sur la réservation en cours.
    Les requêtes de calcul sont inutilement détaillées (on aurait pu juste afficher le prix par période) mais j'ai pensé que ce serait plus clair comme cela.
    Les histoires d'intervales de dates c'est toujours un peu casse-tête.

    Note qu'à part pour la requête Union je n'ai pas écrit de code SQL directement.
    Les 4 requêtes de calcul on été faites seulement avec l'éditeur de requêtes d'Access.
    C'est généralement la méthode la plus simple, moins on voit de SQL dans Access mieux on se porte :-).

    ResrevationPeriode.zip

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  12. #12
    Membre à l'essai
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Février 2017
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication

    Informations forums :
    Inscription : Février 2017
    Messages : 34
    Points : 14
    Points
    14
    Par défaut
    Bonjour,

    Je viens de prendre connaissance du fichier.

    SUPER ! çà semble correct ! Re Super !

    J'étais bien parti en suivant vos indications. Sauf que, manque de connaissance suffisante et/ou d’expérience, je me suis compliqué la vie avec les calculs dans les requêtes.

    La requête "Union" simplifie la chose. Je n'aurai pas pu la faire seul... je vais décortiquer point par point pour en prendre exemple dans mes futures " " création " ".

    Je vais pouvoir mettre cette discution en résolu.

    Merci infiniment à marot_r. Merci++++

    Merci à tous.

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

Discussions similaires

  1. [AC-2013] Calcul d'un nombre de périodes entre 2 dates
    Par Gogov dans le forum Access
    Réponses: 3
    Dernier message: 23/02/2018, 18h21
  2. Réponses: 8
    Dernier message: 19/10/2012, 13h28
  3. Calcul entre deux dates heures
    Par Isa31 dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 31/03/2005, 13h17
  4. Mauvais résultat aprés une formule de calcul complexe
    Par poufouille dans le forum Bases de données
    Réponses: 3
    Dernier message: 10/12/2004, 00h12
  5. Calcul + Format de DATE
    Par cassi2 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 03/11/2004, 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