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

HyperFileSQL Discussion :

Requete de recherche retournant le nom des tables contenant une valeur donnée


Sujet :

HyperFileSQL

  1. #1
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 66
    Points : 140
    Points
    140
    Par défaut Requete de recherche retournant le nom des tables contenant une valeur donnée
    Bonjour,
    J'ai un petit soucis concernant une requête un peu exotique. Je souhaite obtenir le nom des tables contenant une valeur que je recherche.

    Je connais :
    • Le nom des tables dans lesquelles j'effectue ma recherche
    • Le nom des colones dans lesquelles je recherche ma variable
    • La valeur de la variable.


    Je souhaite obtenir :
    Le nom de la où les table(s) contenant la valeur que je cherche.

    Je partirais comme solution sur une requete SQL du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT idT1, idT2, idT3 FROM table1 t1, table2 t2, table3 t3
    WHERE t1.col1='valeur' OR t2.col2='valeur' OR t3.col3='valeur';
    idTx étant l'identifiant de l'identifiant d'un enregistrement
    tablex étant un nom de table

    Le soucis c'est que je souhaite juste obtenir le nom des tables et l'id des lignes obtenues dans lesquelles j'ai cette variable sans avoir à faire une requete par table. Et je ne vois pas du tout comment obtenir le nom de la table.
    J'aurais pu faire comme ça en vérifiant juste la présence d'un resultat. Mais je doit faire un case en fonction de la table contenant le resultat.

    Merci d'avance
    "Si ne pas se remettre en question est la marque des imbéciles, alors le doute est l'apanage de l'intelligence"

  2. #2
    Membre confirmé
    Homme Profil pro
    Consultant
    Inscrit en
    Octobre 2004
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 254
    Points : 608
    Points
    608
    Par défaut
    Je dirai que quelque soit le SGBD, tu sera obligé de faire une requete par table.

    Avec HF, tu peux boucler sur les tables en parcourant HListeFichiers()
    Puis sur chaque table, construire une requete en parcourant HListeRubriques et en concaténant une clause WHERE, du genre :
    POUR TOUTE CHAINE s DE HListeRubriques(matable) SEPAREE PAR RC
    sWhere += " OR "+s+" = 'toto' "
    FIN

    Puis tu exécute la requete et tu comptes le nb d'enr qu'elle retourne.

    Et ce sur chaque table.

    Sur des SGBD SQL compliant, tu peux utiliser les information schema pour boucler sur les tables et les colonnes.

  3. #3
    Membre éprouvé Avatar de wimbish
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 416
    Points : 1 073
    Points
    1 073
    Par défaut
    Bonjour,
    je ferais (en pseudo code):
    Listetable est un tableau de chaine
    pour toute tableX de ListeTable
    mareq = "SELECT Count(IDtx) as nb FROM %1 WHERE condition"
    mareq = chaineconstruit(mareq, tablex)
    hexecuterequete(mareq)
    si nb > 0 alors resultat += tablex
    FIN
    Christophe.

    Tous les chemins mènent à Rome http://doc.pcsoft.fr/fr-FR/

  4. #4
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 66
    Points : 140
    Points
    140
    Par défaut
    @Arnaud B.
    Si j'ai bien compris, je précise que je débute en Windev et avec HF (je suis habitué à MySQL et des langages plus classiques), je doit partir sur une solution du genre :

    Variables
    Tab[][], tableau 2D contenant
    • en ligne 0 le nom des tables
    • en ligne 1 le nom de l'attribut identifiant de la table
    • sur les lignes suivantes les noms des attributs à intéroger

    Chaine, contenant la chaine de caractère à trouver
    requete, chaine de caractères contenant une requete
    resultat, contient le resultat de la requete
    nbresult, contient le nombre de resultats
    i,j compteurs de boucle

    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
    borne = tab[].longueur
    POUR i de 0 à borne, par pas de 1 FAIRE
        requete="SELECT " + tab[i][0] + " FROM tab[i][1] WHERE "
        borne2=tab[i][].longueur
        POUR j de 2 à borne2, par pas de 1 FAIRE
            requete += tab[i][j] + "='" + valeur + "' OR "
        FPOUR
     
        resultat=HExecuteRequete(requete,...,...,...)
        nbResult=HNBENr(resultat)
     
        SI (nbResult)<0 ALORS
            //traitement erreur
        SINON si nbResult>0
            //traitement resultat
        FSI
    FPOUR
    @wimbish
    QU'est ce que le %1 dans
    mareq = "SELECT Count(IDtx) as nb FROM %1 WHERE condition"
    Je ne connais pas cette instruction/variable/etc.
    "Si ne pas se remettre en question est la marque des imbéciles, alors le doute est l'apanage de l'intelligence"

  5. #5
    Membre éprouvé Avatar de wimbish
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 416
    Points : 1 073
    Points
    1 073
    Par défaut
    bonjour,
    cela permet d'insérer une variable dans du texte.
    regarde l'aide de la fonction ChaineConstruit()
    Christophe.

    Tous les chemins mènent à Rome http://doc.pcsoft.fr/fr-FR/

  6. #6
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 66
    Points : 140
    Points
    140
    Par défaut
    Je coince sur un autre point.
    Comment traiter directement le resultat de la requête (Comme j'ai l'habitude en PHP par exemple avec fetch_row()). Dans certains cas j'ai besoin du resultat de la requete pour construire une autre requete.
    "Si ne pas se remettre en question est la marque des imbéciles, alors le doute est l'apanage de l'intelligence"

  7. #7
    Membre éprouvé Avatar de wimbish
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 416
    Points : 1 073
    Points
    1 073
    Par défaut
    Le resultat de la requête est une source de donnée qui se manipule comme un fichier HF
    Exemple :
    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
     
    sdMareq est une Source de Données
    sTsql est une chaîne
    sTsql = [
    SELECT * FROM FIC
    WHERE
    FIC.ID = '%1'
    ]
    sTsql =ChaîneConstruit(sTsql,pId)
     
    SI HExécuteRequêteSQL(sdMareq,hRequêteDéfaut,sTsql) ALORS
    	POUR TOUT sdMareq 
               info(sdMareq.Rub1)
            FIN
    FIN
    Christophe.

    Tous les chemins mènent à Rome http://doc.pcsoft.fr/fr-FR/

  8. #8
    Membre confirmé
    Homme Profil pro
    Consultant
    Inscrit en
    Octobre 2004
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 254
    Points : 608
    Points
    608
    Par défaut
    Oui c'est le principe.

    Attention tu confonds variable "source de données" et chaine SQL dans ton code (voir la réponse de Wimbish qui te donne la méthode);

    Cdlt, Arnaud.

    Citation Envoyé par Exentius Voir le message
    @Arnaud B.
    Si j'ai bien compris, je précise que je débute en Windev et avec HF (je suis habitué à MySQL et des langages plus classiques), je doit partir sur une solution du genre :

    Variables
    Tab[][], tableau 2D contenant
    • en ligne 0 le nom des tables
    • en ligne 1 le nom de l'attribut identifiant de la table
    • sur les lignes suivantes les noms des attributs à intéroger

    Chaine, contenant la chaine de caractère à trouver
    requete, chaine de caractères contenant une requete
    resultat, contient le resultat de la requete
    nbresult, contient le nombre de resultats
    i,j compteurs de boucle

    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
    borne = tab[].longueur
    POUR i de 0 à borne, par pas de 1 FAIRE
        requete="SELECT " + tab[i][0] + " FROM tab[i][1] WHERE "
        borne2=tab[i][].longueur
        POUR j de 2 à borne2, par pas de 1 FAIRE
            requete += tab[i][j] + "='" + valeur + "' OR "
        FPOUR
     
        resultat=HExecuteRequete(requete,...,...,...)
        nbResult=HNBENr(resultat)
     
        SI (nbResult)<0 ALORS
            //traitement erreur
        SINON si nbResult>0
            //traitement resultat
        FSI
    FPOUR
    @wimbish
    QU'est ce que le %1 dans

    Je ne connais pas cette instruction/variable/etc.

  9. #9
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 66
    Points : 140
    Points
    140
    Par défaut
    Merci des réponses j'en prend note et vous donne des nouvelles quand j'aurais implémenté et testé.
    "Si ne pas se remettre en question est la marque des imbéciles, alors le doute est l'apanage de l'intelligence"

  10. #10
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 66
    Points : 140
    Points
    140
    Par défaut
    Double poste, désolé pas moyen d'éditer le précédent .
    Bon en fait je vais passer par des HAjoute() et pas par des requêtes
    Merci quand même
    "Si ne pas se remettre en question est la marque des imbéciles, alors le doute est l'apanage de l'intelligence"

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

Discussions similaires

  1. Retourner le nom des tables lors d'un SELECT UNION
    Par freesurfer dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/10/2007, 18h28
  2. Réponses: 11
    Dernier message: 12/05/2006, 17h18
  3. Réponses: 2
    Dernier message: 23/06/2005, 17h56
  4. Afficher noms des tables d'une base
    Par jeff37 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/01/2004, 16h00
  5. noms des tables d'une base
    Par molto dans le forum SQL
    Réponses: 2
    Dernier message: 17/03/2003, 22h14

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