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 :

Problème de dates avec VBA [AC-2003]


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de Ric500
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 980
    Par défaut Problème de dates avec VBA
    Bonjour à tous!

    Je me heurte à un problème concernant une table comportant les colonnes "DateOpe" (format: "jj/mm/aaaa hh:nn:ss") ,"Débit", "Crédit", "Solde". La colonne "DateOpe" pouvant, en fonction des traitements, recevoir des valeurs en doublons. Bien entendu lors du calcul du solde en date, cela fausse les calculs.

    J'ai donc développé la routine récursive suivante en VBA afin de corriger cela en rajoutant une minute à toutes les dates en double.

    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
    Sub MAJDoublonsDates411()
              Dim StrSQL As String, mabd As Database, MRec As Recordset, MRec2 As Recordset, Crit As String, DteCurr As String, Dte2Compare As Date
              Set mabd = CurrentDb()
              StrSQL = "SELECT CPTE_CAISSE_Cli.CCDat, CPTE_CAISSE_Cli.CCCpt " & _
                                  "From CPTE_CAISSE_Cli " & _
                                  "WHERE CPTE_CAISSE_Cli.CCDat In (SELECT [CCDat] FROM [CPTE_CAISSE_Cli] As Tmp GROUP BY [CCDat] HAVING Count(*)>1 ) " & _
                                  "ORDER BY CPTE_CAISSE_Cli.CCDat;"
     
    StartHere:
              Set MRec = mabd.OpenRecordset(StrSQL)
              With MRec
                        Do While .EOF = False
                                  .MoveFirst
                                  DteCurr = Format(!CCDat, "yyyymmddhhnnss")
                                  Dte2Compare = !CCDat
                                  Crit = "format(CCDat,'yyyymmddhhnnss')=" & DteCurr
                                  StrSQL = "SELECT CCDat, CCLib FROM CPTE_CAISSE_Cli WHERE " & Crit & " ORDER BY CCDat;"
                                  Set MRec2 = mabd.OpenRecordset(StrSQL)
                                  Do While MRec2.EOF = False
                                            MRec2.Edit
                                            Dte2Compare = IIf(MRec2!CCLib = "REPORT", DateAdd("n", -1, Dte2Compare), DateAdd("n", 1, Dte2Compare))
                                            MRec2!CCDat = Dte2Compare
                                            MRec2.Update
                                            MRec2.MoveNext
                                  Loop
                                  MRec2.Close
                                  StrSQL = "SELECT CPTE_CAISSE_Cli.CCDat, CPTE_CAISSE_Cli.CCCpt " & _
                                                      "From CPTE_CAISSE_Cli " & _
                                                      "WHERE CPTE_CAISSE_Cli.CCDat In (SELECT [CCDat] FROM [CPTE_CAISSE_Cli] As Tmp GROUP BY [CCDat] HAVING Count(*)>1 ) " & _
                                                      "ORDER BY CPTE_CAISSE_Cli.CCDat;"
                                 .Close
                                 GoTo StartHere
                        Loop
              End With
    End Sub
    Le souci est que cela est trèèèès long à s'exécuter. Serait-il possible d'imaginer une requête SQL pouvant se charger du problème (pour ma part j'avoue que je cale ) ?

    Je vous en remercie d'avance.

  2. #2
    Membre émérite Avatar de Ric500
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 980
    Par défaut Dates avec VBA
    Bonjour, je généralise mon problème pour le rendre plus compréhensible.

    Basiquement j'ai une colonne "Date" qui peut comporter des doublons. Je souhaiterais pouvoir modifier ces dates (en double ou triple) en leur ajoutant une minute de manière à ce que chaque date soit unique.

    A l'heure actuelle j'ai une moulinette plus ou moins récursive, qui fait la chose suivante en VBA:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
       1°/ Déclaration d'un recordset MREC1 (ordonné par date) parcourant la table
       2°/ Tant que EOF est faux : 
               2 a- parcours de la table
               2 b- déclaration d'un second recordset MREC2 portant sur la même table, limité à à la date courante dans MREC1
               2 c- Tant que MREC2.EOF= Faux
               2 d- Ajout 1 minute à MREC2!Date
        3°/ déclaration d'un nouveau MRec1 avec critère de date > à la précédante (on part donc de la deuxième date de la table)
               3 a- Boucle sur le point n° 2°/
    J'ai essayé de passer une requête mise à jour au lieu du UPDATE sans amélioration des performances: avez-vous une idée ?

    Merci encore.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2010
    Messages : 56
    Par défaut
    Salut à toi,

    Concernant ton problème, je me pose une question : pourquoi tu n'arrives pas à calculer le solde en date .
    Si je suppose bien, dans ta table, tu dois avoir un champ unique pour chaque opération (clé primaire ou autre)
    Ensuite, tu fais une requête avec la dateOpe, débit et credit pour un client donnée, tu tries le tout par ordre croissant de ton champ unique et tu calcules le solde.

    Ou alors, j'ai loupé un truc,.....

  4. #4
    Membre émérite Avatar de Ric500
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 980
    Par défaut Dates avec VBA
    Bonsoir et merci de me répondre.

    tu as effectivement raison, j'ai bien une clé de type auto-incrément dans cette table. Le Problème est que, pour un code client donné, je ne peux pas trier sur la clé auto-incrément mais je dois absolument le faire sur une date.

    En d'autres termes, ma table peut se présenter comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    Clé        Date                         Débit      Crédit       Solde
     
     1        01/01/10 08:00:00              0           10           10
     2        01/01/10 08:01:00             50            0          -40
     3        01/01/10 08:01:00               0          40            0
    Et si je demande la somme de mes (Débit - Crédit) pour une date <= 01/01/10 08:01:00 j'aurai bien un solde=0 pour les deux dernières lignes.

    A moins que je zappe complètement une solution beaucoup plus simple

    Merci encore

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2010
    Messages : 56
    Par défaut
    On pourrais prendre le problème autrement :
    Quand est fait le calcul du solde ? A un moment précis ou à chaque fois qu'une nouvelle opération est saisie.

    Dans le second cas, il serait facile de prendre le dernière solde connu (tri sur la date), de faire le calcul du nouveau et de mettre à jour la table.

  6. #6
    Membre émérite Avatar de Ric500
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 980
    Par défaut Solde sur Débit/Crédit
    Tu as raison,

    Au final, j'ai tranché en intercalant une routine au moment du passage d'une écriture. Celle-ci teste l'unicité de la date et l'incrémente de une minute le cas échéant. Au final pas de doublons de dates et un solde juste.

    Je vous remercie de vos réponses et ajoute le tag résolu.

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

Discussions similaires

  1. Problème de date avec JAVA & Oracle
    Par bobic dans le forum JDBC
    Réponses: 2
    Dernier message: 02/11/2006, 12h21
  2. Problème de date en vba-access 2000
    Par rob2-9 dans le forum Access
    Réponses: 1
    Dernier message: 30/08/2006, 12h13
  3. [FPDF] Problème de date avec fdpf
    Par axel-erator dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 18/05/2006, 23h05
  4. Problème de date avec un trigger PL/SQL
    Par fluec-wa dans le forum PL/SQL
    Réponses: 6
    Dernier message: 18/01/2006, 14h56
  5. Encore un probléme de date avec TADO !
    Par bNoureddine dans le forum Bases de données
    Réponses: 2
    Dernier message: 22/02/2004, 18h22

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