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

VBA Access Discussion :

incrémenter une date par une période de temps


Sujet :

VBA Access

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 32
    Points : 19
    Points
    19
    Par défaut incrémenter une date par une période de temps
    bonjour et merci à tous pour vos précieux conseils,

    je vous explique mon probleme.

    j'ai une table "qualification" avec les champs :date-de_qualification (date initiale), frequence (en mois), date_de_fin. j'ai récupéré un code sur ce forum qui permet d'incrémenter la date de début en ajoutant la fréquence en mois jusqu'a la date de fin. le code ci-dessous est utilisé dans une requete "requete qualification date" qui fait appel à une table "lignes" qui comporte 50 lignes avec les valeurs suivantes: 1,2,3,4,....,50

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT qualification.id_qualification, qualification.date_qualification, qualification.frequence, qualification.commentaire, lignes.lignes, stpmp([lignes]) AS Date_de_relecture
    FROM lignes, equipement INNER JOIN qualification ON equipement.id_equipement = qualification.id_equipement
    ORDER BY lignes.lignes;
    code du module:

    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
    Function stpmp(lign As Long) As Date
    Dim base As DAO.Database
    Dim mesvaleurs As DAO.Recordset
    Dim sql As String
    Dim annif As Date
    Dim com As Date
    ' Initialisation de la date
    Dim cpte As Boolean
    cpte = True
    ' Requete
    Set base = CurrentDb
    sql = "SELECT id_qualification, date_qualification, frequence, lignes FROM [requete qualification date]" & _
    "WHERE (lignes <= " & lign & ")  ORDER BY lignes;"
    Set mesvaleurs = base.OpenRecordset(sql)
    While Not mesvaleurs.EOF
    ' prends Date de depart
    If cpte = True Then
    annif = mesvaleurs![date_qualification]
    cpte = False
    ' Sinon Ajoute fréquence
    Else
    annif = DateAdd("m", mesvaleurs![frequence], annif)
    End If
     
    com = DateAdd("m", mesvaleurs![frequence], annif)
     
    mesvaleurs.MoveNext
     
    Wend
    stpmp = com
    End Function
    si je met un seul enregistrement dans la table "qualification" le résultat de la requete est parfait. par contre si je met deux enregistrements, la requete me sort des abérations. j'aimerai savoir comment résoudre ce problème soit en changeant le code ou soit en envoyant le résultat de la requete dans ma table puis passer à un nouvelle enregistrement.
    cela fait deux jours que je trime et je suis à bout.
    merci à tous pour vos conseils

    PS le code vient de hugo 69, merci à lui

  2. #2
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Je n'ai pas compris

  3. #3
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 32
    Points : 19
    Points
    19
    Par défaut
    je vous explique, j'ai une table avec:

    id_qualification/date_qualifiquation/frequence/date_de_fin
    num auto / date /num /date

    si je met date_qualification = 01/02/2000
    frequence= 3 (mois)
    date_de_fin 01/01/2001
    je veux obtenir: 01/05/2000, 01/08/2000, 01/11/2000 comme résultat dans ma requete.
    il faut que le résultat soit visible et exploitable dans un formulaire qualification (sous formulaire repris sur la requete).

    l'objet du code est de donner les résultat suivant id_qualification.

    mon prob est que quand je génère un nouvelle enregistrement, il me donne des résultats abérant alors qu'avec un seul enregistrement j'obtients les bon.

    a+

  4. #4
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 086
    Points : 42 925
    Points
    42 925
    Par défaut
    Ce ne serait pas plus facile de donner la fréquence et le nombre d'occurrences.

    Et ensuite faire un test pour être certains que les deux dates finales sont égales.

    Ce serait plus facile.

  5. #5
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 32
    Points : 19
    Points
    19
    Par défaut
    si c'est plus facile je suis preneur, n'étant pas un programmteur mais plutot juste au niveau pour comprendre un code pré-écrit et le retranscrire pour mon application, si tu as un bout de code je me met à genoux car cela fait 2 jours que mon cerveau commence à réduire comme peau de chagrin.

    merci

  6. #6
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 086
    Points : 42 925
    Points
    42 925
    Par défaut
    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
     
    dim IntOcc as integer  'déclaration du nombre d'occurrence comme entier
    dim intFreq as integer
    dim strDates as string 'déclaration d'un variable qui contiendra les dates 
    'dans une chaîne
    dim dtQualif as date
    dtQualif = [date_qualification]
    strDates = ""   'attribution d'une valeur vide
    intFreq = [frequence] 'attribution de la valeur du contrôle fréquence
    intOcc = [occurences] 'attribution de la valeur occurences
     
    Do until intOcc = 0
    intOcc = intOcc -1
    dtQualif = Dateserial(year(dtQualif);Month(dtQualif)+intFreq;Day(dtQualif)
    strDates = strDates & "|" & Format(dtQualif;"dd/mm/yyyy")
    Loop
    La première partie concerne les déclarations de variables.
    La seconde, le passage de valeurs aux variables
    La dernière, le traitement.
    Le traitement se déroule comme suit :
    je diminue mon occurrence de 1 chaque fois qu'elle est traitée
    A chaque traitement, j'ajoute la fréquence au mois de l'année et je convertis en texte pour n'avoir qu'une seule chaîne "strDates" contenant toutes les dates.
    Si mon occurrence devient 0, la boucle s'arrête et le code continue.

    J'ai choisis de transformer les dates en texte, parce que je ne sais pas au départ combien d'occurrence je vais avoir.
    Mais avec une fonction split on peut les séparer.

  7. #7
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 32
    Points : 19
    Points
    19
    Par défaut
    merci pour ta réactivité, je me penche sur ton code et je reviens te dire ou j'en suis.
    a+

    au fait, ce code je le met ou? dans une requete?

  8. #8
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 086
    Points : 42 925
    Points
    42 925
    Par défaut
    Tu peux en faire une fonction ou encore le mettre dans un formulaire, Après Mise à jour d'un contrôle ou encore sur clic d'un bouton.

  9. #9
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 32
    Points : 19
    Points
    19
    Par défaut
    salut,

    le code tel que donné ne fonctionne pas.j J'ai modifier des ";" en "," puis j'ai essayé d'en faire une fonction:
    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
    Function stpmp(strDates As String) As String
    Dim IntOcc As Integer  'déclaration du nombre d'occurrence comme entier
    Dim intFreq As Integer
    Dim strDates As String 'déclaration d'un variable qui contiendra les dates
    'dans une chaîne
    Dim dtQualif As Date
    dtQualif = [date_qualification]
    strDates = ""   'attribution d'une valeur vide
    intFreq = [frequence] 'attribution de la valeur du contrôle fréquence
    IntOcc = [occurences] 'attribution de la valeur occurences
     
    Do Until IntOcc = 0
    IntOcc = IntOcc - 1
    dtQualif = Dateserial(year(dtQualif), Month(dtQualif) + intFreq, Day(dtQualif))
    strDates = strDates & "|" & Format(dtQualif, "dd/mm/yyyy")
    Loop
    End Function
    après j'appel lela fonction dans une requete:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT qualification.id_qualification, qualification.date_qualification, qualification.frequence, qualification.occurences, stpmp([strDates]) AS date_relecture
    FROM qualification;
    mais il me dit qu'il ne connait pas strDates et que la synthaxe est trop compliquée.

    je dois mal m'y prendre?
    a+

    pour info je fais mes essais avec juste une table qualification
    id_qualification (num auto), date_qualification (date), frequence (num), occurences (num)

  10. #10
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 086
    Points : 42 925
    Points
    42 925
    Par défaut
    Pour ne pas te laisser dans l'embarras, voilà comment le code fonctionne.
    Je l'ai mis sur l'évènement AfterUpdate du champ texte Date_Qualification.

    Il faut entrer en premier lieu, les occurrences et les fréquences.

    Ensuite la date et le résultat s'affiche dans le champs String_Dates.

    C'est déjà un premier pas.

  11. #11
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 32
    Points : 19
    Points
    19
    Par défaut
    mr Heureux tu es un génie

    la dernière question à 100 franc:

    peut on obtenir le résultat sous format date pour que je puisse utiliser les résultats dans une requete?

    tu as écrit: "Mais avec une fonction split on peut les séparer.", on l'utilise comment cette fonction?

    en tout cas je te remercie d'avoir consacré tout ce temps et sache que mon cerveau commence à dégonfler grace à toi.
    a+

  12. #12
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 086
    Points : 42 925
    Points
    42 925
    Par défaut
    Là, on se trouve face à un autre problème.
    Il faut inscrire les dates dans des champs pour pouvoir les utiliser.

    Je ne connais pas ta DB, mais je pense qu'il te faudra une table supplémentaire pour y retrouver toues tes dates.

    Ensuite, il ne te restera qu'a faire des requête pour extraire les données.

    Je vais chercher pour Splitter les données.

  13. #13
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 32
    Points : 19
    Points
    19
    Par défaut
    je met en fichier joint l'exemple de base que j'avais récupéré initialement et qui permet de récupérer les résultats au format date. le prob de cette base c'est que tu ne peux pas ajouter de nouveaux enregistrements sans que les résultats deviennent abérants. tu comprendras quand tu l'ouvriras.
    a+
    Fichiers attachés Fichiers attachés

  14. #14
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 086
    Points : 42 925
    Points
    42 925
    Par défaut
    Es-tu sûr que c'est le bon fichier ?

  15. #15
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 32
    Points : 19
    Points
    19
    Par défaut
    c'est effectivement le bon fichier mais là je t'envois le fichier avec les bons nom de champ. tu remarqueras que c'est la première requete qui appelle la fonction
    a+
    Fichiers attachés Fichiers attachés

  16. #16
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 086
    Points : 42 925
    Points
    42 925
    Par défaut
    De toute façon je suis en train de regarder comment mettre les données dans une table.

    J'espère avoir fini pour lundi.

  17. #17
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 32
    Points : 19
    Points
    19
    Par défaut
    t'es un chef, mais surtout ne consacre pas trop de temps à cela, le WE c'est sacré

  18. #18
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 086
    Points : 42 925
    Points
    42 925
    Par défaut
    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
    Private Sub date_Qualification_AfterUpdate()
    Dim IntOcc As Integer  'déclaration du nombre d'occurrence comme entier
    Dim intFreq As Integer
    Dim strDates As String 'déclaration d'un variable qui contiendra les dates
    'dans une chaîne
    Dim dtQualif As Date
    Dim stTableau() As String
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim fld As DAO.Field
     
    Set db = CurrentDb
    Set rs = db.OpenRecordset("Qualif2")
     
    dtQualif = [date_Qualification]
    strDates = ""   'attribution d'une valeur vide
    intFreq = [Frequence] 'attribution de la valeur du contrôle fréquence
    IntOcc = [Occurences] 'attribution de la valeur occurences
     
    Do Until IntOcc = 0
    IntOcc = IntOcc - 1
    Debug.Print IntOcc
    dtQualif = DateSerial(Year(dtQualif), Month(dtQualif) + intFreq, Day(dtQualif))
    rs.AddNew
    rs.Fields("id_Qualif").Value = Me.[id]
    rs.Fields("dtDate").Value = dtQualif
    rs.Update
    strDates = strDates & "|" & Format(dtQualif, "dd/mm/yyyy")
    Loop
    Me.String_date = strDates
    'Debug.Print stTableau(1) & vbCrLf & stTableau(2)
    Me.Qualif2_sous_formulaire.Requery
     
    db.Close
    'rs.Close
    Set rs = Nothing
    Set db = Nothing
     
    End Sub
    Voilà le code utilisé.
    On récupère les valeur dans les contrôles du formulaire.

    On fait une boucle pour incrémenter la date du nombre d'occurrences.
    Pour l'incrémentation de la date, j'ai choisis DateSerial, parce que je préfère.

    On insère les résultat dans une autre table qui est liée.

    On rafraîchit le sous-formulaire.

  19. #19
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 32
    Points : 19
    Points
    19
    Par défaut
    si il existe un dieu sur terre, c'est bien toi.
    je me prosterne et surtout je te remercie du temps que tu m'a consacré.
    c'est exactement ce que voulais faire. je suis sur que ton exemple pourra etre exploité par plein d'autre personne.
    encore merci!

  20. #20
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 086
    Points : 42 925
    Points
    42 925
    Par défaut
    Ne me jette pas trop de fleurs, je ne suis pas le meilleur, mas collègues sont bien plus forts.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [AC-2007] Comparer une date d'une table et une date saisie
    Par minooo dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 10/03/2019, 22h40
  2. Remplacer une date par une valeur
    Par sniper75 dans le forum SAS Base
    Réponses: 4
    Dernier message: 04/12/2012, 22h30
  3. incrémenter une date par une variable minute
    Par pchartier dans le forum Langage
    Réponses: 2
    Dernier message: 28/11/2012, 16h41
  4. [SQL]trier un sous formulaire par une date (par toujours connue)
    Par blin07 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 26/04/2007, 10h45
  5. Réponses: 7
    Dernier message: 22/11/2006, 10h14

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