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