begin process at 2012 02 15 04:40:02
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Visual Basic 6

 > 

Système

 > 

Exécution

 > 

Quelle solution pour 1 tache de fond en VB6 ?


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Quelle solution pour 1 tache de fond en VB6 ?

mardi 27 mars 2007 à 14:25:17 | Quelle solution pour 1 tache de fond en VB6 ?

yan35

Bonjour,

Lorsqu'un utilisateur saisie des infos dans des controles d'une form, lors du Validate du 2° controle (le quantième importe peu), le source lance lance une requête SQL sur une base de données assez conséquente et présente sur un autre poste d'un réseau poste à poste, temps d'exécution de la requête est donc important et bloque la saisie des données dans les autres controles de la form, alors que son résultat n'est pas essentiel tant que tous les controles ne sont pas encore saisis.
Je souhaite donc lancer cette requête en tache de fond sans qu'elle pénalise la saisie sur la form.
Sachant que VB6 est fâché avec le multithread, je ne sais pas quelle meilleure piste choisir ?
- un timer : retarde le démarrage de la requête mais ne traite pas le problème car bloque la saisie quand la requête s'exécute,
- il faudrait donc lancer un serveur ? mais quel serait la meilleure liaison : DDE - OLE - Winsock ?
   (compte-tenu de l'organisation du réseau en poste à poste) et pourquoi ?
- Y a-t-il une autre solution, que celles évoquées ?

Par avance MERCI de m'orienter.
mardi 27 mars 2007 à 14:29:54 | Re : Quelle solution pour 1 tache de fond en VB6 ?

Renfield

Administrateur CodeS-SourceS
requete et base a optimiser ?
(fais voir le code SQL de la requete)

un Timer est une bonne idée, je me sert souvent de ce stratagème pour rendre la main tout de suite, et lancer des taches longues


Renfield
Admin CodeS-SourceS- MVP Visual Basic
mardi 27 mars 2007 à 14:59:23 | Re : Quelle solution pour 1 tache de fond en VB6 ?

yan35

Bonjour et Merci Renfield de cette réponse aussi rapide,

Voici mon code et les requêtes SQL qu'il réalise dans le timer :

Private Sub tmrFd_Timer()
'Calculs en tâche de fond : soit ML, soit Dm3 selon Tag de tmrFd
Dim RsReq As Recordset     ' crée 1 recordset qui servira à plusieures requêtes
Dim strR As String, arrDepSall() As String
If tmrFd.Tag = "ML" Then        'ML
    Dim RsCml As Recordset
    strR = "SELECT Sum(DOS) AS CumulDos From archives GROUP BY [POSITION]\1000, DEPOT, SALLE " & _
    "Having ((([position] \ 1000) = " & txtRayon & txtAlvéole & txtEtagère & ") And (DEPOT = " & Replace(lblDép.Caption, "n° ", "") & ") And (SALLE = " & Replace(lblSal.Caption, "n° ", "") & "))" & " UNION SELECT Sum(DOSCM) AS CumulDos From regroupts GROUP BY [POSITION]\1000, DEPOT, SALLE Having ((([position] \ 1000) = " & txtRayon & txtAlvéole & txtEtagère & ") And (DEPOT = " & Replace(lblDép.Caption, "n° ", "") & ") And (SALLE = " & Replace(lblSal.Caption, "n° ", "") & "))"
    Set RsCml = dbArchclts.OpenRecordset(strR, dbOpenDynaset)
    If RsCml.EOF Then
        Cml = 0
    Else
        For I = 1 To 2 'il y a toujours 2 enr : 1 pour archives, 1 pour regroupts (inutile de calculer le nbre)
            If Not IsNull(RsCml!cumuldos) Then Cml = Cml + RsCml!cumuldos
            RsCml.MoveNext
        Next
    End If
ElseIf tmrFd.Tag Like "Dm3*" Then        'Dm3
    arrDepSall = Split(tmrFd.Tag, ",")
    strR = "SELECT Sum((SELECT Avg(Dos.dm3) FROM Dos WHERE (((Dos.dm3) Is Not Null) and dos.doscm = " & _
    "archives.dos) GROUP BY Dos.DosCm)) AS Cumul_Moydm3connus From Archives " & _
    "Where Archives.DEPOT = " & Val(arrDepSall(1)) & " And Archives.SALLE = " & Val(arrDepSall(2)) & _
    " And Archives.NoReg = " & Replace(txtRegr, "R-", "") & " UNION " & _
    "SELECT Sum((SELECT  Avg(Dos.dm3) FROM Dos WHERE (((Dos.dm3) Is Not Null) and dos.doscm = " & _
    "regroupts.doscm) GROUP BY Dos.DosCm)) AS Cumul_Moydm3connus From Regroupts " & _
    "Where Regroupts.Depot = " & Val(arrDepSall(1)) & " And Regroupts.Salle = " & Val(arrDepSall(2)) & _
    " And Regroupts.Reg2 = " & Replace(txtRegr, "R-", "")
    Set RsCml = dbArchclts.OpenRecordset(strR, dbOpenDynaset)
    If Not RsCml.EOF Then
        RsCml.MoveLast
        For I = RsCml.RecordCount To 1 Step -1
            If Not IsNull(RsCml!Cumul_Moydm3connus) Then Cdm3 = Cdm3 + RsCml!Cumul_Moydm3connus
            RsCml.MovePrevious
        Next
    End If
End If
tmrFd.Tag = ""
Set RsCml = Nothing
Set RsReq = Nothing
tmrFd.Enabled = False
End Sub

C'est sûr les requêtes sont lourdes : sous-requêtes, regroupement, union, en + sur du Access et sur 2 tables de 40000 enregistrements de + de 300 octets, chacune donc c'est long, c'est pourquoi je cherche à les exécuter en vrai tâche de fond.

Si tu as une piste, Merci.
mercredi 28 mars 2007 à 16:46:10 | Re : Quelle solution pour 1 tache de fond en VB6 ?

yan35

Re,
Je crois avoir trouvé. J'ai testé un Exe activeX out of Process. En test ça marche, par contre je me demande ce que ça donnera dans la durée, une fois mon exe et mon exe activeX compilés ! ?  En effet je ne fais pas bien la différence avec du Multithread que je ne maîtrise pas mais j'ai vu sur ce site que VB6 est récalcitrant au Multithread.
Merci si quelqu'un peut m'éclairer à ce sujet.


Cette discussion est classée dans : solution, poste, tache, requête, saisie


Répondre à ce message

Sujets en rapport avec ce message

requête SQL pb lorsque une valeur est null [ par javotte ] bjr à tous, voila en fait j'ai créé un formulaire de saisie de données avec des zones de textes et un bouton avec un progr associé et une requête: cmd solution pour effectuer une liaison avec deux tables [ par tiguymat ] Salut à tous table 1 = produitstable 2 = envoiconnection à la base Set ConAdd = New ADODB.Connection ConAdd.Open "provider =microsoft.jet.oledb.4.0 limiter saisie d'un textbox [ par louly ] Bonjour,Je voudrai afin d'afficher dans une spreadsheet (VB6) avec taille de cellule fixé, limiter la saisie dans un textbox à la taille physique de c X-Files SQL [ par tbbuim1 ] Bonjour à tous, J'ai un programme access qui tourne nikel sur mon poste Mais sur les autres postes, lorsque j'envoi une requête UNION Il me dit: NOM Pbs requête SQL [ par fraysco ] Bonjour,J'ai créer une requête afin de récupérer des données sur mon tableau Excel mais j'ai l'erreure "Attendu : fin d'instruction" sur la première p comment je peut changer les propréter de barre de tache ou poste de travaille [ par jihednond ] @§§§FearME§§§@ je veut créer un programe qui restore les fonctionaliter endomager par l [VB6 + Requête sur base Access] Erreur: "Utilisation non autorisée de Null" [ par NeT_SlipKnoT ] Bonjour à tous!Je vous écris car j'ai un problème au niveau d'une requête pour attaquer une base Access 2002 sous Visual Basic 6.Je commence tout d'ab Mschart [ par tiguymat ] BonjourVoila je cherche une solution pour combiner sur un même MSChart le type 2Dbar et 2Dline J'ai des données qui sont en format BAR sur l'axe Y et  Verrouiller touche et barre des tache [ par jimluis ] Bonjour,Je voudrais savoir s'il est possible de vérouiller des combinaison de touches?? Comment on fais ca?? et même si possible tout verrouiller sauf Erreur de synthaxe dans une requête avec une date paramétrée... besoin d'aide [ par TrafMaxime ] Voilà le topo : je voudrais simplement affecter une date minimum(choisie grâce à un datetimepicker) à ma sélection de champs dans ma table : dim mada


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,014 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales