SELECT cMyRandomCursor LOCAL cFieldState, nOccurs, nPosn, cBadRecs, cFields #DEFINE NOEDITNODELETE "1" #DEFINE EDITORDELETED "2" #DEFINE ADDNOCHANGEMADE "3" #DEFINE ADDANDEDITED "4" cBadRecs = '' * SCAN cFieldState = SUBST(GETFLDSTATE(-1),2) && state for all fields * SUBST() drops the status of the deletion flag DO CASE CASE ADDNOCHANGEMADE $ cFieldState * appended record with at least one unchanged field cBadRecs = cBadRecs + ',' + TRANSFORM(RECNO()) CASE EDITORDELETED $ cFieldState cFieldsEmpty = '' nOccurs = 1 nPosn = AT(NOEDITNODELETE,cFieldState,nOccurs) DO WHILE nPosn > 0 IF EMPTY(EVAL(FIELD(nPosn))) cFieldsEmpty = cFieldsEmpty + ' ' + FIELD(nPosn) ENDIF nOccurs = nOccurs + 1 nPosn = AT(NOEDITNODELETE,cFieldState,nOccurs) ENDDO IF LEN(cFieldsEmpty) > 0 * One or more empty fields cBadRecs = cBadRecs + ',' + TRANSFORM(RECNO()) + ; '{' + SUBST(cFieldsEmpty,2) + '}' ENDIF ENDCASE ENDSCAN IF LEN(cBadRecs) = 0 * Cursor is OK, no empty fields ELSE cBadRecs = SUBST(cBadRecs,2) && strip leading ',' * cBadRecs is a space delimited list of records with empty values * Negative record numbers are records appended since last TABLEUPDATE(), * any positive record number lists the empty fields of that record in {} ENDIF ? cBadRecs>HTH