|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité régulier
![]() Inscription : septembre 2007 Messages : 20 ![]() |
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 |
|
|
00
|
|
|
#2 | ||
![]() ![]() Inscription : mai 2006 Messages : 356 ![]() |
Tableau simple :
$ElementTrouve:=Chercher dans tableau (MonTableau;$ChaineAChercher) Tableau 2 dimensions : $ElementTrouve:=Chercher dans tableau (MonTableau{$i};$ChaineAChercher) Exemple : Code :
Voir aussi cette astuce publiée sur le site 4D.com : The command "Find in array" with a two-dimensional array.
__________________
--Stephanie Redaction 4D |
||
|
|
00
|
|
|
#3 |
|
Invité régulier
![]() Inscription : septembre 2007 Messages : 20 ![]() |
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 ... |
|
|
00
|
|
|
#4 |
|
Invité régulier
![]() Inscription : septembre 2007 Messages : 20 ![]() |
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 |
|
|
00
|
|
|
#5 |
|
Invité régulier
![]() Inscription : septembre 2007 Messages : 20 ![]() |
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). |
|
|
00
|
|
|
#6 |
|
Invité régulier
![]() Inscription : septembre 2007 Messages : 20 ![]() |
... et la methode traite_resultat en la methode mes_pages_web ...
|
|
|
00
|
|
|
#7 |
|
Invité de passage
![]() Inscription : juillet 2009 Messages : 5 ![]() |
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. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com