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

4D Discussion :

recherche en utilisant un champ d'une autre table


Sujet :

4D

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 9
    Points : 4
    Points
    4
    Par défaut recherche en utilisant un champ d'une autre table
    bonjour,

    j'utilise une application 4D compilée (version 4D 2003) et je réalise des pages web qui interrogent la base de données

    la base contient, entre autres, 2 tables : Personne et Affaire

    dans Personne, il y a toute une série de champs dont :
    - num_p (numéro unique)
    - type_personne
    - société
    - nom
    - ville
    - personne_physique (booléen)
    - etc

    dans Affaire, même chose :
    - type_affaire
    - code
    - montant
    - num_p = num_p de la personne associée à l'affaire
    - etc

    dans une page html, je fais une requête qui affiche une liste de sociétés (personne_physique = faux)

    lorsque j'affiche cette liste de sociétés, je voudrais pour chaque enregistrement de la table personne afficher la liste des affaires associées à toutes les personnes dont la société est égale à la même valeur que la société de l'enregistrement "courant"

    imaginons, une liste avec 2 sociétés :
    - société 1, je veux pour cette société afficher les 4 affaires associées à M. Dupont de la société 1 et les 2 affaires associées à M. Truc de la société 1
    - société 2, même principe que précédemment

    en gros, mon code ressemble à ça :

    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
     
    début de la boucle sur [Personne]
     
    	[Personne]Société
    	[Personne]Ville
    	autres champs de la table Personne
     
    	ma_variable:=[Personne]Société
     
    	<!-- test 1 : chercher les affaires -->
     
    	chercher([affaire];[affaire]type_affaire="projet";*)
    	chercher([affaire];&;[personne]societe=ma_variable)
     
    	--> trouve toutes les affaires de type Projet, la recherche sur [personne]société n'est pas prise en compte
     
    	<!-- test 2 : chercher les affaires -->
     
    	chercher([affaire];[affaire]type_affaire="projet")
    	chercher dans selection([affaire];[personne]societe=ma_variable)
     
    	--> trouve également toutes les affaires de type Projet, la recherche sur [personne]société n'est pas prise en compte
     
    fin de la boucle sur [Personne]
    peut-on ajouter une commande 4D pour forcer le "lien" à se faire entre Personne et Affaire, et pouvoir ainsi rechercher les affaires en utilisant le champ Société de la table Personne, plutôt que le champ Num_P ?

    merci

    ps : je ne sais pas si mon message est très clair car je ne suis pas développeur 4D mais développeur web

  2. #2
    Membre confirmé Avatar de ZeFiF
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2008
    Messages
    303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 303
    Points : 486
    Points
    486
    Par défaut
    Bonjour,

    Tu as plusieurs solutions.

    En voici une :
    ta méthode appelée sur URL va effectuer une sélection de ta table A.
    Elle va envoyer une page html qui contient des balises html pour 4D.

    La 1ère sera un 4Dloop qui va boucler sur ta sélection de A.
    Dans la boucle tu affiches les valeurs de ton enregistrement A.
    Tu insères également un 4Dscript qui appelle une méthode qui va charger les enregistrements de B pour A
    2ème 4Dloop pour afficher la sélection de B.
    Avantage : tu es maitre du design de tes valeurs affichées

    En voici une autre :
    ta méthode appelée sur URL va effectuer une sélection de ta table A.
    Elle va également chercher les enregistrement de B pour A.
    Tu fais deux boucles qui vont concaténer une variable.
    Cette variable sera placée dans ta page html que ta méthode va envoyer.
    Avantage : tu ne fais pas une requête pour chaque enregistrement de A

    Une dernière :
    Si l'extension de ta page est .shtml
    tu y place un 4Dscript qui appelle une méthode de sélection
    et tu choisis ensuite la solution 1 ou 2...
    Avantage : à déduire...

    hth
    FiF

    P.S : vérifier les attributs de chaque méthode pour qu'elle soit autorisé pour le web.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    merci FIF,

    j'ai cependant oublié de préciser quelque chose d'important, l'appli utilise le moteur web ITK, donc les commandes 4D standard dont tu parles dans ta réponse (4Dloop par exemple) ne fonctionnent pas... j'ai essayé au cas où avant de demander de l'aide, des fois que ce soit possible mais non, ça ne fait rigoureusement rien...

    sinon pour des boucles, c'est le même principe que ce que tu décris... sauf que je n'arrive pas dans ma deuxième boucle à trouver la sélection d'enregistrements qui m'intéresse car mon critère de recherche n'est pas pris en compte...

  4. #4
    Membre confirmé Avatar de ZeFiF
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2008
    Messages
    303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 303
    Points : 486
    Points
    486
    Par défaut
    si tu utilises l'excellent feu ITK, tu n'as la main que sur les commandes de bas niveau (autant que je me souvienne).

    Donc c'est la solution 2 qu'il faut prendre avec un itk_TCPSend éventuellement précédé d'un itk_Text2HTML.

    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
     
    `ma sélection de personne
    `mon tri de personne
    boucle($i;1;enregistrements trouves([personnes]))
    $vt_send:=[personnes]société+"<p>"
     
    chercher([affaires];[affaires]num_p=[personnes]num_p)
    `mon tri d'affaire
    boucle($j;1;enregistrements trouves([affaires]))
    $vt_send:=$vt_send+chaine([affaires]montant)+"<br>"
    enregistrement suivant([affaires])
    fin de boucle
    $vt_send:=$vt_send+"<hr>"
    $vl_error:= itk_TCPSend($vl_stream;$vt_send;1)
    enregistrement suivant([personnes])
    fin de boucle

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    en fait, j'ai pas de problème pour faire une boucle imbriquée mais pour retourner la sélection d'enregistrements voulus… je vais essayer d'expliquer ça autrement…

    dans la table Personne -> dans la table Affaire
    - M. Truc (Société A) -> a 2 affaires
    - M. Bidule (Société A) -> a 3 affaires
    - Société A -> a 1 affaire
    - Mme Chose (Société B) -> a 1 affaire
    - Société B -> a 3 affaires

    dans ma page, qui boucle sur la table Personne, j'ai 2 enregistrements parce que c'est le résultat d'une requête particulière qui n'affichera que des "personnes morales" (sociétés) :
    - Société A
    - Société B

    je voudrais au final ceci dans ma "boucle imbriquée" mais la recherche sur [personne]societe depuis [affaire] n'est pas prise en compte :
    - Société A a 6 affaires
    - Société B a 4 affaires

    si je fais un chercher([affaires];[affaires]num_p=[personnes]num_p), j'obtiens ceci (et c'est logique) :
    - Société A a 1 affaire
    - Société B a 3 affaires

    je voudrais pouvoir faire ce que j'ai lu dans la doc 4D, c'est à dire rechercher les affaires en utilisant un champ de la table liée Personne, en gros ça : chercher([affaire];[personne]societe=societe de l'enregistrement dans la boucle sur personne)

    L'exemple suivant recherche chaque personne se nommant "Dupont" et travaillant dans une société basée à Paris. La deuxième recherche utilise un champ venant d'une autre table. Cette recherche peut être effectuée parce que la table [Personnes] est liée à la table [Société] par un lien de N vers 1*:
    ***CHERCHER ([Personnes]; [Personnes]Nom = "Dupont"; *) ` Chercher toute personne qui s'appelle Dupont…
    ***CHERCHER ([Personnes]; &;[Société]Ville = "Paris") ` ...qui travaille pour une société à Paris
    je ne sais toujours pas si je suis claire, mais je n'arrive pas à l'expliquer autrement…

    sinon pour ITK, j'ai un peu plus de commandes que ça parce que les développeurs de l'appli en question ont créé des commandes spécifiques (pour les boucles, l'affichage des données, etc) mais ça ne change rien à mon problème ci-dessus…

  6. #6
    Membre confirmé Avatar de ZeFiF
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2008
    Messages
    303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 303
    Points : 486
    Points
    486
    Par défaut
    Ca irait mieux si les sociétés et les personnes seraient séparées dans des tables distinctes. enfin bon...

    Donc si on reprends ton exemple on a 5 enregistrements dans personnes
    les 5 présentent un nom de société et 2 n'ont pas de nom de personnes
    3 enregistrements ont la société A et 2 pour B

    ensuite on a 10 affaires, 3+3 pour A et 1+3 pour B


    c'est bien ça ?

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Ca irait mieux si les sociétés et les personnes seraient séparées dans des tables distinctes. enfin bon...
    malheureusement, je ne peux rien y changer...

    pour le reste, t'as tout bon... merci au passage pour ta patience !

    pour illustrer un peu plus, j'ai fait un petit tableau vite fait et j'ai mis aussi une copie d'écran de la recherche 4D, qui elle fonctionne très bien (pas rapide certes, mais ça marche)... d'où l'idée que j'ai en tête que ça doit être possible de trouver une commande 4D pour faire la même recherche dans ma boucle imbriquée, ou encore faire en sorte que la commande 4D standard (cf exemple cité dans un précédent message) fonctionne dans ma page...

    Click for large view - Uploaded with Skitch

    Click for large view - Uploaded with Skitch

  8. #8
    Membre confirmé Avatar de ZeFiF
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2008
    Messages
    303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 303
    Points : 486
    Points
    486
    Par défaut
    ok. Voila une approche.
    il faut rajouter les p et br qui vont bien...
    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
     
    TABLEAU ENTIER LONG($tl_personne;0)
    C_TEXTE(VT_SEND)
    TOUT SELECTIONNER([affaires])
    VALEURS DISTINCTES([affaires]id_personne;$tl_personne)
    VT_SEND:=""
    Boucle ($i;1;Taille tableau($tl_personne))
    CHERCHER([affaires];[affaires]id_personne=$tl_personne{$i})
    CHERCHER([personnes];[personnes]id_personne=$tl_personne{$i})
    VT_SEND:=VT_SEND+[personnes]societe+" "+[personnes]nom_personne+"\r"
    Boucle ($J;1;Enregistrements trouves([affaires]))
    VT_SEND:=VT_SEND+Chaine([affaires]montant)+"\r"
    ENREGISTREMENT SUIVANT([affaires])
    Fin de boucle 
    VT_SEND:=VT_SEND+("-"*25)+"\r"
    Fin de boucle

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    merci pour tes idées FIF, et désolée pour le temps de réponse...

    je vais effectivement partir sur un tableau et ensuite je devrais pouvoir atteindre mes objectifs avec des méthodes spéciales de l'appli 4D en question...

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/06/2014, 16h26
  2. rechercher la valeur d'un champs dans les champs d'une autre table
    Par aloe-vera dans le forum Développement de jobs
    Réponses: 4
    Dernier message: 02/08/2012, 14h53
  3. Utiliser les données d'une table comme champs d'une autre table
    Par Jalabert dans le forum Modélisation
    Réponses: 6
    Dernier message: 03/06/2010, 08h51
  4. afficher un champ d'une autre table, Help!
    Par chakan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 07/03/2004, 23h20
  5. [CR] Afficher un champs lié à un champs d'une autre table
    Par Madduck dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 17/09/2003, 11h48

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