Le soluzioni sono tante, ciascuna con vari pro e contro.

Indicativamente, potresti usare per la tabella che viene aggiornata un solo componente TDataSet condiviso, magari inserito in un TDataModule; in questo modo, posto che gli aggiornamenti vengano inviati a quel componente, essi risulteranno sempre aggiornati, senza che sia necessario aprire e chiudere la tabella.

Se la tabella deve essere condivisa tra più TFrame, questo potrebbe portare a effetti collaterali: se la visualizzazione di un campo fa scorrere i record della tabella per fare un lookup, questo potrebbe creare a visualizzazioni errate di altri campi che utilizzano la medesima tabella.

In questo caso, meglio usare più TDataSet che puntino alla stessa tabella, come mi pare tu abbia fatto in questo frangente, con il problema però delle performance legate alla necessaria riapertura delle stesse tabelle ogni volta che si richiede un TFrame che ha bisogno di quei dati per le proprie specifiche esigenze.

Io suggerirei di procedere in questo modo: caricare i dati all'interno di un componente TClientDataSet, che ha la possibilità di scaricarli automaticamente da qualsiasi TDataSet che rappresenta una tabella o una query su database; una volta che i dati sono stati scaricati, questi vengono immagazzinati in memoria, ed è possibile andarli a clonare velocemente in altrettanti TClientDataSet presenti nei vari TFrame, che ogni volta prelevano i dati da quello originale, il quale viene aggiornato solo quando si effettuano aggiornamenti alla tabella o query che costituisce la sorgente dei dati.

Approfondisci l'uso di questi componenti nella documentazione Delphi per capirne le potenzialità.

Ciao!