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.

 ico_MsDos.jpg (1668 octets)  dbasedos.gif (376 octets) vdb5.gif (351 octets) Description


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.

Plus2_5-Icon.jpg (1250 octets) 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.

Plus2_5-Icon.jpg (1250 octets) xDML vers ooDML

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.

 

Code      ico_dbIII.jpg (1345 octets)   dbasedos.gif (376 octets)   vdb5.gif (351 octets)   Plus2_5-Icon.jpg (1250 octets)

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.

bug_jpg.jpg (2635 octets)  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.