Il problema che segnali dovrebbe presentarsi solo se, all'interno della stessa richiesta, esegui tutte le operazioni: elimino i dati, riempio la tabella, faccio refresh query del pannello, chiedo al pannello il numero di righe o uso un for-each-row su pannello per leggere i valori.
Provo a spiegare cosa succede... magari può servire a qualcun altro...
Supponi diavere nel tuo progetto una tabella IMDB chiamata DATI. La tabella IMDB ha 2 campi: ID (numero) e NOME (stringa).
Poi supponi di usare la tabella IMDB nella query di un pannello:
- Code: Select all
select
toString(ID)
upper(Nome)
from
DATI
where
ID > 5
Il sistema crea un'ulteriore tabella IMDB "fittizzia" che usa come sorgente dati del pannello. Lo fa perché il tipo di dati ed i dati contenuti nella tabella sono differenti. Per esempio la prima colonna della tabella DATI è un'intero (ID) ma la prima colonna della query del pannello è una stringa. Inoltre anche il numero di righe sarà differente a causa della where clause. Quindi il sistema, oltre alla tabella IMDB chiamata DATI (quella verde del tuo progetto), ne crea un'altra che chiama DATI_RS.
Ora, però, c'è un problema... tu, da codice, inserisci i dati nella tabella IMDB chiamata DATI... quando e come il pannello deve aggiornare i suoi dati? Beh, il sistema lo fa da solo. Alla fine di ogni richiesta controlla se la tabella DATI è cambiata. Se lo è svuota la tabella "fittizia" DATI_RS e riesegue la query ripopolandola a partire dalla tabella DATI. Il sistema fa questo all'interno della procedura UpdateControls della videata in cui è contenuto il pannello.
Ecco che, però, qui c'è un potenziale problema. Se io scrivo:
- Code: Select all
delete DATI
insert into DATI
set ID = 5
set NOME = "Baldini"
e subito dopo scrivo:
- Code: Select all
Pannello.RefreshQuery()
if (Pannello.RecordCount() > 5)
{
...
}
il sistema non funziona correttamente dato che fino a quando il sistema non ha eseguito l'UpdateControls (alla fine della richiesta) la tabella usata dal pannello (DATI_RS "fittizzia") contiene i vecchi dati. In questo caso devi scrivere:
- Code: Select all
Videata.UpdateControls()
Pannello.RefreshQuery()
if (Pannello.RecordCount() > 5)
{
...
}
Questo è l'unico caso che mi viene in mente in cui potresti avere problemi: rileggere i dati da pannello subito dopo aver inserito o modificato i dati nella tabella IMDB, all'interno della stessa richiesta.
Qualcosa si può certamente fare, però adesso il sistema funziona così. Magari potremmo eseguire noi dall'interno l'UpdateControls quando viene richiesto al pannello di caricare i dati dalla sua tabella. Prima potrebbe controllare se deve rieseguire la query di "copia dei dati da DATI a DATI_RS".
Ci penso... qualcosa mi verrà in mente.
Tieni conto che lo stesso problema era presente anche nei book ma è stato risolto molto tempo fa, se non ricordo male in versione 7.5 o giù di lì.