The important point of what JRB-Bldr says is, you keep the same cursor attached to the grid. Requerying only works with a view cursor, if you instead query into cursor and then at some point repeat this query INTO CURSOR even with the same alias name, there is a step in the process, where the old cursor is closed and the new is named as the old one, at which the grid loses its binding and blanks out. A view must be handled as JRB-Bldr suggests to do with a self-made cursor, VFP never closes it, but zaps and refills.
And that's where I'd differ from JRB-Bldr, I'd not delete the rows, but ZAP the cursor for a refresh of data from the DBF. Or neither DELETE and ZAP, if you only want to update some calculated columns, you can also do that with REPLACE or UPDATE and keep all other data as initially fetched.
That said you don't say you have a grid problem. The aspect of calculations and updating fields does not depend on using a view or not, a view just may allow a simple TABLEUPDATE() to store changed data, while a cursor done with a query INTO CURSOR has no connection back to the DBF. The view including calculated fields producing the result you want to show has the plus you only need to REQUERY() to get it refreshed. But only, if you disallow editing or don't buffer, not even row buffering. When there are changes in a view buffer, you have to TABLEUPDATE or TABLEREVERT to save or cancel the buffered changes before you are allowed to REQUERY. That rule protects the changes and forces you to explicitly think about the buffer before refreshing from DBF files.
That's also a minus of views, as you can only get fresher DBF data (changes from other users, for example) after saving own changes and not keep the own session changes buffered until the user really wants to save or cancel. To be able to do that, you have to do complicated selects and updates, after which you'd also need to change the buffer state of data you manually refreshed, because the buffer thinks of your updates as updates, while they are just the current values of the DBF. The only reason to "forgive" the VFP team for having implemented this rule is, the general refresh can possibly have the same types of conflict you can have in TABLEUPDATEs, concurrent changes of same fields from other users. This time, that conflict would occur in your buffer and display rather than in the DBF. And in case it would occur, it also will occur when you TABLEUPDATE() later.
You don't say, whether you want to allow editing of the data or not. If not, nothing speaks for a view, a view is just helping to keep the query in a central place to reuse anywhere, but it also causes trouble in database changes, when the view definition doesn't match its underlying tables anymore. And that only reveals itself when using views after a DBC upgrade. The same applies to queries in code, but code then is easier changed, views not matching their underlying tables don't only refuse to be used, they also refuse to be edited in the view designer. Keeping code just in one place for not needing to change multiple locations in code also is no magic with OOP and business classes/objects.
Even from that perspective of using views vs coded queries or biz classes, it's still not just a matter of taste, as you can't simply TABLEUPDATE() a readwrite cursor. So in the end, you have to decide pros and cons of views vs coded queries. You can program the necessary updates of DBFs, but then you actually reimplement what the VFP TABLEUPDATE() function already can do for you. You can program the necessary updates of the cursor, but then you reimplement what the REQUERY() function already could do for you. That's the curse with cursors.
Bye, Olaf.