Utiliser résultat d'1 requête dans 1 autre requête en VB6

yan35 Messages postés 185 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 20 juin 2013 - 5 déc. 2004 à 12:56
yan35 Messages postés 185 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 20 juin 2013 - 8 déc. 2004 à 23:14
Bonjour,

Pour utiliser le résultat d'1 requête dans 1 autre requête, en DAO, je fais actuellement :

dim as strSQL as string, qdf as querydef, db as database
strSQL = "select * from TableA where NoEnr > " & clng(txtA)
' où txtA est 1 txtbox dans 1 form et NoEnr 1 champ de TableA
set db = opendatabase("c:\temp\mabase.mdb", false)
set qdf = db.createQueryDef("Selection1", strSQL)

' puis 2° requête
dim Rs as recordsetstrSQL "select * from TableB Inner Join NO Selection1.NoEnr where Nom = ' " & txtB & "'"
' où txtB est 1 txtbox dans 1 form et NO, Nom sont des champs de tableB
set Rs = db.openrecordset(strSQL, dbopendynaset)

Est-ce qu'on peut faire + simple et + rapide en VB6 ?
par exemple en créant 1 recordset sur la 1° requête et en l'exploitant dans la 2° req

Merci de vos suggestions.

8 réponses

cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
5 déc. 2004 à 18:37
Salut,

2 possibilités :
strSQL "select * from TableB Inner Join TableA ON TableB.NO TableA.NoEnr where TableA.NoEnr > " & CLng(txtA) & " and TableB.Nom = '" & txtB & "'"

ou
strSQL "select TableB.* from TableA, TableB Where TableB.NO TableA.NoEnr and TableA.NoEnr > " & CLng(txtA) & " and TableB.Nom = '" & txtB & "'"


Dis moi si ça te va car j'ai juste fais une traduc de ce que je fais déjà.

Cordialement, CanisLupus
0
yan35 Messages postés 185 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 20 juin 2013
5 déc. 2004 à 19:35
Merci de ta réponse CanisLupus qui simplifie mes requêtes et les ramène en 1 seule, mais elle ne répond pas entièrement à ma question.
Il faut dire que je ne me suis pas bien expliqué car j'ai, en fait ,résolu mon problème en 1 exemple trop simplifié.
En réalité, je crois vraiment devoir passer par 1 req intermédiaire car dans cette requête je calcule des champs nouveaux d'une part et d'autrepart je fais une union avec d'autres résultats de requêtes.
Donc mon vrai problème est de récupérer le résultat d'une requête intermédiaire pour l'utiliser dans 1 autre.
Ce que je sais faire comme dans mon post d'origine, mais je me demande s'il n'y a pas 1 fonction ou 1 méthode en vb pur pour refaire 1 req à l'aide du recordset récupéré d'une autre requête.

Merci de toutes façons, c'est vrai que ça simplifie mais je ne crois pas que je pourrais résoudre des champs calculés + 1 union avec 1 autre req dans 1 simple req sans obtenir 1 message du type "requête complexe ..."
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
6 déc. 2004 à 19:29
En VB pur, je ne crois pas que ce soit possible sauf avec des trucs du genre

do while not rs1.eof
......
loop

Je pense que le mieux est de passer par le SQL. La solution de créer tes requêtes intermédiaires avec querydef et de créer un recordset final qui les interroge est sans doute la plus rapide, même si on peu optimiser comme dans l'exemple que je t'ai donné.

Pour mieux te répondre, il faudrait que je vois ton code actuel.

@+

Cordialement, CanisLupus
0
yan35 Messages postés 185 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 20 juin 2013
6 déc. 2004 à 20:18
Merci de tes remarques CanisLupus.
Je crois que je vais devoir rester sur du SQL, que je vais m'atteler à optimiser.
En VB, je pensais à des trucs du style FindFirst, FindNext ... dans des boucles, mais c'est sans doute + lent que le SQL ?

En tout cas, Merci de ton aide.
Après 1° optimisation, je mettrai mon code ...

@+
0

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

Posez votre question
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
7 déc. 2004 à 20:49
Les boucles sont toujours plus lentes.
Un petit truc au passage, s'il y a des requetes dont je me sers souvent, je les stockes dans la base elle-même. Et puis, j'utilise ce genre de code :

Dim qd As QueryDef
Dim rst As Recordset

' querydef a utiliser
Set qd = db.QueryDefs("NomRequete")

' pour les requetes paramétrées
qd.Parameters("Parametre") = TaValeur
'....

' pour exécuter la requète
qdf.Execute

'ensuite, tu peux interoger la requete comme tu le ferais avec une table
'sinon :
' récup du résultat dans VB si tu le veux tout de suite
Set rst = qd.OpenRecordset

' libération de la mémoire
Set qd = Nothing


Si ça t'intéresse, je vais essayer de faire un exemple simple et je le postes demain.

L'avantage, c'est que dans VB on perd pas de temps à créer une requete avec des manipulations de chaines, et on évite souvent le parcours d'un recordset pour recréer d'autres recordsets et ainsi de suite. C'est access qui fait tout ou presque et ton VB ne fait que récupérer les résultats.

@+

Cordialement, CanisLupus
0
yan35 Messages postés 185 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 20 juin 2013
7 déc. 2004 à 23:58
Bonsoir et Merci,

Ton astuce d'utiliser directement 1 requête dans la base de données, je la connaissais, alors ne casse pas la tête à me faire 1 exemple.
Par contre, je ne l'utilise pas si souvent que ça et c'est surement un tort car je crois, en +, avoir lu qqpart que ça améliore la vitesse, la requête stockée dans la base étant déjà compilée ... (tu me diras, elle est aussi compilée lors de son utilisation lorsqu'elle est écrite dans VB !).
A propos de définitions stockées dans la base, pourrais-tu m'aiguiller sur les index ?
Quant dans 1 table access des index ont été écrits, faut-il les réécrire dans vb ou le simple fait que la table soit de toute façon indexée dans acces est-il suffisant ?
Merci de ton aide.
8-)
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
8 déc. 2004 à 21:16
Les index des tables, c'est peut-être utile mais perso je n'utilise pas. Je préfère le sql avec order by.
J'ai vu des exemples d'utilisation des index access mais ça ne m'a pas franchement plu et j'ai trouvé ça pas très rapide. J'ai peut-être tord ?
En VBA Access, ça doit avoir son utilité mais en VB6 ou VB.NET, je ne vois pas.
J'ai même l'impression que c'est un héritage des progs CLIPPER et DBase xx où c'était vraiment utile.
Dans les codes VB que j'ai vu, il y avait ouverture de la table dans sa totalité (dbOpenTable) puis ouverture de l'index et utilisation de la méthode seek.
Bien sûr, en faisant ça, on a la table triée suivant l'index mais, niveau occupation mémoire et rapidité, c'est pas le top.
Quand je crée une table access, je ne crée jamais d'index, même pas une primarykey car je ne m'en sers qu'avec VB (ou autre) via SQL.

Cordialement, CanisLupus
0
yan35 Messages postés 185 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 20 juin 2013
8 déc. 2004 à 23:14
Merci pour toutes tes réponses CanisLupus.
Bonne prog
@+
:big)
0
Rejoignez-nous