It is currently 10 December 2022, 4:42 Advanced search

FOUNDATION 22: dosort dove sbaglio?

Domande e risposte su come utilizzare Instant Developer Foundation al meglio

FOUNDATION 22: dosort dove sbaglio?

Postby Felix263 » 15 September 2022, 10:17

Faccio seguito a questa mia richiesta https://forum.instantdeveloper.com/viewtopic.php?f=5&t=91626 perchè non capisco dove sbaglio nell'uso del metodo dosort su una collection.

Ho circoscritto il progetto che allego per vedere se qualcuno può darmi una mano.
ERRORE DOSORT.zip
(563.89 KiB) Downloaded 19 times

Una breve spiegazione di quello che viene eseguito.
Il documento ORDSELEZ è slegato da qualsiasi db.
Nella load della videata REPORT carico una collection prendendo i dati da una lista valori poi ordino la collection con il dosort secondo la proprietà ZORDER, la collego al report che poi viene stampato a video nell'ordine corretto.

Il problema mi sorge quando con il drag&drop sposto l'ultima voce in cima alla lista.
Viene chiamata la procedura change order che fa il suo dovere, cioè riempie correttamente la proprietà ZORDER con il nuovo valore di ordinamento ma il successivo dosort non mi ordina più la collection basandosi sui nuovi valori.

A video sembra tutto in ordine ma non avendo applicato correttamente l'ordinamento, il ricalcolo della ZORDER non viene preso in considerazione, così al successivo drag & drop il meccanismo non funziona più.

Spero che qualcuno riesca a darmi una spiegazione.

Ciao e grazie
Felix263
 
Posts: 112
Joined: 18 June 2014, 6:59

Re: FOUNDATION 22: dosort dove sbaglio?

Postby theguru » 4 October 2022, 14:38

DISCLAIMER: può essere che quanto ti sto dicendo ti porti fuori strada, tuttavia se dovessi tirare ad indovinare darei la spiegazione che segue:

Fatto appurato: quando una collection viene iniettata in un book, questa diventa in parte malfunzionante.
Nello specifico, sembra che diverse proprietà dei documenti che compongono la collection vengano "freezate", e seppur lette correttamente in caso di scansione collection, non cambiano quando sono lette dal report del book.

Questo problema mi ha portato a modificare molti pattern di sviluppo in modo da minimizzare il fenomeno, ad esempio iniettando nei book delle collection usa e getta fatte apposta per loro, sacrificando un po' di performance e semplicità del codice, ma "workaroundando" il problema.
A titolo di esempio, ultimamente sono incappato di nuovo in questo problema dovendo filtrare ( .hidden=true) gli elementi di un book basato su collection.

Prova ad utilizzare il tuo stesso codice ma usando un pannello al posto di un book (quindi panel.setcollection(collection_ordinamenti), se il comportamento è quello corretto hai trovato il problema. ma non la soluzione..
User avatar
theguru
 
Posts: 955
Joined: 29 January 2014, 13:01

Re: FOUNDATION 22: dosort dove sbaglio?

Postby Felix263 » 5 October 2022, 10:04

Grazie per la condivisione della tua esperienza.

Non so se hai letto la discussione precedente ma sono riuscito a "workaroundare" il problema usando una imdb + una collection solo che mi piace capire il più possibile le cose che utilizzo e quindi ho aperto un'assistenza per guardare con Progamma il problema.
E' risultato, se ho capito bene, che in fase di drag&drop la collection rimane in uno stato tale da non far funzionare più la doSort sulla collection.
Progamma ha aperto una NPQ.

Dal momento che nessuno mi aveva risposto non ho pensato di segnalarlo sul forum; mi aspetto che verrà corretto.

Ciao
Felix263
 
Posts: 112
Joined: 18 June 2014, 6:59

Re: FOUNDATION 22: dosort dove sbaglio?

Postby theguru » 5 October 2022, 11:38

Felix263 wrote:E' risultato, se ho capito bene, che in fase di drag&drop la collection rimane in uno stato tale da non far funzionare più la doSort sulla collection.

Ragionevole, entrambe le situazioni immagino siano manifestazioni dello stesso problema.
Aggiorna il post in caso di soluzione o patch, grazie!
User avatar
theguru
 
Posts: 955
Joined: 29 January 2014, 13:01

Re: FOUNDATION 22: dosort dove sbaglio?

Postby lucabaldini » 10 October 2022, 14:16

Ciao.

Fatto appurato: quando una collection viene iniettata in un book, questa diventa in parte malfunzionante.

Nonè malfunzionante, è solo che il report ne prende possesso e non permette che la collection venga filtrata o ordinata. Il motivo è il seguente: quando una collection viene fornita ad un oggetto che la usa (albero, pannello, report) questo ne prende possesso e non permette che su questa vengano eseguite alcune operazioni.

Ora, il pannello, tiene la collection "bloccata" per un tempo limitato (per esempio quando sta ciclando sulle righe per notificare eventi del pannello), così l'albero. Il report, però, è più complicato perché, formalmente, il momento in cui il report non ha più bisogno della collection non è così definito come negli altri casi. Un report di 100 pagine, per esempio, non avrebbe più bisogno della collection solo se si trovasse alla 100° pagina... e nemmeno così perché solo provando a stampare la 101° il sistema saprebbe che la collection è in EOF e quindi diventerebbe inutile... ma non è corretto nemmeno così perché se il book è mostrato in anteprima web e tu torni indieto alla 99° pagina il sistema deve poter ripartire da uno stato ben definito per generare la 99° pagina (in particolare il sistema memorizza lo stato ogni 10 pagine... quindi deve ripartire dalla 90° pagina e stampare le 9 pagine rimanenti per generare la 99°). L'unico modo ceh ha il sistema di trovare la collection nello stato in cui l'ha lasciata alla pagina 90 è che nessuno possa ordinarla, filtrarla o farci altro mentre il repor la usa.

Spero si capisca: un report prende una collection, la prepara per la stampa, e la usa durante tutto il ciclo di stampa che, formalmente, non finisce mai perché nel report, mostrato a video, l'utente può navigare come vuole (almeno il sistema ragiona come se l'utente potesse farlo). E' diverso dal pannello e dagli alberi che, invece, possono bloccare la collection in alcuni momenti (e lo fanno) ma poi la "liberano" quando il sistema ha finito.

Nel caso del report non è così.

Ho già in mente di analizzare meglio la cosa (sfrutto questo thread attaccandoci un ticket così che io possa ragionarci un attimo) ma non sarà semplice fare qualcosa. Pensare di ordinare o nascondere documenti in una collection che il sistema usa per stampare le pagine ed è previsto che possa ripartire da un punto e procedere in differenziale non è facile. L'alternativa è liberare la collection, permettere qualunque cosa (ordinamento, nascondimento) e poi, però, appena si tenta di aggiornare o ristampare qualcosa, svuoto tutto e riparto sempre dall'inizio. Questa è una possibile idea... ma non mi piace. Ci devo ragionare meglio.

Quindi, riassumendo: una collection attaccata ad un report è "UI-bound", ovvero il sistema sa che è usata dalla UI e:
- se viene modificata (aggiungendo un documento per esempio, o cambiandone uno già presente) il sistema se ne accorge e ristampa tutto
- se viene ordinata l'ordinamento non ha effetto (è il report che l'ha ordinata ad inizio stampa e vuole tenerla così perché potrebbe dover continuare da una specifica pagina per continuare la stampa)
- se vengono nascosti documenti questi non vengono enumerati (quando la collection è "UI-bound" occorre valorizzare la proprietà ShowHidden per poterli saltare/vedere...)

Spero si sia capito come funziona. Poi, non è perfetto, ma se la collection non fosse "bloccata" e si potesse ordinare o fare altro il report farebbe fatica a poter procedere in differenziale con la stampa.

Nel caso specifico del progetto che hai allegato io farei qualcosa di completamente diverso, lasciando gestire il tutto al sistema. Tu vuoi spostare un documento prima di un altro... basta valorizzare la nuova proprietà con il valore giusto e far ordinare tutto al sistema, senza bisogno di ciclare tutta la collection...

Ti allego il tuo progetto "migliorato"... (tra l'altro, dato che hai i documenti, è bene usare quelli invece di doverli "cercare" per id nella ChangeOrder).

Ho anche commentato alcune righe che non servono (la setCollection fa già la print, se modifichi una proprietà di un documento il book viene già ristampato... cose che puoi vedere dal debug). Così facendo eviti di fare operazioni come la ristampa di un book che è un'operazione onerosa.

Ho anche aggiunto una OrderBy nella query del report... così è lui che tiene "ordinata" la collection per ZORDER, che è poi quello che vuoi fare.
Attachments
DOSORT Modificato.zip
(601.25 KiB) Downloaded 11 times
User avatar
lucabaldini
Pro Gamma
Pro Gamma
 
Posts: 4945
Joined: 1 October 2010, 17:03
Location: Bologna

Re: FOUNDATION 22: dosort dove sbaglio?

Postby lucabaldini » 10 October 2022, 14:19

Ovviamente il mio è solo un esempio (mi divertono questi algoritmi).

Si potrebbe anche provarea ad assegnare il valore a target.ZORDER uguale a source.ZORDER-5 e poi rinumerarle durante la stampa nel BeforeFormatting (quindi sfruttando il fatto che il report si ristampa in ordine).

In altre parole, come avevi fatto tu, assegni un valore -5 a quello tirato mettendolo al posto giusto, poi sfrutti il ciclo che fa il sistema per rinumerarli a step di 10 (nel reportHeader-BeforeFormatting inizializzi una variabile globale a 10) e nei beforeformatting prendi il documento gli assegni il valore della variabile globale e lo aumenti di 10.

Bisogna vedere se poi il report viene ristampato (come credo)...
User avatar
lucabaldini
Pro Gamma
Pro Gamma
 
Posts: 4945
Joined: 1 October 2010, 17:03
Location: Bologna

Re: FOUNDATION 22: dosort dove sbaglio?

Postby lucabaldini » 10 October 2022, 14:21

Comunque come dicevo vorrei pensarci un attimo... non mi piace che non si possa "giocare" con la collection ma è anche vero che il sistema ne ha bisogno e ha bisogno che sia in uno stato consistente con lo stato in cui era quando una certa pagina è stata stampata.

Ripeto: il tuo caso è "semplice"... una singola pagina e tu sai che è finita, ma il sistema no... e se il tuo caso riguardasse un report multi-pagina (come GMAIL per esempio) non sarebbe corretto che la collection venisse ri-ordinata tra la pagina 1 e la pagina 2 solo perché l'utente ha cliccato o fatto un D&D di una e-mail... a meno di non permetterlo ma poi ristampare subito tutto dopo il D&D.
User avatar
lucabaldini
Pro Gamma
Pro Gamma
 
Posts: 4945
Joined: 1 October 2010, 17:03
Location: Bologna

Re: FOUNDATION 22: dosort dove sbaglio?

Postby theguru » 10 October 2022, 18:22

Eccomi.
Mi mancavano queste dissertazioni, e ne approfitto per dirti che apprezzo.
Direi che la situazione mi è chiara, simile a quella che avevo intuito, anche se mi mancavano le considerazioni sul multipagina.
Ti do un mio feedback più generale, da utente ormai... navigato, sperando di apportare qualcosa di utile.

E partiamo facendo un passo indietro: INDE è davvero poco MVC
I pannelli hanno in carico di fare troppa roba, roba che spetterebbe al controller-model, non al view.
Questo, soprattutto nel >2020, non è buona cosa.
Ma tutto sommato ci si mette una pezza, architettando le nostre applicazioni cercando di rendere i pannelli quanto più "view" possibile, settandovi solo le collection (o i doc), non chiamando alcun loro metodo, e lavorando sulla DO per la business logic, lasciando che il pannello si aggiorni automaticamente quando il layer dati (collectio e doc) cambiano.
Esempi sono per l'appunto l'ordinamento, le funzioni per la (multi)selezione, filtraggio, riposizionamento e via dicendo.

E con i pannelli direi che funziona, al 98% aggiungo, ci sono un paio di buggetti ma ci conviviamo.
Con i book la cosa cambia: tu provi a lavorare sul layer dati, ma questo risponde male, come abbiamo chiarito sopra.
Il che, se vogliam fare un pdf va bene, si workarounda, se vogliamo gestire un book "screen" (molto utili per ottenere certi risultati grafici), siamo del gatto.
Ora, vi sono situazioni dove un bel screen book farebbe comodo, ma a causa di quanto sopra con il tempo mi sono organizzato per farne a meno, e quindi gestire pannelli sempre più complessi, con html generato dinamicamente dentro gli span, qualche correzione nei javascript etc.
Oltretutto, devo dire che layout molto simili sono sensibilmente più veloci nella versione pannello.
Ed aggiungiamo che lavorare sul wysiwyg dei pannelli è molto più agevole rispetto ai book.

Però che dire, peccato, i book sono uno strumento davvero potente.
PS: mai utilizzato un book a schermo in versione paginata. i book si usano per fare cose più particolari che non gestire liste multipagina, imho.
User avatar
theguru
 
Posts: 955
Joined: 29 January 2014, 13:01

Re: FOUNDATION 22: dosort dove sbaglio?

Postby Felix263 » 11 October 2022, 13:40

Grazie mille per la spiegazione sia per i suggerimenti e per la versione migliorata del progetto.
Ho molte lacune e questi aiuti/suggerimenti sono sempre ben accetti.

Ciao
Felix263
 
Posts: 112
Joined: 18 June 2014, 6:59


Return to Tips & Tricks - Foundation

Who is online

Users browsing this forum: Majestic-12 [Bot] and 29 guests

cron