I can try for your following typed
"Is there a way to see which records in a table are currently locked, and by which user or process?"
1) You will have to write a code with GO RECORD and ?rlock() if it returns .f. the record is locked by another user. 2nd opton you can find ahead.
2) Manytimes I have scratched my head to find out about locking (Who has placed the lock) One solution is there.
A) When you open your application make a code for <User ID> and you restrict to enter User ID, When !empty(User_ID) continue.
B) Whatever you data structure may be, you will have to add one more field U_ID.
Now, whenever you placed Rlock() you can replace U_id with User_ID (the Name of User)
This replaced field can browse by another user and find out who has placed the Lock.
But before UNLOCK you have to blank U_id field and immediately UNLOCK.
Important thing is you will have to write a additional code to find !empty(U_id) AND rlock(). If you find rlock() is true and !empty(U_id) then you will have to blank forcefully. WHY THIS, you placed rlock() and if .T. you replace U_id with User_ID and POWER SHUT OFF the record will unlock automatically but U_id would not BLANK.
3) Now third option is "Which function/procedure placed the lock ?"
hammm
But why you want this ?