"find" permet de rechercher une valeur particulière dans une série de variables ou expressions numériques, alphanumériques ou dates.
find( valeur_à_chercher, liste_exprg ) [ <> 0 ]]
Elément | Description | Remarques |
valeur_à_ chercher | Expression à rechercher dans la liste des arguments qui suivent. | Aucune. |
liste_exprg | Liste d'expressions_généralisées séparées par le caractère ','. | Toutes les expressions doivent être du même type. |
# Recherche simple : X est un tableau de valeurs déclaré comme X(1..N)
I = find(VALEUR, X)
Infbox VALEUR-"se trouve à la place"-I-" dans le tableau X"
# Après une première saisie en tableau, se repositionner sur
# la première colonne pour une valeur recherchée
FNC_RECHERCHE
Integer I
I = find(VALEUR_RECH,[M]COLONNE1(0..[M]NBL-1))
If I<>0
zonsui = sum("COLONNE1(", num$(I-1), ")")
Endif
# Si I est nul, la recherche n'a pas abouti
Return
# Recherche de valeurs dans un tableau de chaînes
Char LIGNES(5)(40) :# 40 chaînes de 5 caractères maximum
Gosub LIRE_LIGNES :# Remplit le tableau LIGNES
I = pat(sum(LIGNES(0..39)), "*A*")
If I <> 0
Infbox "Il y a un 'A' dans au moins l'une des lignes"
Endif
I = find("A", LIGNES(0..39))
If I <> 0
Infbox 'Il y a au moins l'une des lignes égale à "A" '
Endif
# transmettre la fonction Find à la base
For [AMK]CODMSK
If [F:AMK]CODACT=ACTIV or find(ACTIV,[F:AMK]ACTBLOC(0..[F:AMK]NBBLOC-1))<>0
OBJET = "AMK"
NOM = [F:AMK]CODMSK
TRAITE = [F:AMK]TRTSPE
Gosub EXTOBJ : If !OK : Break : Endif
Endif
Next
"find" permet de rechercher une valeur particulière dans une série de variables ou d'expressions numériques, alphanumériques ou dates. "find" renvoie le rang de la valeur trouvée dans la liste donnée si la valeur est trouvée (de 1 au nombre de valeurs dans la liste) ou 0 si la valeur n'est pas trouvée.
Pour une recherche dans une série de valeurs numériques, on peut mêler des expressions et des variables de type Integer, Shortint, Decimal et Libelle.
Si l'un des arguments de la fonction est une variable dimensionnée sans précision d'indice ou d'intervalle d'indices, tous les éléments de la variable sont utilisés. La précision d'un indice ou d'un intervalle d'indice détermine les éléments à prendre en compte.
Si l'on donne un intervalle d'indices tel qu'il n'y a aucun élément dans la liste des variables à chercher (find(RECHERCHE, VALEURS(1..0)) par exemple) le résultat renvoyé est 0.
Le type du résultat est Integer.
La syntaxe du Find se terminant par "<>0" ou "=0" est à utiliser avec précaution. L'avantage de cette syntaxe est que la requête est plus performante. L'inconvénient est qu'il y a une limite dans le nombre d'éléments déclarés dans le Find de la clause where, qui provoque, à l'exécution, l'arrêt du traitement accompagné d'un message d'erreur. Sous Oracle, on a l'erreur"offset > 0x8000:too many values : Plus de mémoire disponible". La limite est de 60 champs alphanumériques ou 60 x 128 champs numériques pour les éléments de l'ensemble de la clause where..
Avec Find se terminant par "<>0" ou "=0", la fonction est transmise directement à la base de données. La requête transmise correspond à une liste de "ou" du point de vue du plan d'exécution de la base de données. Si le Find est un filtre discriminant, une clé devra exister commençant par le champ décrit par le Find pour que la requête soit performante. Oracle oriente alors sont plan d'exécution en autant de sous requêtes efficace qu'il y a de valeurs.
For [XXX] Where Find(CHAMP,3,5,9)<>0 # est traduit enSELECT ... Where CHAMP in (3,5,9)For [XXX] Where Find(CHAMP,3,5,9)=0 # est traduit enSELECT ... Where CHAMP not in (3,5,9)
Erreur | Description |
ERMODE (10) | Les indices donnés ne sont pas numériques. |
ERINDI ( 8) | Erreur de bornes pour des indices. |
ERDOM (50) | Les arguments ne sont pas du même type, ou aucune valeur ne se trouve dans la liste (dans le cas de find(VALEURS(1..0)) par exemple). |
ERDIM (55) | Trop de dimensions données. |