Ciao Maurizio,
riporto qui il thread "Problema parametro bug_aggregate", come da tua
richiesta, ed ho chiuso l'altro.
Ovviamente ci sono due comportamenti diversi per il parametro
"bug_aggragate" ad ON/OFF e, effettivamente, entrambi mostrano delle
criticità, nella tua segnalazione.
Il comportamento con "bug_aggragate" ad ON, con aggregazioni a zero,
come ti ho spiegato nella precedente mail, è quello storicamente atteso,
canonico, ma è appunto quello che dobbiamo superare, perché errato.
Con il parametro ad OFF spiego il comportamento, per chi ci legge in
copia:
Hai una vista con view-selector ed un filtro per le sole righe
selezionate.
Azionando il filtro le aggregazioni risultano corrette, ma c'è
un'"apparente" sostituzione del record corrente nella vista filtrata,
con un record del vecchio dataset (non filtrato).
Questo dipende dal modo in cui riporto le proprietà della vista dopo il
loop di calcolo, ma qui la cosa si complica assai.
Premetto, per chi non volesse leggersi tutta la spiegazione successiva,
che credo di aver già corretto il problema.
La patch è presente in ufficio (module "jxenv.inc") e sarà inclusa nei
prossimi rilasci, se confermata.
NOTA:
Questa cosa non inficia la stabilità della runtime attualmente in
rilascio.
Possiamo consolidare questa runtime per il parametro "bug_aggregate" ad
ON, come lo avete sempre tenuto tutti, per cui non è cambiato (e non
cambierà) niente.
Tuttavia se riuscissi ad includere nella versione, prima del
consolidamento effettivo, anche un comportamento coerente per il
parametro ad OFF sarei molto più contento.
Ora vediamo il problema nel dettaglio, per chi ha voglia di seguirci.
Questa cosa del loop per le aggregazioni risale ad almeno 10 anni fa (è
precedente al mio tracing accurato su Git).
Nel tempo ho avuto più volte l'esigenza di fare un loop su una vista per
calcolare qualcosa, cercando di lasciare la vista il più intatta
possibile, rispetto al suo stato effettivo.
Se faccio un loop su una vista cambio un sacco di cose della vista:
prima di tutto il dataset (se sono intervenuti dei filtri) e
sicuramente il record corrente (se diverso dal primo).
Ad esempio, se la vista è in insert, con un buffer valorizzato, dopo
il loop mi perdo il buffer...
E poi posso cambiarne le dipendenze, a seconda dei filtri che
intervengono, ecc...
A questa esigenza, nel tempo, ho dato risposte diverse, adottando
tecniche diverse.
In particolare la logica utilizzata per le aggregazioni è condivisa con
la logica della count, o2view_total(), comportamento per il quale non
avete un parametro "bug_*", ma viene utilizzato sempre da tutti, da
diversi anni, quindi estremamente consolidato.
Sulla o2view_total(), però, è stato fatto un lavoro di affinamento
enorme (ai tempi di Valerio) ed infatti non dà problemi apparenti (vedi
sotto cosa intendo per apparenti).
La logica utilizzata per il loop delle aggregate e dalla view-total è
molto complicata, si salva un array di cloni delle proprietà, e poi li
ripristina sulla vista originale...
Insomma, alla fine andavo a mettere nella vista, dopo il loop, un record
corrente (solo apparente) che ormai non apparteneva più al dataset.
Da qui l'errore segnalato.
Sulla logica della o2view_total() veniva presa un'accortezza in più, per
cui, in casi come questo, alla fine, veniva ricostruita la vista.
Ho riportato questa accortezza anche nella logica di aggregazione e mi
sembra che risolva, nella patch attuale.
Tuttavia non son soddisfatto:
Credo che sia la logica della o2view_total() che quella delle
aggregazioni possano causare alcuni effetti collaterali indesiderati e
inaspettati: quanto meno la perdita del record corrente, in alcune
condizioni.
Voi, plausibilmente, non vi siete mai accorti dei problemi,
fondamentalmente per due motivi:
1. non sono operazioni (soprattutto la view-toal) che di solito vengono
fatte con l'interazione su un singolo record: se aggiungete un
filtro nella sezione dei filtri, esterna alla grid, nella maggior
parte dei casi vi sembrerà normale che il puntatore torni sul primo
record;
2. uno dei problemi è che questa cosa causa l'esecuzione di almeno una
query in più del necessario e questa non è una cosa che voi potete
notare o monitorate, tantomeno se legata ad operazioni globali sul
dataset.
Come sicuramente ricorderai per i recenti sviluppi sul view-selector
eravamo incorsi in problemi simili.
In quello sviluppo, con almeno 10 anni di esperienza in più, credo di
aver dato una soluzione migliore all'esigenza di looppare su una vista,
cercando di lasciarla nel proprio stato attuale, che potrebbe essere
usata in tutti i casi.
Tuttavia non mi sembra il caso di mettere mano a questa cosa ora, quindi
credo che, per il consolidamento attuale, convenga attenerci alla
conferma della patch.
Quindi, ricapitolando:
Il problema dovrebbe essere risolto, riportando una logica ampiamente
condivisa e consolidata, come quella della view-total.
Per il futuro vorrei (davvero) standardizzare un modo di creare una
copia di una vista, per farci quello che mi serve, ma lasciandola nel
proprio stato attuale, e vorrei adottare questa tecnica standard in
tutti i casi, view-total, aggragate, view-selector-count, ma anche in
altri, che sono certo di avere, sparsi in runtime.
Questo scopo, però, direi di non ricercarlo nell'ambito dell'attuale
consolidamento, ma di destinarlo a sviluppi futuri: mi aprirò un TODO a
riguardo, perché credo che sarebbe importante, sia ai fini della
stabilità, che della manutenibilità della runtime.
Attendo conferma correzione.