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 temporisation ?


Sujet :

VBA Access

  1. #1
    Membre habitué Avatar de Cabos
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2010
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 108
    Points : 156
    Points
    156
    Par défaut Problème de temporisation ?
    Bonjour,

    De nouveau confronté à un problème qui me dépasse, je fais appel aux lumières des utilisateurs de ce forum qui m'ont déjà été très utiles à plusieurs reprises.

    Tout d'abord, si le titre porte un point d'interrogation, c'est bien parce que je ne le cible pas très bien, et je me plante peut être totalement dans cette approche (problème de temporisation).

    Mon problème concerne ce bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        'Affectation du Recordset de la table AVISTA des BL, filtrée sur les BL, le transporteur et la date
        sql = "SELECT * FROM dbo_tt_lftbkopf WHERE lf_nummer LIKE 'BL*' AND va_id=30 AND lf_datum >=#" & datBL & "# AND lf_datum <#" & datBLmax & "#"
        Set R_BL = CurrentDb.OpenRecordset(sql, dbOpenDynaset)
     
        'Affichage de la fenêtre de comptage et initialisation
        Forms![F1300_ACC_FACTURES].[ZMES].Visible = True
        cptenr = 1
    Si j'exécute ce code en pas à pas, il fonctionne.
    Si je place un "Stop", ou un "Msgbox" quelconque entre l'affectation du recordset et l'affichage de la fenêtre de comptage, il fonctionne
    Si j'exécute ce code tel qu'il est, sans rien ajouter et en continu...il plante !!! La fenêtre ne s'affiche pas, et ACCESS ne répond plus...

    Quelqu'un aurait-il déjà été confronté à ce genre de problème ? Ou aurait un début d'idée pour mieux le cerner ?

    Merci de votre aide.
    Selon les points de vue, on peut être un chic type ou juste un trou du c...

  2. #2
    Membre habitué Avatar de Cabos
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2010
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 108
    Points : 156
    Points
    156
    Par défaut
    C'est même encore plus tordu que cela.

    Un msgbox entre les deux traitements laissera apparaître la boite d'affichage, mais celle-ci est ensuite instruite un peu plus loin dans le traitement.

    Si je me "contente" de bloquer le programme à ce stade, j'ai donc bien la boite... mais pas les affichages ! Il faut que je bloque le programme au moins de façon régulière pour que la boite instruite s'affiche correctement !

    Je vais faire des essais pour savoir à quelle fréquence minimale il faut provoquer ces blocages pour que cela marche...

    J'avoue ne pas très bien comprendre...
    Selon les points de vue, on peut être un chic type ou juste un trou du c...

  3. #3
    Membre habitué Avatar de Cabos
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2010
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 108
    Points : 156
    Points
    156
    Par défaut
    Pour bien me faire comprendre, j'explique [très] sommairement ce que je souhaite faire :

    -> ouverture d'un fichier issu d'une base SQL (Recordset 1)
    -> ouverture d'un fichier issu d'une importation automatique CSV (Recordset 2)
    -> traitement de chaque enregistrement du Recordset 2 en fonction des données correspondantes du Recordset 1

    Il s'agit d'un traitement de facture, donc à chaque fois, les recordset peuvent avoir des tailles très différentes. En l’occurrence, Recordset 1 fait environ 3300 lignes, et Recordset 2 4500.

    Le traitement est long, et donne l'impression à l'utilisateur qu'il ne se passe rien (quand vous les habituez à aller vite !...). J'ai donc voulu mettre en place l'affichage d'un compteur du genre "vous en êtes à l'enregistrement x sur y".

    Comme rien ne s'affichait, j'ai pensé que le programme se plantait, mais en fait, c'est autre chose :

    Si je provoque une sortie de la procédure à enregistrement = 0, j'obtiens le cadre d'affichage du compteur sans rien dedans (normal, puisque je suis sorti à 0 !).

    Si je provoque cette même sortie à enregistrement = 10, je n'obtiens pas les affichages 1,2,3,... jusqu'à 10, comme cela se produit en exécution pas à pas, mais directement "vous en êtes à l'enregistrement 10 sur 4500" à la fin du traitement !

    Forcément, 10 ça va encore vite, même avec un traitement lourd (pas à ce point tout de même !), donc on se dit : j'ai peut-être pas eu le temps de les voir s'afficher.

    J'ai donc refait la manip avec 100 et 500 cette fois. Même avec de mauvais yeux comme les miens, on a quand même le temps de voir quelque chose ! Et bien en fait, rien du tout. L'affichage (qui est pourtant bien en tête de boucle, directement derrière le Do while...) ne se fait qu'à la fin du traitement.

    Conclusion : mon programme ne plante pas; c'est juste qu'il est très long, et que l'affichage ne se fait qu'au dernier enregistrement traité... Mais pourquoi diable ?....

    Allez, comme je sais qu'on ne me croira pas sur parole, je montre le code :

    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
     
        'Affectation du Recordset de la table AVISTA des BL, filtrée sur les BL, le transporteur et la date
        sql = "SELECT * FROM dbo_tt_lftbkopf WHERE lf_nummer LIKE 'BL*' AND va_id=30 AND lf_datum >=#" & datBL & "# AND lf_datum <#" & datBLmax & "#"
        Set R_BL = CurrentDb.OpenRecordset(sql, dbOpenDynaset)
     
        'Affichage de la fenêtre de comptage et initialisation
        Forms![F1300_ACC_FACTURES].[ZMES].Visible = True
        cptenr = 1
     
        ' Traitement des informations
        Do While R_FACMAG.EOF = False
     
        'Affichage de l'enregistrement traité
        Forms![F1300_ACC_FACTURES].[ZMES].Value = "Traitement en cours de la ligne n° " & vbCrLf & Str(cptenr) & " / " & Str(R_FACMAG.RecordCount)
     
            Select Case R_FACMAG(1)
     
                Case "COL"
     
                    'Traitement des données (à l'origine il y avait plusieurs cas, d'où le choix du Case plutôt que du If, surtout que cela pourrait se reproduire par la suite)
     
            End Select
     
            'Incrément du compteur d'enregistrements traités
            cptenr = cptenr + 1
     
            R_FACMAG.MoveNext
     
        Loop
    Selon les points de vue, on peut être un chic type ou juste un trou du c...

  4. #4
    Membre habitué Avatar de Cabos
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2010
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 108
    Points : 156
    Points
    156
    Par défaut
    Bon, là, je me noie de plus en plus !

    J'ai pensé à un problème d'actualisation de ma zone de texte. J'ai donc créé un Control, affecté à ma zone de texte, et placé une commande d'actualisation (DoCmd.Requery control.name).

    Aucune réaction en exécution sans interruption ! Pas d'affichage, rien !

    En pas à pas, affichage de la boite mais avec un message du genre "L'actualisation n'est pas disponible" dès que je passe au deuxième enregistrement !!!!

    A l'aide !
    Selon les points de vue, on peut être un chic type ou juste un trou du c...

  5. #5
    Membre habitué Avatar de Cabos
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2010
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 108
    Points : 156
    Points
    156
    Par défaut
    Qui cherche trouve dirait le sage (qui aime Google !!)

    Bon, la solution est de placer un simple DoEvents dans le Do...Loop. Ce dernier est en effet assez exclusif, et bloque les exécutions de type affichage tant qu'il n'est pas fini,... ou interrompu momentanément (très peu suffit), comme par un DoEvents, par exemple !

    Ce qui explique pourquoi mon affichage ne se faisait qu'à la fin du traitement, et pourquoi en pas à pas (= interruptions), tout allait bien !

    En espérant que cette petite galère pourra servir à d'autres.
    Selon les points de vue, on peut être un chic type ou juste un trou du c...

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

Discussions similaires

  1. Problème de temporisation
    Par zhpipo16 dans le forum LabVIEW
    Réponses: 1
    Dernier message: 01/05/2008, 01h51
  2. Probléme de temporisation
    Par nicolastro dans le forum LabVIEW
    Réponses: 2
    Dernier message: 16/04/2008, 16h55
  3. Réponses: 2
    Dernier message: 07/11/2007, 11h51
  4. Problème temporisation en milliseconde
    Par bahhak dans le forum MFC
    Réponses: 5
    Dernier message: 30/05/2006, 16h12
  5. problème temporisation en milliseconde
    Par bahhak dans le forum C++
    Réponses: 2
    Dernier message: 30/05/2006, 16h07

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