>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 >