bdl20042000
Messages postés63Date d'inscriptionmercredi 18 août 2004StatutMembreDernière intervention19 mai 2009
-
29 nov. 2006 à 14:35
bdl20042000
Messages postés63Date d'inscriptionmercredi 18 août 2004StatutMembreDernière intervention19 mai 2009
-
30 nov. 2006 à 09:27
Bonjour,
j'ai un problème d'utilisation de Timer.
J'ai l'impression qu'il n'a pas d'effet sur un traitement long suite à un requête SQL.
Ainsi sur une requête qui peut prendre 4 minutes, je voudrais signaler au utilisateur environ combien de temps restant avant de lui rendre la main.
Est ce normal ?
ex. code :
Private Sub Timer1_Timer()
if i=0 then
Timer1.interval=60000
end if
If i = 4 Then
i = 0
Timer1.interval=1
Timer1.Enabled = False
End If
i = i + 1
Label1.Caption = "Il reste encore " & Cstr(4-i) & " minutes."
DoEvents
End Sub
private sub bouton1_click()
i =0
timer1.enabled=true
Label1.visible=true
call appel_fonction_interrogation ' requête qui prendre 4 minutes
timer1.enabled=false
Label1.visible=false
end sub
Merci pour tout aide ou information que vous pourriez m'apporter.
chaibat05
Messages postés1883Date d'inscriptionsamedi 1 avril 2006StatutMembreDernière intervention20 novembre 20072 29 nov. 2006 à 15:19
Salut,
ça devrait marcher avec ça :
private sub bouton1_click()
i =0
Timer1.interval=60000
Timer1.enabled=true
Label1.visible=true
call appel_fonction_interrogation ' requête qui prendre 4 minutes
end sub
Private Sub Timer1_Timer()
If i = 4 Then
i = 0
Timer1.enabled=false
Label1.visible=false
Exit Sub
Else
i = i + 1
Label1.Caption = "Il reste encore " & Cstr(4-i) & " minutes."
DoEvents
End If
End Sub
je suppose que le i doit est déclaré dans le module
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 29 nov. 2006 à 16:40
En fait cela dépend essentiellement de l'appel de la requette. Si c'est un appel bloquant, ton logiciel n'aura pas la main tant que la requette n'aura pas terminée. Dans ce cas là, le timern'aura pas la main pour se déclencher.
Il serait interessant de voir le code de la fonction appel_fonction_interrogation s'il est pas trop long.
Sinon si tu as une boucle dedant met un DoEvents à l'intérieur de la boucle.
---- Sevyc64 (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 30 nov. 2006 à 00:19
pape0:
pour ton info, au bureau, des requêtes peuvent durer 2h00 et plus. Si la base est en multi-users et qu'il y a des milliards de données dans des centaines de tables... il faut s'atteler de patience... C'est pourquoi j'ai 2 PCs, un pour les ueries et un pour travailler... ¦¬)
bdl20042000
Messages postés63Date d'inscriptionmercredi 18 août 2004StatutMembreDernière intervention19 mai 2009 30 nov. 2006 à 09:27
Merci, pour ces réponses.
Mais cela ne marche pas plus.
Par contre, "casy", comment on fait pour savoir si c'est un appel bloquant et comment l'éviter si possible ?
Même en optimisant la requête je suis à 1 minute (en utilisant seulement les tables qui m'interessent et sans utiliser le NOT IN qui sont beaucoup plus lent que les IN, par contre je ne peux rien faire pour D_ENVIGUEUR qui fait appel à une procédure stockée).
Voici la fonction sans optimisation, pour "casy" :
Private Sub appel_fonction_interrogation()
Dim temp As String
Dim j As Integer
ChaineDeConnexion = "Provider=MSDAORA;Data Source=" & base & ";User Id=" & user & ";Password=" & passwd & ";"
Set adoConnexionOra = New ADODB.Connection
Set adoRecordsetOra = New ADODB.Recordset
adoConnexionOra.Open ChaineDeConnexion
If adoConnexionOra.State <> adStateOpen Then
MsgBox "Impossible d'établir la connexion à la base", vbCritical
End
End If
strSqlOra = "SELECT COUNT(TABBRE.IDEBRE) "
strSqlOra = strSqlOra & "FROM BDL.VMIS_TABSOC TABSOC, BDL.VMIS_TABBRE TABBRE, BDL.VMIS_TABPCT TABPCT "
strSqlOra = strSqlOra & "WHERE TABSOC.IDESOC=TABBRE.IDECAS "
strSqlOra = strSqlOra & "AND TABBRE.IDEBRE=TABPCT.IDEBRE(+) " strSqlOra strSqlOra & "AND (TABSOC.CODSOC '" & txtNum.Text & "' "
strSqlOra = strSqlOra & "AND TABBRE.DATDLV IS NULL " strSqlOra strSqlOra & "AND DECODE(TABBRE.D_ENVIGUEUR,'1','OUI','NON') 'OUI' "
strSqlOra = strSqlOra & "AND TABBRE.IDETYP NOT IN (SELECT IDETYP FROM BDL.VMIS_TABTYP WHERE LIBTYP='Enveloppe SOLEAU') "
strSqlOra = strSqlOra & "AND (TABBRE.IDEPAY NOT IN (SELECT IDEPAY FROM BDL.VMIS_TABPAY WHERE LIBPAY='PROCEDURE INTERNATIONALE') "
strSqlOra = strSqlOra & "OR (TABBRE.IDEPAY IN (SELECT IDEPAY FROM BDL.VMIS_TABPAY WHERE LIBPAY='PROCEDURE INTERNATIONALE') "
strSqlOra = strSqlOra & "AND TABPCT.FELLIM > TO_DATE('" & Format(Date, "YYYYMMDD") & "','YYYYMMDD')))) "
DoEvents
adoRecordsetOra.Open strSqlOra, adoConnexionOra
' si il y a un résultat
If Not (adoRecordsetOra.EOF) Then
txtVigueur.Text = adoRecordsetOra.Fields(0).Value
End If
adoRecordsetOra.Close
End Sub