KEYMATCH()
Instruction dBase IV et suivants
Indique si l'expression spécifiée est trouvée dans un index.
Syntaxe
KEYMATCH (<liste d'expressions> [,<position d'index expN> |[<fichier .mdx
expC>,]<repère d'index expN>] [,<alias>]] )
<liste d'expressions>
Spécifie l'expression de tout type de données à rechercher. Pour les tables Paradox et
SQL, vous pouvez spécifier une ou plusieurs valeurs (séparées par des virgules) qui
correspondent à des champs clés d'index simples ou composés.
<position d'index expN>
Spécifie un fichier index .NDX par la position de l'index dans la liste d'index ouverts
pour la zone de travail en cours ou la zone de travail spécifiée.
<fichier .mdx expC >
Spécifie le fichier index multiple qui contient le repère d'index à vérifier.
<repère d'index expN>
Spécifie un repère d'index par sa position dans le fichier .MDX pour la table en cours
ou la table spécifiée.
<alias>
Un numéro de zone de travail (1 à 225), une lettre de zone de travail (A à J) ou un nom
d'alias. La lettre de zone de travail ou le nom d'alias doit être entouré de guillemets.
La fonction KEYMATCH( ) détermine si les expressions clés spécifiées sont
trouvées dans un index particulier. KEYMATCH( ) renvoie la valeur logique .T. ou .F.
pour indiquer si l'expression spécifiée a été trouvée. SET EXACT détermine si la
correspondance exacte de données de chaînes de caractères est requise.
Une utilisation primaire de la fonction KEYMATCH( ) consiste à vérifier les valeurs
en double pendant une opération APPEND.
KEYMATCH( ) n'effectue sa recherche que dans le repère d'index ou le fichier d'index
spécifié. Elle ignore le paramétrage de SET DELETED, SET FILTER et SET KEY,
garantissant l'intégrité des données dans une table, même lorsque vous travaillez avec
un sous-ensemble des enregistrements de la table.
Si vous ne spécifiez que l'expression (exp), KEYMATCH( ) recherche dans l'index
maître en cours une clé d'index de même valeur. Si une clé d'index correspondante est
trouvée, KEYMATCH( ) renvoie la valeur logique .T.
Pour rechercher d'autres index que l'index maître
actuel, vous devez spécifier l'index par la position d'index. Il y a deux façons de le
faire:
1. Par la position de l'index dans la liste des index ouvert. La numérotation des index
est compliquée si vous avez ouvert des indexs .NDX ou des fichiers .MDX en
non-production. MDX fichiers. Pour plus d'informations sur la numérotation des indes,
consultez SET INDEX.
2. Par la position d'une balise d'index dans un fichier .MDX. Si vous ne spécifiez pas
<nomdufichier .mdx expC>, le fichier .MDX en production est utilisé.
Quoi qu'il en soit, il est souvent plus facile de faire référence à une balise d'index
par son nom en utilisant TAGNO() pour obtenir le numéro de position correspondant.
A partir des versions 7, dbase tient compte de la position de SET DELETED,
excluant les enregistrements effacés si sur ON.
Gary White a créé un code qui peut émuler cette fonctionnalité, car il
n'y a pas d'équivalent direct en OODML.
function keyExists |
parameters cTable, cIndex, cKey |
local q, lFound |
q=new query() |
q.sql="select * from &cTable." |
q.active = true |
q.rowset.indexName = cIndex |
lFound = q.rowset.findKey( cKey ) |
q.active = false |
release object q |
q=null |
return lFound |
Cette fonction ouvre une table et recherche l'expression, en utilisant les
objets OODML, et renvoie une valeur logique si la clé est trouvée. Pour l'utiliser, vous
appelez la fonction ainsi :
? keyExists( "MaTable", "NomDelIndex",
"CléRecherchée" ) |
Gary White et Ken Mayer ont aussi mis dans dUFLP, la méthode KeyExists
située dans MiscCode.prg.
Dans l'exemple suivant, KEYMATCH( ) détermine si une valeur
transmise est trouvée dans l'index :
SET EXACT OFF && KEYMATCH est affectée
par SET EXACT |
USE SOCIETE EXCLUSIVE |
INDEX ON SOCIETE TAG CompanyCa FOR ETAT = "CA" |
INDEX ON VILLE TAG VILLE OF Location |
? KEYMATCH("Cons",TAGNO("CompanyCa")) |
?
KEYMATCH("Compton","Location",TAGNO("VILLE")) |
Les deux réponses renvoient la valeur logique .T. à partir de la table
exemple.
Les
difficultées rencontrées :
|
Versions 16 bits
ATTENTION, comme indiqué "garantissant l'intégrité des données
dans une table, même lorsque vous travaillez avec un sous-ensemble des enregistrements de
la table, la fonction KEYMATCH( ) ignore le paramétrage de SET DELETED, SET FILTER
et SET KEY". Si on craint une correspondance positive avec un enregistrement en fait
effacé, il faut "packer" la table (instruction PACK) avant.
Si on veut augmenter la sécurité, les versions antérieures à 7 ne
recréeant pas l'index, des corruptions éventuelles ne seront pas fixées, il faut
détruire le fichier MDX et recréer les indexs à partir de zéro.
Versions 32 bits
Pour les versions VdB7 et supérieures, le paramétrage de SET DELETED est
pris en compte, mais pas celui de SET FILTER et SET KEY.
Mais l'ooDML ne prenant pas en charge Keymatch(), pour éviter des
doublons dans les index, on peut utiliser l'option DISTINCT qui elle vérifiera qu'en
effet deux enregistrement n'ont pas la même clé d'index.
Suppléer à Keymatch sans déplacer le
pointeur :
Maxine a écrit:
> Existe-t-il un équivalent SQL à Keymatch où le pointeur n'est pas déplacé
> à la ligne elle-même, mais juste pour voir si une valeur existe ? Je ne veux pas
> Utiliser applyLocate pour la vitesse. Thx
-------
voir dUFLP: misccode.prg, keyExists méthode ().
Une solution simple consiste à ajouter une requête supplémentaire à votre formulaire
ou datamodule et y mettre l'index approprié.
Ensuite, il suffit d'utiliser findkey pour tester si la valeur est là
IF form.VotreRequeteSupplementaireJustePourVoirSiLaCleExiste.rowset.findKey (XKEY)
/ / Clé trouvé
ELSE
/ / Clé introuvable
ENDIF
Source :
http://news.dbase.com/newsgroups.php?art_group=dbase.programming&article_id=6932
retour
Sources :
Aide Visual dbase V5.7
http://www.dbase.com/Knowledgebase/INT/xb2vdb7oodml/x2oodml.htm
Aide dBase Plus 2.6.0
Pour les commentaires sur les difficultés
rencontrées |
Note Version 16 bits |
Note Version 32 bits |
Groupes de discussion : dbase.programming
De : Romain Strieff [dBVIPS] <dBV...@usa.net>
Date : 2000/03/27
Objet : Re: KEYMATCH |
Groupes de discussion : dbase.programming
De : "Gary White [dBVIPS]" <dBV...@usa.net>
Date : Thu, 21 Jun 2001 17:59:45 -0500
Date/heure locale : Ven 22 juin 2001 00:59
Objet : Re: Keymatch not working in valid function |
Retour à l'accueil
Si vous voyez des erreurs, ou souhaitez apporter des compléments, n'hésitez pas à le signaler.
Dernière modification : vendredi 06 août 2010
© M.Abraham.
|