Précédent   Forum des professionnels en informatique > 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 Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/10/2007, 14h00   #1
Invité régulier
 
Inscription : septembre 2007
Messages : 20
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : septembre 2007
Messages : 20
Points : 9
Points : 9
Par défaut recherche dans un tableau a deux dimensions "recherche"

Bonjour,

j'ai recherché dans la doc 4d un exemple pour effectuer une recherche dans un tableau a deux dimensions, en vain.

Si la methode est simple dans un tableau a une dimension,
je suis obligé de faire une boucle pour un tableau a deux dimension;
tableau texte(resultats;0;4)
`j'ai créé mon tableau qui a 4 colonnes
`je vais le remplir, mais je veux incrémenter des valeur si celles-ci exitent deja dans le tableau

CHERCHER([matable];[matable]nom="@"+motachercher+"@")
Boucle ($vlTable;1;Enregistrements trouves([matable]))
existedeja:=Faux
`on fait une boucle pour savoir si le nom existedeja dela dans le tableau
Boucle ($bch;1;Taille tableau(resultats))
Si (resultats{$bch}{1}=[matable]nom)
resultats{$bch}{3}:=Chaine((Num(resultats{$bch}{3}))+1)`nombre de mots
resultats{$bch}{4}:=Chaine((Num(resultats{$bch}{4}))+1)`score total
existedeja:=Vrai
Fin de si
Fin de boucle
Si (existedeja=Faux)
$numligne:=(Taille tableau(resultats))+1
INSERER LIGNES(resultats;(Taille tableau(resultats))+1;1)
resultats{$numligne}{1}:=[matable]nom
resultats{$numligne}{2}:=Chaine([matable]id_nom)
resultats{$numligne}{3}:="1"`nombre de mots
resultats{$numligne}{4}:="1"`score total
Fin de si
ENREGISTREMENT SUIVANT([liste_titre])
Fin de boucle

Au lieu de faire cette boucle, existe-t-il un moyen plus rapide pour chercher un élément d'une colonne dans un tableau a deux dimensions?

Merci de vos reponses
Marc
longomarc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/10/2007, 16h16   #2
Responsable 4D
 
Inscription : mai 2006
Messages : 356
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : mai 2006
Messages : 356
Points : 452
Points : 452
Tableau simple :
$ElementTrouve:=Chercher dans tableau (MonTableau;$ChaineAChercher)

Tableau 2 dimensions :
$ElementTrouve:=Chercher dans tableau (MonTableau{$i};$ChaineAChercher)

Exemple :
Code :
1
2
3
4
5
6
$ChaineAChercher:="a@"
Boucle ($i;1;Taille tableau(MonTableau))
`chercher dans la 2ème col de MonTableau :
$vFind:=Chercher dans tableau(MonTableau{$i};$ChaineAChercher)
   `faire qqchose
Fin de boucle
Documentation : Chercher dans tableau

Voir aussi cette astuce publiée sur le site 4D.com :
The command "Find in array" with a two-dimensional array.
__________________
--Stephanie
Redaction 4D
Steph4D est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2007, 12h27   #3
Invité régulier
 
Inscription : septembre 2007
Messages : 20
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : septembre 2007
Messages : 20
Points : 9
Points : 9
merci encore steph de ta réponse, bien utile,

j'avais testé cette solution mais de la mauvaise maniere.
Du coup, a la place, j'ai employé le principe des "ensemble" (que je n'avais encore jamais utilisé), dont le resultat est finalement plus rapide.
Surtout si la table contient plusieurs milliers ou dizaine de milliers d'enregistrement, les boucles a chaque fois sur un tableau devient tres long, et la memoire prise par le tableau atteind des seuils critiques, du coup, on poirote en utilisant les tableau, alors que les ensembles sont plus rapides.
Le but étatnt de faire un petit moteur de recherche interne, la réponse doit être rapide.Voici ce que j'ai fini par faire de mieux , cette methode permet de d'isoler des mots, de faire des recherches dans divers champs (a vous d'adapter la formule), puis de construire des pages web avec les liens des fiches et des pages suivantes et precedentes(ici 30 pages maxi).Si vous avez encore plus rapide pour faire un petit moteur de recherche interne, merci de poster

voici les 4 methodes pour effectuer la recherche
`methode CHERCHE_WEB - elle contient 3 methodes; nettoyer_recherche , ch_mot et mes_pages_web
`en premier on épure la chaine de recherche de tous les mauvais caracteres et ensuite de tout espace inutile method=nettoyer_recherche
`on peu ajouter un filtre pour ne pas traiter les mots trop usuel tels que "de" "la" ... mais non fait ici
' t_nch est le numero de la page web en cours "url = /4daction/mamethode?ch_nom=a+la+mer+ou+la+montagne&page="
`--------------------------------------
`debut methode "cherche_web"
`Marc Longo 30 sept 2007
?qt:=caractere(34)
ENSEMBLE VIDE([liste_titre];"ensemble_temps")
chainerecherche:=ch_nom
ch_nom:=nettoyer_recherche (ch_nom)
**`je supprime les espace en double, les espaces de debut et de fin
Tant que ((Position(" ";ch_nom))>0)
ch_nom:=Remplacer chaine(ch_nom;" ";" ")
Fin tant que
Tant que ((Sous chaine(ch_nom;1;1))=" ")
ch_nom:=Sous chaine(ch_nom;2)
Fin tant que
Tant que ((Sous chaine(ch_nom;Longueur(ch_nom);1))=" ")
ch_nom:=Sous chaine(ch_nom;1;(Longueur(ch_nom))-1)
Fin tant que
t_nch:=Num(page)
chainerecherche:=ch_nom
Si (ch_nom#"")
Si (un_des_mots="oui")
Repeter
ch_mot (ch_nom)
Jusque (derniermot=Vrai)
Fin de si
Fin de si
contenu:=""
lensemble:=Enregistrements dans ensemble("ensemble_temps")
Si ((Enregistrements dans ensemble("ensemble_temps")>0))
contenu:=contenu+"<p>"+Chaine(lensemble)+Mac vers ISO(" titre(s) trouvé(s) contenant : "+chainerecherche)+"<p>"+ traite_resultat (maselection;$1;chainerecherche)
Sinon
contenu:=?zeroresultat `on a un modele tout pret si le resultat est négatif
Fin de si
ENVOYER TEXTE HTML($lemodele)
EFFACER ENSEMBLE("ensemble_temps")

voici la methode "nettoyer_recherche"
C_TEXTE($0;$1)
$autorise:="abcdefghijklmnopqrstuvwxyz'0123456789- "
$letextederecherche:=$1
$longueur_chaine:=Longueur($1)
Si ($longueur_chaine >0)
Boucle ($lecaractere;1;$longueur_chaine)
Si (Position($1?$lecaractere ?;$autorise)=0)**`si le caractere courant n'est pas dans autorisé, on le remplace par un espace
$letextederecherche:=Remplacer caracteres($letextederecherche;" ";$lecaractere)
Fin de si
Fin de boucle
Fin de si

$0:=$letextederecherche
`----------------------------------
Voici la methode "ch_mot"
C_ENTIER LONG(bouclefaites;maxiboucle)
C_BOOLEEN(derniermot)
Si ((Position(" ";ch_nom))#0)
mot:=Sous chaine(ch_nom;1;(Position(" ";ch_nom))-1)
Sinon
mot:=ch_nom
derniermot:=Vrai
Fin de si
ch_nom:=Sous chaine(ch_nom;(Position(" ";ch_nom))+1)
CHERCHER([liste_titre];[liste_titre]nom_titre="@"+mot+"@")
maxiboucle:=Enregistrements trouves([liste_titre])
Boucle ($ens1;1;maxiboucle)
Si (Appartient a ensemble("ensemble_temps")) `finalement, c'est ici que l'on gagne en rapidité en evitant les boucle pour dedoublonner
Sinon
ADJOINDRE ELEMENT([liste_titre];"ensemble_temps")
Fin de si
ENREGISTREMENT SUIVANT([liste_titre])
Fin de boucle
`-------------------------------------------------

voici la methode "mes_pages_web"
`-------------------------------------------------
TOUT SELECTIONNER([parametres])
C_ENTIER(numerodelapage)
C_TEXTE($liendespages)
`methode cree le 30 Sept 2007 par Marc Longo
**`on calcule le nombre de pages
nombredepage:=Ent((Enregistrements dans ensemble("ensemble_temps"))/[parametres]nbr_element_page)
totaltitres:=Enregistrements dans ensemble("ensemble_temps")
Si ((nombredepage*[parametres]nbr_element_page)<totaltitres)
nombredepage:=nombredepage+1
Fin de si
numerodelapage:=1
$affichage_web:=""
Si (t_nch=0)
t_nch:=1
Fin de si
UTILISER ENSEMBLE("ensemble_temps")
**`si il n'y a qu'une page
Si (nombredepage<=1)
**`on ne lie ps les pages
Tant que (Non(Fin de selection([matable])))
$lenom:=[matable]nom
$affichage_web:=$affichage_web+?modeleweb
$infosdelafiche:="<b>"+[matable]nom+"</b><p>"+[matable]resume+"<p><p>"+[matable]description
$affichage_web:=Remplacer chaine($affichage_web;"infosdelafiche";$infosdelafiche)
$infos2:="<a href="+?qt+"/4daction/ch_detail_fiche?id_fiche="+Chaine([matable]id_fiche)+?qt+"><img src="+?qt+"/images-exemples/moreinfo.gif"+?qt+"></a>"
$affichage_web:=Remplacer chaine($affichage_web;"infos2";$infos2)
ENREGISTREMENT SUIVANT([matable])
Fin tant que

Sinon **`il y a plusieurs pages il faut lier les pages
Si ((Position("&page=";$2))=0)
Sinon
$2:=Sous chaine($2;1;(Position("&page=";$2))-1)
Fin de si
$liens:="<a href="+?qt+$2+"&page="
$liendespages:=""

Si ((t_nch+[parametres]nbr_pages_maxi)<nombredepage)
pagedepart:=t_nch
pagefin:=t_nch+[parametres]nbr_pages_maxi
boucleafaire:=[parametres]nbr_pages_maxi
Sinon
pagedepart:=t_nch
pagefin:=t_nch+(nombredepage-t_nch)
boucleafaire:=(nombredepage-t_nch)+1
Fin de si

Si (t_nch>1)
Si (t_nch<[parametres]nbr_pages_maxi)
$liendespages:=$liens+Chaine(t_nch-1)+?qt+"><< "+Mac vers ISO("Précédente")+"</a> page "+Chaine(t_nch)+" "
Sinon
$liendespages:=$liens+Chaine(t_nch-20)+?qt+"><< "+Mac vers ISO("Précédente")+"</a> page "+Chaine(t_nch)+" "
Fin de si
Fin de si
Boucle ($np;1;boucleafaire-1)
Si (t_nch<=1)*&*($np=1)
$liendespages:=$liendespages+"page 1 "+$liens+Chaine(t_nch+1)+?qt+">page "+Chaine(t_nch+1)+"</a> "
Sinon
$liendespages:=$liendespages+$liens+Chaine(t_nch+$np)+?qt+">page "+Chaine($np+t_nch)+"</a> "
Fin de si
Fin de boucle
Si (boucleafaire>=[parametres]nbr_pages_maxi)
$liendespages:=$liendespages+$liens+Chaine($np+t_nch)+?qt+">Suivantes >></a> "
Fin de si

positionnement:=((t_nch*[parametres]nbr_element_page)-[parametres]nbr_element_page)
Boucle ($posi;1;positionnement)
ENREGISTREMENT SUIVANT([matable])
Fin de boucle

Boucle ($lt;1;[parametres]nbr_element_page)
Si ((Fin de selection([matable]))=Faux)
$lenom:=[matable]nom
$affichage_web:=$affichage_web+?modeleweb
$affichage_web:=Remplacer chaine($affichage_web;"/lienvignettetitre";"/4daction/webimagette_titre?id_fiche="+Chaine([matable]id_fiche))
$infosdelafiche:="<b>"+[matable]nom+"</b><p>"+[matable]periodicite+"<p><p>"+Remplacer chaine([matable]description;Caractere(13);"<br>")
$affichage_web:=Remplacer chaine($affichage_web;"infosdelafiche";$infosdelafiche)
$infos2:="<a href="+?qt+"/4daction/ch_detail_fiche?id_fiche="+Chaine([matable]id_fiche)+?qt+"><img src="+?qt+"/images-exemples/moreinfo.gif"+?qt+"></a>"
$affichage_web:=Remplacer chaine($affichage_web;"infos2";$infos2)
Fin de si
ENREGISTREMENT SUIVANT([matable])
Fin de boucle
Fin de si


$0:=$affichage_web+"<p>"+$liendespages

`-------------------------------------

voila, je n'ais pas pris le temps de déclarer toutes les variables mais meme un novice devrais se debrouiller avec ca. Je ne suis pas un developpeur donc merci de votre indulgence et de poster vos améiorations.

Un petit PS pour 4D ; ce serait bien d'avoir un indice de vitesse sur les fonctions : qui est le plus rapide? ;
au cas ou, chercher dans tableau, boucle fin de boucle, repeter jusque etc ... ou alors, on peu faire le comaparatif sois meme sur 10 ou 100 mille enregistrements ...
longomarc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2007, 13h16   #4
Invité régulier
 
Inscription : septembre 2007
Messages : 20
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : septembre 2007
Messages : 20
Points : 9
Points : 9
nota; sauf dans les urls, changez le caractere ? par <> diamant, ex ?qt est en realité <>qt .
Vous aurez noté que beaucoup de variables utilisées sont des variables process permettant de transiter d'une méthode a l'autre sans repasser les parametres.
Si vous êtes débutant et changez des variables process en variables locale (avec le $ devant), sachez que vous devrez repasser chaque parametre d'une methode a l'autre.
L'exemple ci-dessus permet de construire des pages web sans utiliser de formulaires, en utilisant des modeles en html qui sont chargés a l'ouverture de la base sous forme de variable texte multiprocess (attention a la limite des 32 000 caracteres) et contenant les variables a inserer " <!--4DHTMLVAR mavariable--> ou <!--4DVAR maviable-->.
ex:
on crée la methode recevoir_doc
`------------------
**`renvoi le texte de la page HTML $1

C_TEXTE($0;$1;$contenu)
$contenu:=""
$0:=""
$Doc:=Ouvrir document($1;"TEXT")**` Ouverture d'un document de type Texte
Si (OK=1)**` Si le document est ouvert…
Tant que (OK=1)
$0:=$0+$contenu
RECEVOIR PAQUET($Doc;$contenu;32000)**` Lecture car par carjusqu'à la fin du fichier
Fin tant que
FERMER DOCUMENT($Doc)
Sinon
ALERTE("impossible d'ouvrir "+$1)
Fin de si
`-------------------------------

puis dans la methode base sur ouverture :
`----------------------------------
`remplacer le caractere <> par le diamant
<>modele_fr:=recevoir_doc (<>racine+"DossierWeb:fr:"+"modele_fr.html")
<>modele_en:=recevoir_doc (<>racine+"DossierWeb:en:"+"modele_en.html")
`-----------------------------------

ensuite, dans vos methodes, vous pouvez intégrer le texte a mettre ou les resultats en fonction du langage choisi ( variable " langage " par exemple)

methode exemple
`-------------------------
Si (langage="")
langage:="fr"
Fin de si
Au cas ou
: (langage="fr")
$lemodele:=<>modele_fr
: (langage="en")
$lemodele:=<>modele_en
Fin de cas
`-------------------------------

si vous avez de "grosses pages web" declarez vos variables en blob (C_BLOB(monmodele;moncontenu)) et utilisez la commande
ENVOYER BLOB HTML(monmodele)

votre modele peu contenir la variable <!--4DHTMLVAR mon contenu--> ce qui vous permet d'utiliser plusieurs blob (ici 2).

Voila, bon web avec 4D


Marc Longo
longomarc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2007, 13h25   #5
Invité régulier
 
Inscription : septembre 2007
Messages : 20
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : septembre 2007
Messages : 20
Points : 9
Points : 9
desolé, encore une fois, en simplifiant mon exemple, je n'ais pas corrigé partout le nom de la table[liste_titre] en [matable], vous aurez rectifié de vous-même.
corrigez aussi ?zeroresultat en <>zeroresultat (symbole diamant) qui est le modele chargé au démarrage (C_TEXTE).
longomarc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2007, 13h28   #6
Invité régulier
 
Inscription : septembre 2007
Messages : 20
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : septembre 2007
Messages : 20
Points : 9
Points : 9
... et la methode traite_resultat en la methode mes_pages_web ...
longomarc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 20h47   #7
Invité de passage
 
Inscription : juillet 2009
Messages : 5
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 5
Points : 4
Points : 4
Par défaut Rechercher deux éléments égaux dans une matrice

Bonsoir tout le monde,
voilà je cherche un programme pascal qui fait la recherche de deux éléments égaux dans une matrice. Quelqu'un pourrait-il m'aider sur ce problème s'il vous plait.
Cordialement Hadj.
hadjila20 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h37.


 
 
 
 
Partenaires

Hébergement Web