Précédent   Forum du club des développeurs et IT Pro > Environnements de développement > Autres EDI > 4D
4D Forum d'entraide sur 4D. Avant de poster -> FAQ 4D
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 20/05/2012, 01h08   #1
Melody Nelson
Invité de passage
 
Inscription : août 2007
Messages : 9
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 9
Points : 1
Points : 1
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 :
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
Melody Nelson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2012, 10h07   #2
ZeFiF
Membre éprouvé
 
Avatar de ZeFiF
 
Homme Philippe Voisin
Consultant informatique
Inscription : octobre 2008
Messages : 295
Détails du profil
Informations personnelles :
Nom : Homme Philippe Voisin
Localisation : France, Bas Rhin (Alsace)

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

Informations forums :
Inscription : octobre 2008
Messages : 295
Points : 496
Points : 496
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.
ZeFiF est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2012, 17h29   #3
Melody Nelson
Invité de passage
 
Inscription : août 2007
Messages : 9
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 9
Points : 1
Points : 1
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...
Melody Nelson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2012, 18h26   #4
ZeFiF
Membre éprouvé
 
Avatar de ZeFiF
 
Homme Philippe Voisin
Consultant informatique
Inscription : octobre 2008
Messages : 295
Détails du profil
Informations personnelles :
Nom : Homme Philippe Voisin
Localisation : France, Bas Rhin (Alsace)

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

Informations forums :
Inscription : octobre 2008
Messages : 295
Points : 496
Points : 496
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 :
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
ZeFiF est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2012, 19h03   #5
Melody Nelson
Invité de passage
 
Inscription : août 2007
Messages : 9
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 9
Points : 1
Points : 1
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)

Citation:
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…
Melody Nelson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/05/2012, 00h06   #6
ZeFiF
Membre éprouvé
 
Avatar de ZeFiF
 
Homme Philippe Voisin
Consultant informatique
Inscription : octobre 2008
Messages : 295
Détails du profil
Informations personnelles :
Nom : Homme Philippe Voisin
Localisation : France, Bas Rhin (Alsace)

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

Informations forums :
Inscription : octobre 2008
Messages : 295
Points : 496
Points : 496
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 ?
ZeFiF est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/05/2012, 09h17   #7
Melody Nelson
Invité de passage
 
Inscription : août 2007
Messages : 9
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 9
Points : 1
Points : 1
Citation:
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
Melody Nelson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/05/2012, 09h56   #8
ZeFiF
Membre éprouvé
 
Avatar de ZeFiF
 
Homme Philippe Voisin
Consultant informatique
Inscription : octobre 2008
Messages : 295
Détails du profil
Informations personnelles :
Nom : Homme Philippe Voisin
Localisation : France, Bas Rhin (Alsace)

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

Informations forums :
Inscription : octobre 2008
Messages : 295
Points : 496
Points : 496
ok. Voila une approche.
il faut rajouter les p et br qui vont bien...
Code :
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
ZeFiF est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2012, 23h31   #9
Melody Nelson
Invité de passage
 
Inscription : août 2007
Messages : 9
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 9
Points : 1
Points : 1
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...
Melody Nelson est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 19h00.


 
 
 
 
Partenaires

Hébergement Web