Steve,
Not quite sure what's going on. I'd try the replace within a loop and try stepping through with the debugger. Put empty(crd.rate) in the watch window and try to see what's happening
you might try adding a Logical Processed field.
SCAN FOR !processed and !EOF('crd')
REPLACE crd.processed with .t., .... [without any FOR]
ENDSCAN
>Yes, I set empty off in all the programs, and explicitly did so from the command window when I checked ?Empty(cdr.rate)