Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Best way to check for Unique Entries
Message
From
11/07/2001 13:34:44
Hilmar Zonneveld
Independent Consultant
Cochabamba, Bolivia
 
General information
Forum:
Visual FoxPro
Category:
Databases,Tables, Views, Indexing and SQL syntax
Miscellaneous
Thread ID:
00529230
Message ID:
00529268
Views:
13
>Hi - not sure if this should be in the Forms category or here!
>
>What is the best way to check user input to make sure it is unique before allowing the user to continue entering into other fields?

My personal preference is to allow users to input any garbage, and to validate only when they try to save. I think this is easier to program. Besides, if you try to intercept LostFocus(), the user must provide a valid value before clicking on the "undo" button! (If it is on the same form.)

No matter at what moment you decide to validate, I hope this function helps. Regards, Hilmar.
**********************************************************************
FUNCTION DuplicateKey(tcTag, tcTable, txPkExpression)
	* Check for duplicate, according to a certain index tag.

	* Parameters:
	* tcTag: name of index tag.
	* tcTable (optional): name of table. Required if working with views.
	* txPkExpression (optional): primary key expression. Required when working with views.
	*   This allows to omit current record from checking of duplicate.
	*   Can't be used to check uniqueness of primary key (but I use non-business-value keys,
	*   automatically generated, anyway).

	* Returns: true if another record exists with the same value(s)
	* (according to the specified index tag).

	* Additional comments:

	* By intercepting for this duplicate value before Visual FoxPro does (through Primary or
	* Candidate Indices), the user can messages that are clearer than "Trigger failed"
	* (at least with Visual Extend, "Trigger failed" doesn't give more details).

	* The function can also be used to check duplicates in FoxPro 2.x;
	* just change "local" to "private".

	* Of course, depending on the index, this function may check whether the combination of
	* two or more fields is unique - however, only the index tag is passed as a parameter.

	local lnSelect, lcDbf, lnRecno, txEvalExpr, llDuplicate, lcExpression, lcOrder, llWorkOnView
	llWorkOnView = not empty(tcTable)
	lnSelect = select()
	lcDbf = iif(empty(tcTable), dbf(), tcTable)
	lnRecno = recno()
	lcOrder = order()
	if not llWorkOnView
		set order to (tcTag)
		lcExpression = key()
	else
		select 0
		use (lcDbf) order (tcTag) again
		lcExpression = key()
		use
		select (lnSelect)
	endif
	txEvalExpr = eval(lcExpression)
	select 0
	use (lcDbf) order (tcTag) again
	seek txEvalExpr
	if found() and (llWorkOnView and eval(tag(GetPkNum())) = txPkExpression;
			or not llWorkOnView and recno() = lnRecno)
		skip
	endif
	llDuplicate = (eval(lcExpression) = txEvalExpr)
	use
	select (lnSelect)
	set order to (lcOrder)
	return llDuplicate
ENDFUNC && DuplicateKey
Difference in opinions hath cost many millions of lives: for instance, whether flesh be bread, or bread be flesh; whether whistling be a vice or a virtue; whether it be better to kiss a post, or throw it into the fire... (from Gulliver's Travels)
Previous
Reply
Map
View

Click here to load this message in the networking platform