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

Requêtes et SQL. Discussion :

Recherche dans une 2e table


Sujet :

Requêtes et SQL.

  1. #1
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 176
    Points : 79
    Points
    79
    Par défaut Recherche dans une 2e table
    Bonjour à tous,
    Je suis nouveau (bien que retraité !!) et j'espère être dans le bon forum. Sinon je m'en excuse par avance.
    Je suis radioamateur et pas spécialiste du tout des bases de données. Je me suis constitué avec Delphi une application regroupant les contacts radio que j'effectue. Jusque là c'est bon, je peux faire des tas de tris et de recherches de toutes sortes. J'ai la table Access des contacts "tblContacts" et une autre table "tblDxcc" comprenant les préfixes (des groupes de 1, 2 ou 3 caractères lettres ou chiffres) attribués à chaque pays et qui constitue le début de l'indicatif de chaque station contactée.
    Problème : je désirerais qu'à chaque saisie dans un TEdit de l'indicatif de chaque station contactée j'ai l'affichage du pays d'origine.
    Mais la difficulté, pour moi, vient du fait que les préfixes sont composés de :
    -1 lettre : F pour France, G pour Angleterre, I pour Italie, et d'autres
    -2 lettres : DF ou DJ ou DK pour Allemagne, IK ou IT ou IV pour l'Italie, GM pour Ecosse, et d'autres
    -1 chiffre + 1 lettre : 4S pour Sri-Lanka, 6W pour Sénégal, 9K pour Koweit, et d'autres
    -1 chiffre + 1 lettre + 1 chiffre : 9M2 pour la Malaisie, 3B8 pour l'Île Maurice, 1A0 pour l'Ordre de Malte, et d'autres.
    Je ne sais pas comment isoler ces 1, 2 ou 3 premiers caractères et aller les chercher dans "tblDxcc" pour les afficher dans l'interface.
    J'espère avoir été clair sinon n'hésitez pas à me demander des précisions. C'est un domaine et un cas assez particuliers, je le concède.
    Merci à tous par avance. Votre aide me sera précieuse.

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Juste pour être sur, tu vas faire une interface en Access pas en Delphi ? Sinon ma réponse ne te servira pas à grand chose :-).

    Et si je t'ai bien compris l'indicatif n'est pas découpé en 2 champs préfixe pays et suffixe station (ce qui serait la solution la plus facile à vivre). Et si tu n'as pas des tonnes de contacts, je t'inviterai à faire cela.
    Sinon, on ne peut pas utiliser une jointure.
    Et je te propose la fonction VBA suivante à mettre dans un module et appeler là où tu en as besoin.
    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
     
    public function LirePays(prmIndicatif as variant) as string
        dim result as string
        dim nomPays as variant
     
        dim i as long:for i=3 to 1 step -1 
            'Cherche le code en commençant par les plus longs
            nomPays=Dfirst("NomPays", "tblDxcc", "[CodePays]=""" & left(Nz(prmIndicatif, ""), i) & """")
     
            if not isnull(nomPays) then
              'On l'a trouvé
              result=cstr(nomPays)
              exit for
            end if
     
        next i
     
        LirePays=result
    end function
    Les noms sont à adapter à ta réalité.

    Après tu peux te servir de cette fonction partout où tu peux utiliser une fonction dans Access.
    Par exemple dans un formulaire tu peux mettre cette fonction comme source de données d'un contrôle.
    Cela devient quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =LirePays([NomTonControleInidicatif])
    Ou dans un champ calculé dans une requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pays : LirePays([NomTonChampInidicatif])
    Si tu as des questions n'hésite pas.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 176
    Points : 79
    Points
    79
    Par défaut Recherche dans une 2e table
    Bonjour Marot r et merci pour ta réponse rapide.
    Alors oui, c'est une base de données Access pilotée par Delphi. Jusque là je n'ai aucun problème, à part celui-ci. Et non, l'indicatif n'est pas découpé en 2 parties : préfixe et suffixe.Effectivement ce serait plus simple. Par exemple mon propre indicatif est F5JCG, ce serait simple d'avoir 2 champs, 1 pour le F et 1 pour 5JCG. A vrai dire je n'y avais pas pensé mais c'est une idée à creuser à part que j'ai déjà des milliers de contacts saisis depuis le 28/02/1984 !!!
    Pour ta solution en VBA elle semble intéressante. Je vais la décortiquer et voir si je peux l'adapter en Pascal/Delphi.
    En tout cas, merci encore. Je savais que je pouvais compter sur la communauté. A bientôt après étude et essai.

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    DFisrt() est une fonction qui retourne le champ du 1ere 'enregistrement de la source de données qui répond aux critères spécifiés.

    C'est un peu comme

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT TOP 1 [tblDxcc].[NomPays] 
    FROM [tblDxcc]
    WHERE [tblDxcc].[CodePays]=Left(prmIndicatif, i)

    Et elle retourne Null si il n'y a pas d'enregistrement correspondant.

    Le Nz() remplace un Null par une valeur, ici une chaîne vide.
    Je l'ai mis pour le cas où tu passerai un Null (pas d'information) à la fonction.

    Le reste n'est pas vraiment spécial et devrait être facilement traduisible en Delphi.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  5. #5
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 176
    Points : 79
    Points
    79
    Par défaut Recherche dans une 2e table
    Bonjour à tous,
    Mon problème actuel est de convertir l'excellente solution de Marot en Pascal/Delphi. Ce qui veut dire en clair que je galère mais que c'est agréable de se détartrer les méninges. Si vous pouvez quand même me donner une piste, grand merci à vous ! Je sens que la solution montre le bout de son nez !
    A+

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.


    Où rencontres-tu des problèmes ? Dans la compréhension ou dans l'implantation en Delphi ?

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  7. #7
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 176
    Points : 79
    Points
    79
    Par défaut Recherche dans une 2e table
    Bonjour (ou bonsoir) Marot,
    Je crois que j'approche du but. J'ai maintenant besoin de tes lumières pour un dernier problème. J'utilise ton idée de tester les indicatifs depuis 3 caractères jusqu'à 1, ce qui est LA solution. J'ai donc fait une boucle FOR de 3 à 1. Elle fonctionne mais va directement à 1 sans s'arrêter à 3 ou à 2 le cas échéant.
    Pour essai, j'ai fait FOR 3 DOWNTO 2, j'ai bien le pays concerné, avec FOR 3 DOWNTO 3, j'ai bien aussi le pays concerné. En fait je sors de la boucle trop tôt ou trop tard.
    Voici ma procédure :

    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
    procedure TForm1.Button1Click(Sender: TObject);
    var i: Integer;
        PrefPays: Variant;
    begin
      PrefPays := Edit1.Text;
      For i := 3 downto 1 do
      With AdoQuery1 do
      begin
        SQL.Clear;
        SQL.Add('Select * from tblDxcc Where Prefixe Like' + QuotedStr(LeftStr(PrefPays,i)));
        Open;
      end;
      Label1.Caption := ADOQuery1.fieldbyname('Prefixe').value;
      Label2.Caption := ADOQuery1.fieldbyname('Contree').value;
    end;
    Voilà, si tu peux y jeter un oeil tu découvriras sûrement la bourde ou l'erreur. Le but est proche Mais ça vient.
    Nous sommes vendredi, donc bon WE et merci pour ton aide et/ou celle d'autres amis.
    A+

    Citation : Il vaut mieux qu'il pleuve aujourd'hui plutôt qu'un jour où il fait beau (peut-être Confucius, allez savoir)

  8. #8
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 176
    Points : 79
    Points
    79
    Par défaut Recherche dans une 2e table
    Bonjour à tous,
    En fait je patauge toujours. Je recherche de l'aide pour remettre en forme la boucle FOR....DOWNTO (voir mon post précédent) qui me donne des résultats non recherchés et notamment la 1ère occurrence du pays même si ce n'est pas le bon, par exemple je recherche FM, ça s'arrête à F car c'est la 1ère occurrence des F dans la table. Je tourne autour de la solution mais je ne la vois pas.
    Au secours et merci beaucoup pour votre aide.
    A+

  9. #9
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    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 648
    Points : 14 626
    Points
    14 626
    Par défaut
    bonjour f5jcg_Lulu,
    pour du code Delphi, peut-être serait-il préférable de poster sur le forum adéquat, tu auras certainement plus de réponses
    https://www.developpez.net/forums/f1...pement/delphi/
    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. #10
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 176
    Points : 79
    Points
    79
    Par défaut Recherche dans une 2e table
    Bonjour tee_grandbois,
    Oui c'est probable et je vous demande de m'excuser pour mon inexpérience des forums. J'y cours tout de suite.
    Merci encore

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/10/2009, 18h49
  2. [VB6] Erreur durant la recherche dans une table
    Par quaife dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 03/04/2006, 17h21
  3. Réponses: 2
    Dernier message: 07/03/2006, 15h27
  4. Recherche dans une table
    Par Fredo67 dans le forum Access
    Réponses: 2
    Dernier message: 28/02/2006, 17h21
  5. recherche dans une table Access en ASP
    Par D-D dans le forum ASP
    Réponses: 3
    Dernier message: 09/06/2004, 10h12

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