IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

Position Enregistrement sur un Recordset filtré


Sujet :

VB 6 et antérieur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 54
    Par défaut Position Enregistrement sur un Recordset filtré
    Bonjour,

    Je souhaite connaitre la position absolu d'un enregistrement dans un Recordset ADODB alors que celui est filtré sur certains critères ... En effet, la propriété .absoluteposition me renvoi la position comme si le recordset n'était pas filtré ... ce qui me fait comme résultats du genre N° 148 sur 10 quand je demande 'RS.absoluteposition & " sur " & RS.recordcount'.

    Je sais que lorsque j'applique un filtre quelqu'il soit, je suis toujours sur la première occurrence, mais pour moi, c'est différent puisque, c'est une fois filtré que je lance un .find sur un champs bien précis ( en gros, je filtre une catégorie d'élément, et je pointe ensuite directement vers un index ). C'est là que je voudrais connaitre sa position.

    Y-a-t-il un moyen ou dois-je parcourir l'ensemble des éléments pour savoir à quelle position je me trouve (solution très lourde pour une si petite info ...) ?

    Merci pour votre aide ...

    TALERE

  2. #2
    Membre Expert Avatar de Megaxel
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 187
    Par défaut
    Hélas, je crois bien que c'est la seule solution...
    Mais je me trompe peut-être. Je te le souhaite.

  3. #3
    Rédacteur
    Avatar de jacma
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    612
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 612
    Par défaut
    Bonjour

    Je n'ai pas essayé, mais peut-être pourrais tu t'en tirer en créant une copie de ton recordset trié (clone), et travailler sur ce clone :

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 54
    Par défaut
    Merci pour votre aide ... seulement le clone ne marche pas, puisqu'il me fait une copie du RS original sans le filtre ... par contre cela m'a donné une idée ... effectivement, ma requete SQL se termine par les conditions ("WHERE ...") ce qui me permet de rajouter temporairement ma condition de filtrage et relancer ma requete pour avoir le bon nombre d'enregistrement ...

    A bientôt ...

    TALERE

  5. #5
    Rédacteur
    Avatar de jacma
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    612
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 612
    Par défaut
    Citation Envoyé par talere
    Merci pour votre aide ... seulement le clone ne marche pas, puisqu'il me fait une copie du RS original sans le filtre
    [EDIT]En fait je ne sais pas pourquoi je continue à parler de clone. Pas besoin. Le code si dessous fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub cmdFiltre_Click()
     
      rsPub.Filter = "State = 'NY'"
      DoEvents
      rsPub.Sort = "Name DESC" 'Ou ASC
      MsgBox rsPub.RecordCount
     
      rsPub.Find "Name = 'JOHN WILEY & SONS'"
      MsgBox rsPub.Fields(2)
      MsgBox rsPub.AbsolutePosition
     
    End Sub
    La table est la table "Publishers" de "Biblio" (exemple ACCESS ou VB). En fonction de l'attribut du tri, la position absolue de l'enregistrement est modifiée correctement.

    D'ailleurs, voici ce que dit MSDN:
    Utilisez la propriété Filter pour afficher de manière sélective les enregistrements d'un Recordset. Le Recordset ainsi filtré devient le curseur en cours. Ceci affecte les autres propriétés telles que AbsolutePosition, AbsolutePage, RecordCount et PageCount qui renvoient des valeurs dépendantes du curseur en cours, car lorsque vous assignez à la propriété Filter une valeur spécifique, l'enregistrement en cours est déplacé au premier enregistrement qui correspond à la nouvelle valeur.
    Cela evitera une une requête.

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 54
    Par défaut
    Qu'entends tu par clone ? dans ton code, je ne vois rien qui y ressemble ... De mon coté, j'ai essayé ce que dit ta citation, j'ai bien "recordcount" qui sont mis à jour mais pas "absoluteposition", "absolutepage" ou "pagecount".

    Mon exemple est le suivant : J'ai 7 enregistrement non filtré et plus qu'un seul lorsque je le suis. Et bien j'ai quand même absoluteposition qui est à 2 ( tout comme absolutepage) alors que recordcount est à 1.

    J'utilise ADODB sous VB, est-ce que c'est pour cela que ça ne marche pas ? J'ai essayé ton bout de code, mais mes connaissances en VB étant limitées, je n'arrive pas à initialiser rspub autrement qu'avec ADODB.

  7. #7
    Rédacteur
    Avatar de jacma
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    612
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 612
    Par défaut
    Concernant "clone", laisse tomber. J'avias d'ailleurs édité mon précédent message dans ce sens. L'utilisartion du seul recordset filtré suffit à réaliser ce que tu veux faire, comme dis dans mon exemple.

    Cet exemple utilise classiquement ADO et est bien en VB6. Je me suis contenté d'ajouter un bouton "Filtre" (et le code) à la fenêtre "Recordset hiérarchique avec DataGride" présentée dans mon praticile accessible par l'adresse en signature ou directemeny par http://jacma.developpez.com/grillesrsh/.

    Le tout fonctionne. Le filtre me renvoyait 45 en registrement (environ, car j'ai effacé). Le tri en ASC me renvoyait 15 pour la position absolue, et le tri en DESC me renvoyait 30 si je me souvient bien...

  8. #8
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 54
    Par défaut
    Merci pour ton aide mais je pense que l'on va laisser tomber, l'erreur doit venir de ma part, mais je ne sais pas pourquoi cela ne veut pas marcher.

    A bienôt,

    TALERE

  9. #9
    Rédacteur
    Avatar de jacma
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    612
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 612
    Par défaut
    C'est dommage de laisser tomber. Il ne faut pas rester sur une incompréhension si cela est possible.
    Si tu veux, envoie moi ton code. Il n'y a pas de raison que cela ne fonctionne pas

  10. #10
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 54
    Par défaut
    Voila mon code :

    Filtre_Click est composé de 2 combo box me permettant de filtrer sur deux critères

    J'ai 2 bouton permettant de naviguer dans mon recordset

    Enfin, j'ai une fonction permettant de remettre à jour l'ensemble de mes champs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    Private Sub Cmd_Prec_Click()
    With RS_Complet(Secteur)
        .MovePrevious
        If .BOF Then .MoveLast
    End With
    Rafraichir_Ecran
    End Sub
     
    Private Sub Cmd_Suiv_Click()
    With RS_Complet(Secteur)
        .MoveNext
        If .EOF Then .MoveFirst
    End With
    Rafraichir_Ecran
    End Sub
     
    Private Sub Filtre_Click(Index As Integer)
    Dim Filtre_SQL As Variant
    Filtre_SQL = ""
    If Filtre(0).Text <> Txt_tout Then Filtre_SQL = Filtre_SQL & IIf(Filtre_SQL <> "", "AND ", "") & "Colis.repere='" & Filtre(0).Text & "' "
    If Filtre(1).Text <> Txt_tout Then Filtre_SQL = Filtre_SQL & IIf(Filtre_SQL <> "", "AND ", "") & "Meuble.repere='" & Filtre(1).Text & "' "
    If Filtre_SQL = "" Then Filtre_SQL = 0
    If RS_Complet(Secteur).Filter <> Filtre_SQL Then
        RS_Complet(Secteur).Filter = Filtre_SQL
        Rafraichir_Ecran
    End If
    End Sub
     
     
    Private Function Rafraichir_Ecran()
    With RS_Complet(Secteur)
        If .EOF Then
            champ(0) = ""
            champ(1) = ""
            champ(2) = ""
            champ(3) = ""
            champ(4) = ""
            champ(5) = ""
            Choix_type.ListIndex = -1
            Nbre.Caption = "Aucun colis trouvé"
            Else
                champ(0) = ![Colis.repere]
                champ(3) = ![Meuble.Repere]
                Nbre.Caption = .RecordCount & " colis trouvés"
                Num_BO = IIf(IsNull(![Colis.Ref_BO]), -1, ![Colis.Ref_BO])
                With RS_BO
                    If Not .BOF Or Not .EOF Then .MoveFirst
                    .Find "ID=" & Num_BO
                    If Not .EOF Then
                        champ(1) = !Adresse
                        champ(2) = !Designation
                        champ(4) = !Nom
                        champ(5) = !type_prop
                        Choix_type.ListIndex = !type_SM
                        Else
                            champ(1) = "BO introuvable"
                            champ(2) = "BO introuvable"
                            champ(4) = "BO introuvable"
                            champ(5) = "BO introuvable"
                            Choix_type.ListIndex = -1
                    End If
                End With
        End If
    End With
    End Function
    dans le label "nbre", je souhaiterais indiquer la position de l'enregistrement or je n'ai que le nombre à ma disposition ...

    Si tu trouves ... respect ...

  11. #11
    Rédacteur
    Avatar de jacma
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    612
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 612
    Par défaut
    Je ne comprends pas ton test avec Iif.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Filtre(0).Text <> Txt_tout Then Filtre_SQL = Filtre_SQL & IIf(Filtre_SQL <> "", "AND ", "") & "Colis.repere='" & Filtre(0).Text & "' "
    Quel est le test, le premier argument renvoyé, le second?

    D'une façon générale, je te conseille (vivement ) d'utiliser un test normal If...Then, ElseIf Then.... C'est beaucoup plus lisible.

  12. #12
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 54
    Par défaut
    cela me permet de mettre un " AND " entre mes deux arguments dans le cas ou les deux sont renseigné... si il y en a qu'un seul, pas besoin.

    txt_tout="?"

    si Filtre(0)<>"?" et Filtre(1)<>"?" c'est que le fitre doit-être actif pour les deux champs .. il faut donc un " AND " entre les deux conditions. En gros, si j'ai déjà inséré une condition, je met un " AND " avant d'insérer la deuxième condition.

  13. #13
    Rédacteur
    Avatar de jacma
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    612
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 612
    Par défaut
    J'ai reconstitué le code ci-dessous qui rempli une fonction similaire avec tes 2 Iif. J'ai utilisé des variables pour le filtre (stFiltre1 et 2). Le résultat renvoyé dans les msgbox indiquent bien 6 villes "Balwinsville" dans l'état "NY", et l'enregistrement dont la valeur du champ Name est "IRWIN PROFESSIONAL" est le quatrième. Donc les méthodes employées sont bonnes et il faut chercher une erreur ailleurs. Mais où : Je ne vois pas...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    Private Sub cmdFiltre_Click(Index As Integer)
     
      Dim strFiltre1 As String
      Dim strFiltre2 As String
      Dim Filtre_SQL As Variant
     
      strFiltre1 = "NY" 'filtre sur Etat, équivalent à to Colis.repere
      strFiltre2 = "Baldwinsville"  'filtre sur Ville, équivalant à ton Meuble.repere
     
      Filtre_SQL = ""
     
      Filtre_SQL = Filtre_SQL _
          & IIf(Filtre_SQL <> "", "AND ", "") & "State='" & strFiltre1 & "' "
      Filtre_SQL = Filtre_SQL _
          & IIf(Filtre_SQL <> "", "AND ", "") & "City='" & strFiltre2 & "' "
     
      'rsPub.Filter = "State = 'NY'"
      rsPub.Filter = Filtre_SQL
      rsPub.Sort = "Name ASC" 'Ou DESC
      MsgBox rsPub.RecordCount
     
      rsPub.Find "Name = 'IRWIN PROFESSIONAL'"
      MsgBox rsPub.Fields(2)
      MsgBox rsPub.AbsolutePosition
     
    End Sub

  14. #14
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 54
    Par défaut
    N'y-a-t-il une propriété qu'il faut mettre à True ( ou false ) et qui réactualise absoluteposition sur action du filtre ? Je sais qu'il y en a une qui permet d'arreter les enregistrement sur le dernier en cours et non sur EOF.

    Qu'en penses tu ?

  15. #15
    Rédacteur
    Avatar de jacma
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    612
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 612
    Par défaut
    Pas à ma connaissance.

    As-tu eu l'occasion de tester mon dernier code. Il devrait t'aider à identifier la cause du problème, car il fonctionne sans aucun paramétrage particulier.

    UN point: pour l'isntant ton label n'ai pas programmé pour afficher la position relative. Il n'affiche que le nombre d'enregistrement. Je présume que tu as fais tes tests avec dans ta ligne de code .AbsolutePosition dans ta ligne de code? Sait-on jamais...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Nbre.Caption = .RecordCount & " colis trouvés"

  16. #16
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 54
    Par défaut
    bien sûr ...

    au debut, j'avais écris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Nbre.Caption =  .absoluteposition & " sur " .RecordCount & " colis trouvés"
    Je vais voir ton code et je te dis ce qu'il en est ..

  17. #17
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 54
    Par défaut
    J'ai trouvé ...

    Mon curseur était coté serveur, ce qui fait que ce n'est pas mis à jour ! je l'ai mis coté client et ça marche !

    Merci pour ton aide

    A bientôt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    Private Sub cmdFiltre_Click()
    Dim ma_cnx As New ADODB.Connection
    Dim rsPub As New ADODB.Recordset
    ma_cnx.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Documents and Settings\jdarocha\Bureau\bd1.mdb"
    With rsPub
            .ActiveConnection = ma_cnx
            .Source = "SELECT * FROM Publishers"
            .LockType = adLockOptimistic
            .CursorType = adOpenKeyset
     
            .CursorLocation = adUseServer
            .Open
            .Find "Name = 'IRWIN PROFESSIONAL'"
            Message = "Serveur :" & Chr(10) & Chr(9) & "Non filtré : " & .AbsolutePosition & " sur " & .RecordCount
            .Filter = "State='NY' AND City='Baldwinsville'"
            .Find "Name = 'IRWIN PROFESSIONAL'"
            Message = Message & Chr(10) & Chr(9) & "Filtré : " & .AbsolutePosition & " sur " & .RecordCount
            .Close
     
            .CursorLocation = adUseClient
            .Open
            .Find "Name = 'IRWIN PROFESSIONAL'"
            Message = Message & Chr(10) & Chr(10) & "Client :" & Chr(10) & Chr(9) & "Non filtré : " & .AbsolutePosition & " sur " & .RecordCount
            .Filter = "State='NY' AND City='Baldwinsville'"
            .Find "Name = 'IRWIN PROFESSIONAL'"
            Message = Message & Chr(10) & Chr(9) & "Filtré : " & .AbsolutePosition & " sur " & .RecordCount
            .Close
    End With
    MsgBox Message, vbInformation
    End Sub

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Trouver la position d'un enregistrement dans un recordset
    Par zooffy dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/07/2007, 14h49
  2. Ajout d'enregistrement sur formulaire filtré
    Par bestall666 dans le forum IHM
    Réponses: 2
    Dernier message: 20/02/2007, 10h42
  3. position d'un enregistrement dans un RecordSet
    Par zooffy dans le forum ASP
    Réponses: 2
    Dernier message: 23/11/2006, 17h13
  4. position d'un enregistrement dans un recordset
    Par jessy212 dans le forum Access
    Réponses: 4
    Dernier message: 31/08/2006, 10h56
  5. Réponses: 16
    Dernier message: 16/05/2006, 10h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo