Yes, a filter on status="unpaid" could be fine, or a view or the query part of dan's answer: Select * from billing Where status = "unpaid" into cursor curGrid, setting grid.recordsource to "curGrid". You can also INDEX ON customer Tag xunpaid FOR status="unpaid", then SET ORDER TO xunpaid will also show unpaid records in order of customer names. Many solutions to the same goal. The essence is a table is for persisting data, no more, no less.
The term "view" does reflect the need of different point of views on the same data and in this sense is the number one choice for being able to get the data needed for a certain aspect. If views weren't technically limited in some senses, I'd perhaps use them more. As long as you don't need updates on the data you want to show on forms, a query is the most dynamic thing you can do to get data in the form best for the current purpose of your GUI or workflow. The query result of a cursor can best be shown in all the different foxpro controls, so it's my number one choice instead of views.
The database should not be concerned about what would make such queries most easy, but the database is all about data persistence and integrity only.
If you go about designing your tables for the several purposes and copy data all over the place, what get's more complicated is keeping all data consistent and in sync. And if this get's more an more complicated this get's like herding cats, or frogs. Whatever uncomforts you more

.
Of course in the end you also need data entry forms and editing of existing data, eg setting an unpaid bill to paid in the best case. While this can't be done through nonupdatable query result cursors, you can always have secondary usage of the table(s) to make the changes in them. As the display cursor would have the ids of the table included, you can always locate the corresponding record(s) and make that change. While this seems overhead the solution is quite simple to achieve and reuse in any situation/form.
Bye, Olaf.