Selection dans une base de donnee

Seth77 Messages postés 572 Date d'inscription mardi 30 avril 2002 Statut Membre Dernière intervention 4 mai 2020 - 5 juin 2005 à 13:32
Seth77 Messages postés 572 Date d'inscription mardi 30 avril 2002 Statut Membre Dernière intervention 4 mai 2020 - 12 juin 2005 à 17:07
Salut



comment faire pour selectionner le nieme record d une base de donnne ? (pas le record avec un ID n)



merci !

Herve

24 réponses

cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 20
5 juin 2005 à 15:10
Salut,
Regarde la propriété AbsolutePosition de ton recordset.

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
Seth77 Messages postés 572 Date d'inscription mardi 30 avril 2002 Statut Membre Dernière intervention 4 mai 2020 1
5 juin 2005 à 15:14
ahh merci ...

mais j aimerais en fait recuperer par exemple le record 10 mais sans faire une boucle ?

est ce possible avec AbsolutePosition ?

Herve
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 20
5 juin 2005 à 17:36
Tu n'as pas précisé ta méthode d'accès (ADO ou DAO) mais je pense que ce tit exemple fonctionne dans les 2 cas :

rs.MoveFirst
rs.Move rs.AbsolutePosition + 9 'on se positionne sur le 10ème enreg
MsgBox rs!TonChamp

Si tu viens d'ouvrir ton recordset, tu peux zapper le rs.movefirst mais si ta référence est à partir du 1er enreg et que tu utilises plusieurs fois de suite, vaut mieux le garder.

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
Seth77 Messages postés 572 Date d'inscription mardi 30 avril 2002 Statut Membre Dernière intervention 4 mai 2020 1
5 juin 2005 à 18:19
Merci je vais essayer



j utilise DAO ....d ailleur c quoi la difference entre les deux : DAO et ADO ? je croyais que c etait la meme chose !

Herve
0

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

Posez votre question
Seth77 Messages postés 572 Date d'inscription mardi 30 avril 2002 Statut Membre Dernière intervention 4 mai 2020 1
5 juin 2005 à 19:37
Est ce qu il y a un moyen de modifie un champ sur l ensemble de la base de donnee sans parcourir tout la base de donnee ?

Herve
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 20
5 juin 2005 à 20:05
En ce qui concerne les différences entre DAO et ADO, je t'invite à consulter cette adresse :

http://www.microsoft.com/FRANCE/MSDN/Technologies/technos/dataaccess/info/info.asp?mar=/FRANCE/MSDN/Technologies/technos/dataaccess/info/migration_DAO_ADO.html


Pour modifier un champ, essaie cette syntaxe :
db.Execute "UPDATE TaTable SET TonChamp = TaValeur WHERE TonCritere"



-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
Seth77 Messages postés 572 Date d'inscription mardi 30 avril 2002 Statut Membre Dernière intervention 4 mai 2020 1
9 juin 2005 à 22:38
Merci !!

ca marche tres bien



encore une question ...y a t il moyen de supprimer automatiquement
(toujours sans parcourir tout la base de donnee) des record d une table
quand il ne sont pas utilise dans une autre table ?



merci d avance

Herve
0
Seth77 Messages postés 572 Date d'inscription mardi 30 avril 2002 Statut Membre Dernière intervention 4 mai 2020 1
10 juin 2005 à 19:50
Up !

Herve
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 20
10 juin 2005 à 20:05
Salut,

pour deleter c'est presque pareil :

db.Execute "DELETE * FROM TaTable WHERE TonCritere"

Mais fais attention à ton critère, il se peut, comme pour l'update que +sieurs enregs correspondent. A toi de bien choisir.

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
Seth77 Messages postés 572 Date d'inscription mardi 30 avril 2002 Statut Membre Dernière intervention 4 mai 2020 1
10 juin 2005 à 20:25
merci ...

mais je ne suis pas super fort en SQL donc ...

la je ne comprend pas ..... je veux supprimer tous les record d 'un table qui ne sont pas utilise dans une autre table



db.Execute "DELETE * FROM Table1 WHERE Table2 ....????"

Herve
0
Seth77 Messages postés 572 Date d'inscription mardi 30 avril 2002 Statut Membre Dernière intervention 4 mai 2020 1
11 juin 2005 à 16:20
En fait je cherche a faire cela mais bien plus vite !



For i = REC_Rep.RecordCount To 1 Step -1


Set REC_Tab = DB.OpenRecordset(DB_STR_TAB, dbOpenDynaset)


REC_Tab.Filter = "Repertoire=" & REC_Rep!id


Set REC_Tab= REC_Tab.OpenRecordset


If (REC_Tab.RecordCount = 0) Then


REC_Rep.Delete


End If


REC_Tab.MovePrevious


Next i

Herve
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 20
11 juin 2005 à 17:02
Je t'avoue que je trouve ton code bizarre, réouvrir un recordset (REC_Tab ) pour chaque enreg de REC_Rep puis lui appliquer un filtre et enfin faire un moveprevious alors que ce n'est pas utile (puisque le recordset est recréé à chaque fois)...... enfin bon, voilà un ordre sql qui devrait faire en une seule fois ce que je pense avoir compris à ta demande :

db.Execute "DELETE * FROM Table1 WHERE id NOT IN (SELECT Repertoire FROM table2)"

Ainsi, tous les enregistrements de la table1 dont la valeur du champ 'id' ne se trouve pas dans le champ 'repertoire' de la table2.

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
Seth77 Messages postés 572 Date d'inscription mardi 30 avril 2002 Statut Membre Dernière intervention 4 mai 2020 1
11 juin 2005 à 17:50
merci il y a eut un probleme de copier/coller c est pour cela que tu ne comprends pas...le moveprevious c pour REC_Rep.

sinon c correcte non ?

Herve
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 20
11 juin 2005 à 20:29
Tu as essayé l'exemple que je t'ai donné ? Si ça correspond à ce que tu veux obtenir, crois moi c'est le plus rapide car c'est le moteur de base de données qui fait tout.

Sinon, pour ton code, il y aurait plusieurs choses à dire, entre autres :

1 - plutôt que

For i = REC_Rep.RecordCount To 1 Step -1
REC_Rep.MovePrevious
Next i

j'aurais plutôt codé

REC_Rep.movelast 'on se positionne sur le dernier enreg
Do While Not REC_Rep.Bof 'tant qu'on n'est pas arrivé au début du recordset
'.....
REC_Rep.MovePrevious
Loop

2 - tant qu'à recréer un recordset à chaque fois, au lieu d'appliquer un filtre sur le recordset, j'aurais plutôt codé :
Set REC_Tab DB.OpenRecordset("select repertoire from table2 where repertoire " & REC_Rep!id, dbOpenDynaset)
If REC_Tab.EOF Then 'si on n'a rien trouvé qui correspond
REC_Rep.Delete
End If

à la place de

Set REC_Tab = DB.OpenRecordset(DB_STR_TAB, dbOpenDynaset)
REC_Tab.Filter = "Repertoire=" & REC_Rep!id
Set REC_Tab= REC_Tab.OpenRecordset
If (REC_Tab.RecordCount = 0) Then
REC_Rep.Delete
End If

Mais, même comme ça, ça risque d'être plus long qu'avec :

db.Execute "DELETE * FROM Table1 WHERE id NOT IN (SELECT Repertoire FROM table2)"

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
Seth77 Messages postés 572 Date d'inscription mardi 30 avril 2002 Statut Membre Dernière intervention 4 mai 2020 1
11 juin 2005 à 21:26
Merci !



est ce qu il y a une difference d efficacite entre le for et le do while ??

Herve
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 20
11 juin 2005 à 22:15
Foncièrement non mais dans le cas présent, je pense que le do while est le mieux adapté.

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
Seth77 Messages postés 572 Date d'inscription mardi 30 avril 2002 Statut Membre Dernière intervention 4 mai 2020 1
12 juin 2005 à 12:59
OK merci !



oui je vois ca evite egalement de faire pour recupere le nombre de record !

If (REC_Dbl.RecordCount > 0) Then

REC_Db.MoveLast

REC_Db.MoveFirst

End If


c tout de meme long ...meme avec ton code .....environ 20sec de traitement pour la base de donne.




Herve
0
Seth77 Messages postés 572 Date d'inscription mardi 30 avril 2002 Statut Membre Dernière intervention 4 mai 2020 1
12 juin 2005 à 13:04
Encore une chose finalement l interet avec le Do While c que c pas necessaire de commence par la fin pour le test !

Herve
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 20
12 juin 2005 à 13:30
Exact, en partant du début tu codes :

REC_Rep.movefirst 'on se positionne sur le premier enreg
Do While Not REC_Rep.EOF 'tant qu'on n'est pas arrivé à la fin du recordset
'.....
REC_Rep.MoveNext
Loop

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 20
12 juin 2005 à 13:31
Mais, l'ordre sql (db.execute "....") est le plus rapide.

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
Rejoignez-nous