Précédent   Forum des professionnels en informatique > 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.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/04/2011, 12h24   #1
Nouveau Membre du Club
 
Avatar de Cabos
 
Homme Francois
Responsable de service informatique
Inscription : novembre 2010
Messages : 33
Détails du profil
Informations personnelles :
Nom : Homme Francois
Âge : 43
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique

Informations forums :
Inscription : novembre 2010
Messages : 33
Points : 37
Points : 37
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 :
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.
Cabos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2011, 15h28   #2
Nouveau Membre du Club
 
Avatar de Cabos
 
Homme Francois
Responsable de service informatique
Inscription : novembre 2010
Messages : 33
Détails du profil
Informations personnelles :
Nom : Homme Francois
Âge : 43
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique

Informations forums :
Inscription : novembre 2010
Messages : 33
Points : 37
Points : 37
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...
Cabos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2011, 16h02   #3
Nouveau Membre du Club
 
Avatar de Cabos
 
Homme Francois
Responsable de service informatique
Inscription : novembre 2010
Messages : 33
Détails du profil
Informations personnelles :
Nom : Homme Francois
Âge : 43
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique

Informations forums :
Inscription : novembre 2010
Messages : 33
Points : 37
Points : 37
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 :
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
Cabos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2011, 11h54   #4
Nouveau Membre du Club
 
Avatar de Cabos
 
Homme Francois
Responsable de service informatique
Inscription : novembre 2010
Messages : 33
Détails du profil
Informations personnelles :
Nom : Homme Francois
Âge : 43
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique

Informations forums :
Inscription : novembre 2010
Messages : 33
Points : 37
Points : 37
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 !
Cabos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2011, 14h07   #5
Nouveau Membre du Club
 
Avatar de Cabos
 
Homme Francois
Responsable de service informatique
Inscription : novembre 2010
Messages : 33
Détails du profil
Informations personnelles :
Nom : Homme Francois
Âge : 43
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique

Informations forums :
Inscription : novembre 2010
Messages : 33
Points : 37
Points : 37
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.
Cabos est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h51.


 
 
 
 
Partenaires

Hébergement Web