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 dans un tableau a deux dimensions "recherche"


Sujet :

4D

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 22
    Points : 21
    Points
    21
    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 méthode est simple dans un tableau a une dimension,
    je suis obligé de faire une boucle pour un tableau a deux dimension;
    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
    25
    tableau texte(résultats;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 existent déjà 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 réponses
    Marc

  2. #2
    Membre confirmé

    Profil pro
    Inscrit en
    Mai 2006
    Messages
    359
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 359
    Points : 613
    Points
    613
    Par défaut
    Tableau simple :
    $ElementTrouve:=Chercher dans tableau (MonTableau;$ChaineAChercher)

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

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.
    --Steph4D

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 22
    Points : 21
    Points
    21
    Par défaut
    merci encore steph de ta réponse, bien utile,

    j'avais testé cette solution mais de la mauvaise manière.
    Du coup, a la place, j'ai employé le principe des "ensemble" (que je n'avais encore jamais utilisé), dont le résultat 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 très long, et la mémoire prise par le tableau atteint des seuils critiques, du coup, on poirote en utilisant les tableau, alors que les ensembles sont plus rapides.
    Le but étant 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 méthode 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 précédentes(ici 30 pages maxi). Si vous avez encore plus rapide pour faire un petit moteur de recherche interne, merci de poster

    voici les 4 méthodes pour effectuer la recherche
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    `méthode CHERCHE_WEB - elle contient 3 méthodes; nettoyer_recherche , ch_mot et mes_pages_web
    `en premier on épure la chaine de recherche de tous les mauvais caractères 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"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    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"
    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
    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 méthode "mes_pages_web"
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    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’ai pas pris le temps de déclarer toutes les variables mais même un novice devrais se débrouiller avec ça. Je ne suis pas un développeur donc merci de votre indulgence et de poster vos améliorations.

    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, répéter jusque etc ... ou alors, on peu faire le comparatif sois même sur 10 ou 100 mille enregistrements ...

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 22
    Points : 21
    Points
    21
    Par défaut
    nota; sauf dans les urls, changez le caractère ? 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 paramètres.
    Si vous êtes débutant et changez des variables process en variables locale (avec le $ devant), sachez que vous devrez repasser chaque paramètre d'une méthode a l'autre.
    L'exemple ci-dessus permet de construire des pages web sans utiliser de formulaires, en utilisant des modèles 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 insérer " <!--4DHTMLVAR mavariable--> ou <!--4DVAR maviable-->.
    ex:
    on crée la méthode recevoir_doc
    `------------------
    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
    **`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 méthode base sur ouverture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    `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 méthodes, vous pouvez intégrer le texte a mettre ou les résultats en fonction du langage choisi ( variable " langage " par exemple)

    méthode exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    `-------------------------
    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" déclarez vos variables en blob (C_BLOB(monmodele;moncontenu)) et utilisez la commande
    ENVOYER BLOB HTML(monmodele)

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

    Voila, bon web avec 4D


    Marc Longo

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 22
    Points : 21
    Points
    21
    Par défaut
    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).

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 22
    Points : 21
    Points
    21
    Par défaut
    ... et la methode traite_resultat en la methode mes_pages_web ...

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 16
    Points : 17
    Points
    17
    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.

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

Discussions similaires

  1. Recherche dans un tableau associatif à deux dimensions
    Par General_Batton dans le forum Langage
    Réponses: 4
    Dernier message: 16/10/2014, 22h47
  2. Réponses: 2
    Dernier message: 30/08/2014, 11h20
  3. Réponses: 6
    Dernier message: 19/11/2008, 10h53
  4. Un string dans un tableau de deux dimensions...
    Par FinalSpirit dans le forum C++
    Réponses: 5
    Dernier message: 15/01/2006, 14h29

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