There is no workaround.
If a client A should see changes of another client B, then both things have to be done:
1. client B has to tableupdate the DBF so changes are in general available for everyone else, too
2. client A (and any other) needs to pull this from the DBF.
REPLACE in interactive CHANGE pushes the selected value from combobox control into the buffer, it's not yet saving to DBF. But even assumed you do a REPLACE and TABLEUPDATE of the current row to have the nearest as possible DBF change, other clients still will need to actively read this.
So you don't jsut need to act on the interactivechange, you should also reacct in When or at least Gofocus with refreshing the control a user activates before he starts editing. A change of a control you activate happens automatically on certain conditions:
1. The value displayed was read from the DBF at time of starting the form or last scrolling it
2. The record you change to has no buffered changes yet
3. changes of other sessions have been stored to the dbf
And with views this has a 4th condition that you REQUERY() the view or at least REFRESH() the current record (or a bunch of rows). And that, just like the automatic refresh of directly bound DBF without the view layer only happens, if the to be refreshed rows have no changes yet from the local user, neither in the field you focus, not in any other field of the record. VFP only refreshes whole records.
There is nothing buggy about this that will need a workaround, that's the design and if you want to improve it you can consolidate between CURVAL() - value in the DBF - OLDVAL() - value that was first read at form start or last grid scroll/refresh and then alias.field, the value that may still be OLDVAL() or could be modified locally and thus subject to an update conflict as you already have a partial unsaved change from OLDVAL() and a CURVAL() that's also a change from OLDVAL() and I didn't even mention that control.value can be a fourth value of the same field of the same record, conceptually, as the control.value isn't buffered until valid returns true and the controlsource (buffer) is updated.
So, do you understand that CURVAL("alias.field"), OLDVAL("alias.field2), and alias.field and conrtol.value bound to alias.field can be four different values? And that a record is buffered whan alias.fieldX differs from OLDVAL("alias.fieldX") for any field of the record (no matter if row or table buffering), not just for the one field you'Re interested in? Which in detail means that no refresh will be made even if alias.field == OLDVAL("alias.field") (no edit/conflict) and there is a new CURVAL("alias.field"). You have to make it the locally most current and thus buffered value yourself, that's only automatic if the record didn't yet participate in buffering. And for that reason row buffering is easier in getting to that state at least once you change to another record and back. Ideally for this to cause any refresh would be no buffering, as it removes the prerequisite of not buffered row for refreshing . Well, the problem with that is that CURVAL and OLDVAL are only available in a buffered mode. Without buffering you can't read CURVAL("alias.field") and if you think that's no problem, because then alias.field itself will read from the DBF, you underestimate the networking effects, alias.field always is just a workarea value, buffering on or off. CURVAL() enforces read from DBF, but requires buffering to be turned on.
You can check whether you really understand the buffering concept if you understand that while using no buffering you get nearer to the imagination the grid shows you the actual DBF data as it is currently, but that's never the case. The only solution to get nearer to that goal is making the problem worse with buffering first, which introduces the four level concept of values of a field but is the only mode that also gives you the strong strictly reading from DBF file with CURVAL(). And then, this strong power ends at the DBF file, it won't go on further and look into any other users more current buffered value, because that's only what you imagine is the even more current value someone else already knows he will save. Buffers are only local, CURVAL() can only read from DBF not look into all other users buffers and ask for the most latest change made. There is really nothing like that. So to get nearest to a grid monitoring a DBF you need to use buffering, actively save values earlier than the controlsource mechanism does and also do more than automatic refresh of controls does when you set focus to them.
Chriss