Q189418: INFO: Difference Between INDEXSEEK and KEYMATCH Functions
Article: Q189418
Product(s): Microsoft FoxPro
Version(s): WINDOWS:6.0
Operating System(s):
Keyword(s):
Last Modified: 11-DEC-1999
-------------------------------------------------------------------------------
The information in this article applies to:
- Microsoft Visual FoxPro for Windows, version 6.0
-------------------------------------------------------------------------------
SUMMARY
=======
The purpose of the INDEXSEEK and KEYMATCH functions are exactly alike. They both
search an index key for a specific expression, indicate if there is a matching
key and remain on the current record. However, the difference between the two
functions is that the INDEXSEEK function never moves the record pointer while
KEYMATCH does move the record pointer, causing triggers to fire.
MORE INFORMATION
================
The INDEXSEEK function searches an index key for a certain expression just like
the KEYMATCH function, but the INDEXSEEK function does not fire any triggers
when it searches because INDEXSEEK never leaves the current record. The KEYMATCH
function leaves the current record and then goes back to it after completing the
search, thus firing existing triggers. This makes the INDEXSEEK function a
better function to use with tables that have triggers associated with them.
Typically, you would use INDEXSEEK to search for an existing key before you have
committed the record. The following code example demonstrates how the INDEXSEEK
function works differently from the KEYMATCH function.
Sample Code
-----------
* Start code here.
PUBLIC oForm
DisplayStatus([Creating database...])
CLOSE DATA ALL
CREATE DATABASE 'SAMPLE1.DBC'
DisplayStatus([Creating table TABLE1...])
MakeTable_TABLE1()
DisplayStatus([Finished.])
SET MULTILOCKS ON
open data sample1.dbc
oForm= CREATEOBJECT('seekmatch')
oForm.VISIBLE = .T.
FUNCTION MakeTable_TABLE1
***** Table setup for TABLE1 *****
CREATE TABLE 'TABLE1.DBF' NAME 'TABLE1' (CHAR1 C(10) NOT NULL)
***** Create each index for TABLE1 *****
SET COLLATE TO 'MACHINE'
ALTER TABLE 'TABLE1' ADD PRIMARY KEY CHAR1 TAG CHAR1
***** Change properties for TABLE1 *****
CREATE TRIGGER ON 'TABLE1' FOR INSERT AS inserted()
ENDFUNC
FUNCTION inserted
WAIT WINDOW 'Insert Trigger Fired'
RETURN .T.
ENDFUNC
FUNCTION DisplayStatus(lcMessage)
WAIT WINDOW NOWAIT lcMessage
ENDFUNC
**************************************************
*-- Class: seekmatch
*-- ParentClass: form
*-- BaseClass: form
*
DEFINE CLASS seekmatch AS FORM
TOP = 0
LEFT = 0
HEIGHT = 181
WIDTH = 337
DOCREATE = .T.
BUFFERMODE = 0
CAPTION = "Form1"
NAME = "Form1"
ADD OBJECT command1 AS COMMANDBUTTON WITH ;
TOP = 24, ;
LEFT = 24, ;
HEIGHT = 49, ;
WIDTH = 133, ;
CAPTION = "Do IndexSeek()", ;
NAME = "Command1"
ADD OBJECT command2 AS COMMANDBUTTON WITH ;
TOP = 24, ;
LEFT = 168, ;
HEIGHT = 49, ;
WIDTH = 145, ;
CAPTION = "Do KeyMatch()", ;
NAME = "Command2"
ADD OBJECT command3 AS COMMANDBUTTON WITH ;
TOP = 96, ;
LEFT = 96, ;
HEIGHT = 48, ;
WIDTH = 145, ;
CAPTION = "Close", ;
NAME = "Command3"
PROCEDURE INIT
SET SAFETY OFF
ZAP
SET SAFETY ON
SET ORDER TO CHAR1
FOR i = 1 TO 5
APPEND BLANK
REPLACE CHAR1 WITH "Test"+ALLTRIM(STR(i))
ENDFOR
=CURSORSETPROP('buffering',2)
ENDPROC
PROCEDURE command1.CLICK
APPEND BLANK
x = INDEXSEEK('Test3')
IF x
WAIT WINDOW "Record found and no trigger fired"
ELSE
WAIT WINDOW "Record not found"
ENDIF
=TABLEREVERT(.T.)
ENDPROC
PROCEDURE command2.CLICK
APPEND BLANK
x = KEYMATCH('Test3')
IF x
WAIT WINDOW 'Record found and trigger fired'
ELSE
WAIT WINDOW 'Record not found'
ENDIF
=TABLEREVERT(.T.)
ENDPROC
PROCEDURE command3.CLICK
THISFORM.RELEASE
ENDPROC
ENDDEFINE
*
*-- EndDefine: seekmatch
Steps to Create Sample
----------------------
1. Copy the code into a new program and run the program. You will see a WAIT
WINDOW displayed five times. Press any key to proceed after each window
displays. A form appears.
2. Click the "Do INDEXSEEK" command button. This appends a record and calls the
INDEXSEEK function to search for a string in the table. Note that the
function finds the record, but the Insert trigger is never fired.
3. Click the "Do KEYMATCH" command button. This appends a record and calls the
KEYMATCH function, which searches for a string in the table. Note this time
the Insert trigger fires, displaying a WAIT WINDOW message.
There are other differences between these functions, such as, the INDEXSEEK
function accepts a parameter that takes you to the matching record, which
acts just like a Seek. However, the KEYMATCH function does not have this
functionality.
REFERENCES
==========
(c) Microsoft Corporation 1998, All Rights Reserved.
Contributions by David Botzenhart, Microsoft Corporation
Additional query words: kbVFp600 kbXbase
======================================================================
Keywords :
Technology : kbVFPsearch kbAudDeveloper kbVFP600
Version : WINDOWS:6.0
Issue type : kbinfo
=============================================================================
THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.
Copyright Microsoft Corporation 1986-2002.