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

VBA Access Discussion :

Filtrer une table selon une sélection par Checkbox [AC-2013]


Sujet :

VBA Access

  1. #21
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 637
    Points : 14 611
    Points
    14 611
    Par défaut
    J'ai désactivé ce mode, maintenant le champ est à nouveau "zone de texte" et malgré ça le script ne fonctionne pas avec 2 ou plusieurs choix
    ce n'est pas grave, il y a certainement une raison, maintenant que l'on a écarté le problème multi-valué il suffit de trouver laquelle.

    1) actuellement, comment sont alimentés les différentes valeurs du champ ?
    2) est-ce que le champ [Products] est basé sur le contenu de la table Products_table ?
    3) quels sont les champs de la table Products_table ?
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  2. #22
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 637
    Points : 14 611
    Points
    14 611
    Par défaut
    j'ai trouvé l'erreur, c'est moi le coupable désolé !
    Voici la partie du code erroné corrigé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        If Me.Check1.Value Then strWhere = strWhere & IIf(strWhere = "", "", "OR ") & "[Products] LIKE '*ABTHERA*' "
        If Me.Check2.Value Then strWhere = strWhere & IIf(strWhere = "", "", "OR ") & "[Products] LIKE '*ABTHERA ADVANCE*' "
        If Me.Check3.Value Then strWhere = strWhere & IIf(strWhere = "", "", "OR ") & "[Products] LIKE '*AWD*' "
        If Me.Check4.Value Then strWhere = strWhere & IIf(strWhere = "", "", "OR ") & "[Products] LIKE '*CELLUTOME*' "
        If Me.Check5.Value Then strWhere = strWhere & IIf(strWhere = "", "", "OR ") & "[Products] LIKE '*FISTULA*' "
        If Me.Check6.Value Then strWhere = strWhere & IIf(strWhere = "", "", "OR ") & "[Products] LIKE '*PREVENA*' "
        If Me.Check7.Value Then strWhere = strWhere & IIf(strWhere = "", "", "OR ") & "[Products] LIKE '*PREVENA SELECT*' "
        If Me.Check8.Value Then strWhere = strWhere & IIf(strWhere = "", "", "OR ") & "[Products] LIKE '*SNAP*' "
        If Me.Check9.Value Then strWhere = strWhere & IIf(strWhere = "", "", "OR ") & "[Products] LIKE '*VAC*' "
        If Me.Check10.Value Then strWhere = strWhere & IIf(strWhere = "", "", "OR ") & "[Products] LIKE '*VERAFLO*' "
        If Me.Check11.Value Then strWhere = strWhere & IIf(strWhere = "", "", "OR ") & "[Products] LIKE '*VERAFLO CLEANSE CHOISE*' "
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  3. #23
    Candidat au Club Avatar de maximeAA
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Septembre 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2018
    Messages : 19
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par tee_grandbois Voir le message
    ce n'est pas grave, il y a certainement une raison, maintenant que l'on a écarté le problème multi-valué il suffit de trouver laquelle.

    1) actuellement, comment sont alimentés les différentes valeurs du champ ?
    2) est-ce que le champ [Products] est basé sur le contenu de la table Products_table ?
    3) quels sont les champs de la table Products_table ?

    Bonjour tee_grandbois

    J'espère que tu vas bien aujourd'hui.
    A force de passer les soirée dessus, on va finir par trouver d'où vient le problème
    Pour répondre à tes trois questions :
    1) les valeurs sont alimentés manuellement dans la table (saisie direct dans la table), 3 lignes pour tester le programme

    2) Pour activé le champ en multi-valué, il fallait créer une table qui contenait les valeurs products. Et le champ [Products] basait sur le contenu de cette nouvelle table créee. Mais cela a été fait après que j'ai activé et modifié le champ [Products] en multi-valué, avant cela la table Products_table n'existait pas.

    3) Dans Products_table, il y a juste un seul champ contenant les noms des produits (ABTHERA, ABTHERA ADVANCE, AWD, ...)
    Pour info, cette table n'a aucune valeur après la désactivation de multi-valué.


    Pour ta nouvelle version corrigée, je vais la testé ce soir parce que je n'ai pas mon ordinateur avec moi
    J'ai hâte de voir le résultat

    Bonne journée !

  4. #24
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 637
    Points : 14 611
    Points
    14 611
    Par défaut
    bonjour,
    1) les valeurs sont alimentés manuellement dans la table (saisie direct dans la table), 3 lignes pour tester le programme
    s'agit-il bien de la saisie des valeurs dans le champ Products de la table Produits ?
    à moins que j'ai mal compris, la saisie directe dans une table n'est pas recommandée, il vaut mieux utiliser un formulaire car une faute de frappe n'est pas inévitable.
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  5. #25
    Candidat au Club Avatar de maximeAA
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Septembre 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2018
    Messages : 19
    Points : 2
    Points
    2
    Par défaut
    tee_grandbois

    Si, j'ai saisie à la main les noms produits dans le champ [Product] de la table Contacts
    Tu as raison ce n'est pas recommandé pour eviter les erreurs, pour l'instant c'est que 3 lignes que je voulais testé mais il faut que je pense à automatiser l'alimentation de ce champ avec les 11 produits.

  6. #26
    Candidat au Club Avatar de maximeAA
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Septembre 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2018
    Messages : 19
    Points : 2
    Points
    2
    Par défaut
    tee_grandbois,

    En attendant que je teste ton code ce soir, je pense que je vais essayer le champ multi-valué sur une autre version.
    je pense que j'ai trouvé la solution mais hors code VBA en bricolant dans Access, je sais que c'est pas top
    Je vais splité la colonne [Products] en deux colonnes :
    1er : contenant des mono valeur (produit par champ)
    2eme : identique à la colonne initiale, ç.à.d contenant des multi-valué séparés par ";"

    La partie sql SELECT portera sur la colonne [Products] (2eme)
    la partie condition WHERE portera sur la colonne [Products.Value] (1er).

    Je vais tester ce soir aussi.

  7. #27
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 637
    Points : 14 611
    Points
    14 611
    Par défaut
    En attendant que je teste ton code ce soir, je pense que je vais essayer le champ multi-valué sur une autre version.
    en partant du dernier code posté, cela fonctionnera aussi, même si je ne suis pas favorable à son utilisation.
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  8. #28
    Candidat au Club Avatar de maximeAA
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Septembre 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2018
    Messages : 19
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par tee_grandbois Voir le message
    j'ai trouvé l'erreur, c'est moi le coupable désolé !
    Voici la partie du code erroné corrigé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        If Me.Check1.Value Then strWhere = strWhere & IIf(strWhere = "", "", "OR ") & "[Products] LIKE '*ABTHERA*' "
        If Me.Check2.Value Then strWhere = strWhere & IIf(strWhere = "", "", "OR ") & "[Products] LIKE '*ABTHERA ADVANCE*' "
        If Me.Check3.Value Then strWhere = strWhere & IIf(strWhere = "", "", "OR ") & "[Products] LIKE '*AWD*' "
        If Me.Check4.Value Then strWhere = strWhere & IIf(strWhere = "", "", "OR ") & "[Products] LIKE '*CELLUTOME*' "
        If Me.Check5.Value Then strWhere = strWhere & IIf(strWhere = "", "", "OR ") & "[Products] LIKE '*FISTULA*' "
        If Me.Check6.Value Then strWhere = strWhere & IIf(strWhere = "", "", "OR ") & "[Products] LIKE '*PREVENA*' "
        If Me.Check7.Value Then strWhere = strWhere & IIf(strWhere = "", "", "OR ") & "[Products] LIKE '*PREVENA SELECT*' "
        If Me.Check8.Value Then strWhere = strWhere & IIf(strWhere = "", "", "OR ") & "[Products] LIKE '*SNAP*' "
        If Me.Check9.Value Then strWhere = strWhere & IIf(strWhere = "", "", "OR ") & "[Products] LIKE '*VAC*' "
        If Me.Check10.Value Then strWhere = strWhere & IIf(strWhere = "", "", "OR ") & "[Products] LIKE '*VERAFLO*' "
        If Me.Check11.Value Then strWhere = strWhere & IIf(strWhere = "", "", "OR ") & "[Products] LIKE '*VERAFLO CLEANSE CHOISE*' "

    Bonsoir tee_grandbois,
    J'ai une mauvaise nouvelle pour toi et pour moi, la version corrigée ne fonctionne pas.
    S'il te plaît jette un coup d’œil, est-ce j'ai bien déployé ton code ?


    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
     
    Private Sub btSearch_Click()
     
        Dim strRowSource As String
        Dim strWhere As String
     
        If Me.Check1.Value Then strWhere = strWhere & IIf(strWhere = "", "", "OR ") & "[Products] LIKE '*ABTHERA*' "
        If Me.Check2.Value Then strWhere = strWhere & IIf(strWhere = "", "", "OR ") & "[Products] LIKE '*ABTHERA ADVANCE*' "
        If Me.Check3.Value Then strWhere = strWhere & IIf(strWhere = "", "", "OR ") & "[Products] LIKE '*AWD*' "
        If Me.Check4.Value Then strWhere = strWhere & IIf(strWhere = "", "", "OR ") & "[Products] LIKE '*CELLUTOME*' "
        If Me.Check5.Value Then strWhere = strWhere & IIf(strWhere = "", "", "OR ") & "[Products] LIKE '*FISTULA*' "
        If Me.Check6.Value Then strWhere = strWhere & IIf(strWhere = "", "", "OR ") & "[Products] LIKE '*PREVENA*' "
        If Me.Check7.Value Then strWhere = strWhere & IIf(strWhere = "", "", "OR ") & "[Products] LIKE '*PREVENA SELECT*' "
        If Me.Check8.Value Then strWhere = strWhere & IIf(strWhere = "", "", "OR ") & "[Products] LIKE '*SNAP*' "
        If Me.Check9.Value Then strWhere = strWhere & IIf(strWhere = "", "", "OR ") & "[Products] LIKE '*VAC*' "
        If Me.Check10.Value Then strWhere = strWhere & IIf(strWhere = "", "", "OR ") & "[Products] LIKE '*VERAFLO*' "
        If Me.Check11.Value Then strWhere = strWhere & IIf(strWhere = "", "", "OR ") & "[Products] LIKE '*VERAFLO CLEANSE CHOISE*' "
     
     
        If (Me.Check1.Value = False And Me.Check2.Value = False And Me.Check3.Value = False And Me.Check4.Value = False And Me.Check5.Value = False And Me.Check6.Value = False And Me.Check7.Value = False And Me.Check8.Value = False And Me.Check9.Value = False And Me.Check10.Value = False And Me.Check11.Value = False) Then
                Reponse = MsgBox("Please select at least one product to search ", vbOKOnly, "Select product")
     
                If Reponse = vbOK Then
                   strRowSource = "SELECT [ID],[LName],[FName],[Surgical_Specialty],[Function],[Country],[Products]" & _
                       "FROM Contacts " & _
                       "ORDER BY [LName]"
                   Me.Liste1.RowSource = strRowSource
                End If
         Else
           strRowSource = "SELECT [ID],[LName],[FName],[Surgical_Specialty],[Function],[Country],[Products] " & _
                          "FROM Contacts " & _
           IIf(strWhere = "", "", " WHERE " & strWhere) & ";"
     
            Me.Liste1.RowSource = strRowSource
            Me.Liste1.RowSource = Me.Liste1.RowSource
         End If
     
    End Sub

  9. #29
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 637
    Points : 14 611
    Points
    14 611
    Par défaut
    quelle version ne fonctionne pas: celle avec ou sans le champ Products multivalué ?
    Peux-tu ajouter Debug.? strRowSource avant l'instruction Me.Liste1.RowSource = strRowSource
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  10. #30
    Candidat au Club Avatar de maximeAA
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Septembre 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2018
    Messages : 19
    Points : 2
    Points
    2
    Par défaut
    C'est la version sans le champ Products multivalué qui ne fonctionne pas


    Voici le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Debug.Print strRowSource
    Me.Liste1.RowSource = strRowSource
     
    SELECT [ID],[LName],[FName],[Surgical_Specialty],[Function],[Country],[Products] FROM Contacts  WHERE [Products] LIKE '*AWD*' ;

  11. #31
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 637
    Points : 14 611
    Points
    14 611
    Par défaut
    le code est correct, je ne comprend pas pourquoi cela ne fonctionne pas.
    Peux-tu copier le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT [ID],[LName],[FName],[Surgical_Specialty],[Function],[Country],[Products] FROM Contacts  WHERE [Products] LIKE '*AWD*' ;
    dans une nouvelle requête en mode SQL puis l'exécuter pour voir s'il affiche un résultat.
    Ensuite aller en mode création et faire une impression d'écran de la requête ?
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  12. #32
    Candidat au Club Avatar de maximeAA
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Septembre 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2018
    Messages : 19
    Points : 2
    Points
    2
    Par défaut
    voici, lorsque je clique sur exécuter, une fenêtre s'ouvre bizarrement
    J'ai mis SELECT * From Contacts ==> cela fonctionne correctement
    Images attachées Images attachées  

  13. #33
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 637
    Points : 14 611
    Points
    14 611
    Par défaut
    cela ne peut pas fonctionner, ce n'est pas la bonne icône, il ne faut pas prendre SQL Direct mais Sélection
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  14. #34
    Candidat au Club Avatar de maximeAA
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Septembre 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2018
    Messages : 19
    Points : 2
    Points
    2
    Par défaut
    Je ne comprends pas le message et pourtant la colonne [Products] n'est pas en multivalué. J'ai vérifié c'est en zone texte
    Images attachées Images attachées  

  15. #35
    Candidat au Club Avatar de maximeAA
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Septembre 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2018
    Messages : 19
    Points : 2
    Points
    2
    Par défaut
    Je pense je vais refaire le formulaire juste pour tester, j'ai peur que ce bascule entre zone texte et multivalué et vice versa a bugué le programme

  16. #36
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 637
    Points : 14 611
    Points
    14 611
    Par défaut
    le message indique que c'est un champ multivalué:
    le mieux est de créer un nouveau champ: appelle-le Products_New.
    Enregistre la table.
    Affiche la table en mode données et fait un Copier/Coller de la colonne Products vers Products_New.
    Retourne en mode création pour supprimer Products et renommer Products_New en Products.
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  17. #37
    Candidat au Club Avatar de maximeAA
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Septembre 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2018
    Messages : 19
    Points : 2
    Points
    2
    Par défaut
    BINGO !
    Bravo tee_grandbois !!
    Merci beaucoup pour ton aide, ça fonctionne finalement

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. copier une table d'une BDD dans une table d'une autre BDD
    Par faniette dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/05/2013, 10h17
  2. Réponses: 1
    Dernier message: 19/10/2011, 12h13
  3. Réponses: 7
    Dernier message: 25/03/2011, 10h52
  4. [AC-2003] insert des données d'une table dans une table d'une base externe
    Par marieo dans le forum VBA Access
    Réponses: 1
    Dernier message: 30/11/2009, 14h29
  5. Copier les enregistrements d'une table vers une table d'une autre DB
    Par karinette21 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 18/11/2008, 21h50

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