Forum des développeurs  

Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé.
Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Microsoft Office > Access > VBA Access

VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.

Réponse
 
Outils de la discussion
Vieux 05/10/2008, 14h28   #1 (permalink)
Invité de passage
 
Date d'inscription: octobre 2008
Messages: 3
Par défaut [Résolu] Diffdate() réparti par mois

Bonjour,

Je suis un petit nouveau sur le forum (nouveau à poster mais je vous lis depuis longtemps et vous m'avez souvent dépannés donc merci déjà pour le passé.)

Je suis aujourd'hui face à un "problème" pour lequel je ne trouve pas de solution.

En fait j'ai une table de personnes qui partent en voyage (professionnel).
Ils partent entre une date A et une date B.

Comme elles sont payées entre ces 2 dates (WE compris), on me demande de calculer le nombre de jours passés entre date A et date B. Jusqu'ici pas de problème (avec un diffdate() ça marche impeccable).

Mais, pour du reporting, on me demande également de sortir un graphe du nombre de jours passés en voyage PAR MOIS. Et là mon Diffdate ne me suffit plus. En effet si la personne part le 15 septembre et rentre le 15 novembre, je voudrais une fonction (ou une requête) qui me retourne :
  • Septembre : 15 jours
  • Octobre : 31 jours
  • Novembre : 15 jours.

Avez-vous une idée de comment faire de la manière la plus "automatique" possible ? (je voudrais éviter de créer une colonne par mois avec des conditions SI dans tous les sens pour chaque mois des 10 prochaines années...).

Thomas

Dernière modification par Toma63 ; 23/10/2008 à 11h13
Toma63 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 06/10/2008, 10h44   #2 (permalink)
Membre éclairé
 
Date d'inscription: juillet 2006
Localisation: midi
Âge: 63
Messages: 351
Par défaut

Bonjour et bienvenu sur le forum,
Je verrai bien pour ne pas faire trop compliqué :
Création d’une table qui récupère, les absences triées par voyageurs et jour.
Code à mettre par exemple sur évènement d’un bouton de commande sur un formulaire.

Puis requêtes sur cette table avec extraction et sommation des critères retenus.
Requête d’extraction
Code :
SELECT JourAbs_T.VoyageurT, Month([JourAbs]) AS MoisD, Count(JourAbs_T.VoyageurT) AS CompteDeVoyageurT, Year([JourAbs_T]![JourAbs]) AS AnneeAb
FROM JourAbs_T
GROUP BY JourAbs_T.VoyageurT, Month([JourAbs]), Year([JourAbs_T]![JourAbs]);
 
Requête de Synthèse pour TCD et/ou GRAF
Code :
SELECT [JourAbs_R Requête].[VoyageurT], [JourAbs_R Requête].[CompteDeVoyageurT], [MoisD] & "/" & [AnneeAb] AS MoisAbs
FROM [JourAbs_R Requête]
ORDER BY [JourAbs_R Requête].[VoyageurT], [JourAbs_R Requête].[AnneeAb], [MoisD] & "/" & [AnneeAb];
 
code a mettre sur click du bouton sur form :
Code :
Private Sub Commande9_Click()
triJour 'fonction sur module1
End Sub
fonction :
Code :
Function triJour()
Dim cnc As ADODB.Connection
 
Dim rstVoy As New ADODB.Recordset
Dim rstJ As New ADODB.Recordset
Dim DateRef As Date
'on efface le contenu de la table
DoCmd.SetWarnings False
'Efface le contenu de la table
DoCmd.RunSQL "DELETE * FROM JourAbs_T;"
'Retablit les confirmations
DoCmd.SetWarnings True
 
 
Set cnc = CurrentProject.Connection
 
rstVoy.Open "Voyage_T", cnc, adOpenForwardOnly, adLockOptimistic
rstJ.Open "JourAbs_T", cnc, adOpenForwardOnly, adLockOptimistic
    Do While Not rstVoy.EOF 'boucle sur la table base ici Voyage_T
    Voy = rstVoy("Voyageur")
    DateRef = rstVoy("DateDep")
    
        While DateRef <> rstVoy("DateRet") 'on affecte les infos à la table destinataire
      With rstJ
    .AddNew
    .Fields("VoyageurT") = Voy
    .Fields("JourAbs") = DateRef
    .Update
     End With
       
        DateRef = DateRef + 1
        
        rstJ.MoveNext
        Wend
    rstVoy.MoveNext
    Loop
    
    
End Function
 
Ci-joint exemple d’application de cette méthode, mais il y en a d’autres à développer bien sur,

A bientôt.

Dernière modification par LE VIEUX ; 04/11/2008 à 21h20
LE VIEUX est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 08/10/2008, 13h59   #3 (permalink)
Invité de passage
 
Date d'inscription: octobre 2008
Messages: 3
Par défaut

Bonjour Vieux,

Tout d'abord merci pour le temps que tu as passé et la clarté des explications.
Si je comprends bien il n'y a pas de fonction existante qui permettent de compter le nombre de jour entre 2 dates en les ventilant par mois.

Je ne suis pas un pro du VBA mais je vais essayé de comprendre ta fonction pour l'appliquer à ma base (du coup je risque de passer un peu de temps , surtout que les vacances commencent ce soir pour moi !).

Je reviendrai vers toi (vous) si j'ai des questions plus précises sur le code.

Merci encore,

Thomas
Toma63 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 08/10/2008, 14h36   #4 (permalink)
Membre éclairé
 
Date d'inscription: juillet 2006
Localisation: midi
Âge: 63
Messages: 351
Par défaut

Bonjour et surtout bonnes vacances, surtout si tes préoccupations informatiques relèvent du boulot, oublies les bien sur, on sera là à ton retour.
Merci pour le « merci » c’est tout ce que l’on demande en retour de nos interventions bénévoles, le temps ma foi, ce n’est qu’une question d’appréciation, et j’ai plus appris sur ACCESS en essayant d’aider les autres qu’en me préoccupant que de mes seuls besoins.
Petit oubli dans mon post concernant VBA, j’ai utilisé dans mon code un accès aux données concernant les fonctions d’ADO, il faut donc ajouter la référence adéquate :
Soit dans VBA :
Outils
Références
Cocher : Microsoft ActiveX Data Objects 2.8 Library

Donc a ton retour….
LE VIEUX est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 23/10/2008, 11h12   #5 (permalink)
Invité de passage
 
Date d'inscription: octobre 2008
Messages: 3
Par défaut Merci encore ça a bien fonctionné

Merci Vieux,

J'ai utilisé en grande partie ton code pour l'adapter à mon indicateur et ça marche à merveille. Du coup ça m'a permis d'apprendre un peu plus à manipuler le VBA (mais il reste encore du travail...).

On peut donc considérer le sujet comme [Résolu].

Thomas
Toma63 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 23/10/2008, 14h06   #6 (permalink)
Membre éclairé
 
Date d'inscription: juillet 2006
Localisation: midi
Âge: 63
Messages: 351
Par défaut

bonjour,
satisfait si j'ai pu t'aider,
comme tu le signales si tu considères ce post comme résolu, penses à cliquer sur "RESOLU"
et bien sur à + si besoin
LE VIEUX est déconnecté   Envoyer un message privé Réponse avec citation
Réponse

Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Microsoft Office > Access > VBA Access

 
Offres d' emploi informatique sur Lesjeudis.com


Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide