Timer + recherche long dans une base

bdl20042000 Messages postés 63 Date d'inscription mercredi 18 août 2004 Statut Membre Dernière intervention 19 mai 2009 - 29 nov. 2006 à 14:35
bdl20042000 Messages postés 63 Date d'inscription mercredi 18 août 2004 Statut Membre Dernière intervention 19 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.

6 réponses

pape0 Messages postés 132 Date d'inscription mercredi 18 février 2004 Statut Membre Dernière intervention 1 septembre 2014
29 nov. 2006 à 15:10
En tous cas une requete de 4 minutes.

Revoie plustot ta requete
(une requete bien 'crite ne doit pas dépasser 40 s pour le retour de la première ligne).

Sa sent le manque d'index.

<hr />
Aller voir ces sites
http://www.pape-bleu.net et http://www.papebleu.net.
0
daouame Messages postés 10 Date d'inscription samedi 8 mars 2003 Statut Membre Dernière intervention 4 février 2011
29 nov. 2006 à 15:19
Timer1.interval=60000 doit être dans l'evenement click de ton bouton1
pour que l'evenement timer soit declenché aprés un minute .
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
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
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
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 #
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
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... ¦¬)

MPi
0
bdl20042000 Messages postés 63 Date d'inscription mercredi 18 août 2004 Statut Membre Dernière intervention 19 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
0
Rejoignez-nous