Reflection e best practices

Siccome sto rifacendo dei pannelli di riepilogo che hanno varie (decine) di colonne che sono sostanzialmente la somma del campo di una collection di dettaglio estratta, ho pensato di reinventarmi pigro e sfruttare la collection.
Purtroppo non l’ho fatto da subito perché il vecchio pannello era su IMDB derivante da un’applicazione precedente, quindi ero molto limitato e ho dovuto scrivere centinaia di righe di codice tutte uguali, certo avrei potuto estrarre una nuova collection da query già sommata, ma avevo già i dati lì…

Sostanzialmente per avvantaggiarmi ho riordinato le proprietà della classe in cartelle in modo da aggiungere eventuali nuove proprietà nei punti in cui includere o escludere la proprietà dall’algoritmo di sommatoria.
A questo punto ho introdotto due proprietà “startIDsum” e “endIDsum” una prima e una dopo il gruppo di campi che devono essere sommati, mi piace poco perché introduce proprietà inutili, ma mi permette di vedere al colpo d’occhio dove inserire le proprietà nell’albero.

Ad esempio:

  • Classe.DocID
  • Classe.Codice
  • Classe.Descrizione
  • Classe.Tipo
  • Classe.startIDsum
  • Classe.Valore1
  • Classe.Valore2
  • Classe.Valore3
  • Classe.Valore4
  • Classe.endIDsum
  • Classe.Media1
  • Classe.Media2
  • Classe.Media3
  • Classe.Media4

Dove sommo i ValoreN ma non MediaN e chiaramente docid, codice, descrizione e tipo che non ha senso sommarli ma li raggruppo.

Le collection di riepilogo sono sempre della stessa istanza del dettaglio, quindi le proprietà corrispondono 1:1, con un semplice FOR(i = Classe.startIDsum+1; i< Classe.endIDsum; i++) mentre ciclo la collection sommo i valori nella stessa proprietà sulla collection di destinazione facendo i controlli di raggruppamento.

Certo, è una cosa che va bene quando hai poche righe, ma questo mi ha permesso di creare sia delle intere collection con i dati raggruppati sia dei record di totalizzazione nella stessa collection di dettaglio.

Voi che soluzioni usate? Avete consigli per gestire meglio gli intervalli di proprietà?

PS: scusate per il titolo un po’ generico ma mi piacerebbe iniziare una discussione sulle varie tecniche di reflection e non una cosa specifica.

2 Mi Piace

In effetti, un po’ alla volta, stiamo sostituendo l’utilizzo di tabelle imdb con istanze e collection di classi do, che ci permettono poi di sfruttare la reflection per scrivere codice molto più flessibile.
Questo è un bel esempio, sarebbe interessante conoscere altri approcci.

1 Mi Piace

Ciao, mi inserisco anche io in questa discussione, in realtà iniziata ieri sul forum (The Instant Developer Forums • View topic - come validare un IMDB usato per filtrare?).

@r.bianco quando parli di dismettere IMDB per DO, cosa fai nei casi in cui i campi IMDB sono usati in una master query per sfruttare la feature “modifica il valore di un campo IMDB e ottieni in automatico il refresh della query”?

Ho fatto questo mini progetto estrapolando l’IMDB su cui stavo lavorando ieri (e per il quale avevo cheisto sul forum).

Questo progetto all’avvia apre una videata che viene filtrata da IMDB, creo 3 record al volo e inizialmente ne mostro solo uno (siccome il filtro è “dal 2022 al 2022”).

Ora il mio filtro IMDB ha queste feature:

  1. inizializzo i due campi all’anno corrente
  2. non permetto al campo di sinistra di essere maggiore di quello di destra
  3. non consento valori fuori dal range 2020-2099
  4. consento solo numeri (siccome il campo nasce su un campo int)

Per ottenere queste feature ho dovuto usare 2 eventi di pannello e due variabili booleane, con la DO mi veniva tutto più pulito.

La mia domanda è: se faccio una classe DO per filtrare nel before save della classe voglio anche andare a modificare un IMDB in qualche modo (esempio estremo mandando un AppMessage) oppure il meccanismo di filtro non sfrutta IMDB?

Scusa @d.termini sono andato un po’ offtopic ma ci tenevo a discutere anche di questo.

Ecco il progetto:

Esempio Filtro IMDB.zip (513,3 KB)

Ciao!

1 Mi Piace

Stiamo tentando di evitare questo comportamento per il semplice fatto che una videata potrebbe dipendere da più campi e quindi ad ogni modifica parte una query, inoltre se la query è pesante diventa pesante N-volte.
Solitamente impostiamo i valori di filtro e poi premiamo il bottoncino “leggi”, se un pannello deve essere aggiornato colleghiamo l’azione refresh della toolbar con il metodo “leggi” chiamato dal pulsantino o da un altro metodo che aggiorna solo quel pannello.
Inoltre per aggiornare una collection ci devi per forza fare un metodo, quindi viene da se che il tutto va fatto in un certo modo.
Il tutto ci garantisce in più un certo controllo su quando il pannello deve fare le operazioni, collegato anche al fatto che il comportamento di aggiornamento automatico funziona solo ed esclusivamente con le IMDB.
Non che non lo schifiamo completamente, da qualche parte lo usiamo ancora, ma non per le videate complesse dove siamo totalmente passati alla DO.

1 Mi Piace