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