My feedback to changing from D tables to a series of conditional USE is: It's clmsy and won't cover all cases well.
Say form A uses a table t1 and moves to record N. Form B also needs this table t1, it is salready open, so it flags this was alreadyy open, so it doesn't close it when releasing, as it's needed by form A.
So far, so good, several problems are solved to have the necessary tables and keep them open as needed. But imagine form B wants to move in table t1 to another record M<>N.
Well, you can remember N and move back there. Where do you want to end with flags and remembered recnos?
And even if you do all that, the reality is form A works on exactly that table t1 and the pointer moved already cchanged things in form A. The User focussing form A while form B still runs will see this in effect, if t1 is shown in controls.
So the separation of datasessions has its benefit, even if you want to work on the same tables. You can still, it's the same DBFs, and what you change in the DF file comes across, without forwarding or returning a value, even.
The deecision whether two forms should work in the same datasession should be made if form B is such a form, that it extends the use case of form A and is just a separate form because you want to avaoid a pageframe and tabs to do the same within one form.
Here it's not that case, it seems, as form B can be called from many other forms, so it seems to be a general use case form.
I don't recommend changing form b to general datasession just for the case of form A, if there are further forms X,Y,Z that don't follow the saame pattern. You can return a whole table, too, if you use CURSORTOXML and then turn that XML back to a cursor/table. Or you simply store the cursor into a dbf and return the file name of that dbf, so form A can use it. Besides the "trick" Mike alreaddy recommended to know the datasessionid, you can switch to it and create a cursor there with all the data. And that's still not all ways to return more than one single value to form A, you can create an object and return that, with many properties to use, even a hierarchy of objects, you can use a collection or an array to trasnport lots of values.
Working in the same datasesssion on the same table or even on several shared tables can make sense, especially if you work on the same records of them, but it's a path that leads to applications only using the datasession id 1 and trying to manage all in one datasssion. This bcomes ugly fast.
Chriss