>I'm a little dense today (today? :) )
>What exactly did you mean?
Table rule expression is at DBC level and checked during tableupdate() if buffered else immediately when you leave a row. It's the original suggestion of MS for row level validations. If it's not satisfied you simply cannot leave a row. Real problem arises with buffering modes. You don't know that you have invalid data (rowwise) till you do a tableupdate() (or check with getfldstate(), getnextemodified() etc). If you want to have it at rowlevel as if nonbuffered then BRCC comes into help. Typical scenario is like :
if llCahngingRow
*...
if !evaluate(tableruleexpression)
messagebox("Ooops Incomplete data blah blah")
* Action
nodefault && Stay
* or tablerevert(.f.)
...
One thing to mention here though if a user breaks the rowlevel rule in a field and just presses dnarrow-uparrow etc evaluate(tableruleexpression) misses it. There I workaround issuing :
this.Value = this.Value
in BRCC.
Cetin