Costruire dinamicamente una Vista

SANDBOX costruire vista dinamicamente ls

  • 2 commenti
Con questo articolo si apre ufficialmente la sezione SANDBOX di Dominopoint grazie alle vostre e-mail che giornalmente ci inviate...


Qualche giorno fa, su www.dominopoint.it, ero alla ricerca di una soluzione ad un mio problema, quando sfogliando tra gli articoli pubblicati ho trovato un riferimento alla possibilità di cambiare la formula di selezione di una vista, ricordandomi che non solo è possibile cambiare la formula di selezione ma anche i titoli delle colonne e il campo associato alla colonna stessa.

Uno dei problemi di noi programmatori è la capacità di creare tante viste in un db notes. Specie a fronte della richiesta degli utenti finali. Mi sono ricordato che avevo già affrontato questo problema e così ho deciso di rendervi partecipi della mia soluzione.

La mia soluzione

La base dati su cui ho applicato la soluzione è utilizzato nella mia società per elaborazioni statistiche. Il Db in questione contiene circa 45.000 record. Le informazioni che la fanno da leone in questa base dati sono campi contenenti delle date. Banalmente data di apertura, caricamento, sopralluogo ( lavoro per una azienda di servizi assicurativi), resa perizia ecc. La moltitudine di queste date fa sì che l’utenza interna necessiti sempre di viste dettagliate, dove il record (leggi form) è sempre lo stesso, ma le aggregazioni sono o possono essere diverse. Il campo indice è il nominativo del collaboratore che ha espletato l’attività peritale.

Lo scopo del db è misurare le performance del singolo collaboratore in un dato periodo secondo parametri standard.


Come prima soluzione ho ristretto la numerosità dei record creando un form statistico per ogni collaboratore, che contiene a sua volta i totali, le percentuali e le medie di tutto un anno, diviso per mese. Quindi ho un record per l’anno 2004, 2005 e 2006, per ogni collaboratore.

Immaginate che avendo 15 collaboratori, avrò 45 record, ogni record contiene l’informazione di un anno solare. E se dovessi mostrare l’informazione per ogni anno in teoria avrei dovuto creare 45 viste o forse più se i collaboratori fossero più di 15, per non parlare degli anni.

Quindi, ho creato una vista che di base mi mostra tutti i collaboratori nell’anno corrente, banalmente la formula di selezione è :

“SELECT Form="StatDoc_Studi" & StatDoc_Anno = 2006”

Image:Costruire dinamicamente una Vista

ho creato una action chiamata “Anno e Mese da visualizzare”, sul client in lotus script.

Quello che segue è il codice, cha andiamo a commentare.
Le prime tre righe definiscono l’ambiente,  utilizzo la classe UserInterface per definire il NotesUIworkspace e la vista NotesUIView mentre la vista View non è della classe UserInterface.
Avrei, volendo potuto utilizzare un altro metodo più “sofisticato” invece delle InputBox, ma visto l’uso che ne dovevo fare era la soluzione perfetta.

Dim ws As New NotesUIWorkspace

Dim uiview As NotesUIView

  Dim view As NotesView


Con le due inputbox chiedo all’utente l’anno da visualizzare ed il mese ed effettuo i controlli del caso:

Dim formula As String

Dim MioAnno as String

Dim MioMese as String        


MioAnno = Inputbox$("Anno da estrarre","Anno","2004")        

If MioAnno = "" Then

  Exit Sub

End If

MioMese = Inputbox$("Mese da visualizzare","Mese","1")

If MioMese = "" Then

  Exit Sub

End If

If Cdbl(MioMese ) < 0 Or Cdbl(MioMese ) > 12 Then

  Msgbox("Errore i mesi sono 12 devi imputare un valore compreso tra 1 - 12 ")

  Exit Sub

End If



Nell’if che segue creo e valorizzo la variabile Mese, normalizzandone il contenuto qualora di un carattere aggiungo lo 0 (zero):

If Len(MioMese)=1 Then
          Mese = "0" + MioMese
  Else
          Mese = MioMese
  End If


La prima select crea e valorizza un’etichetta TitoloMese che molto banalmente contiene il nome del mese in caratteri:

Select Case MioMese
  Case "1"
          TitoloMese = "Gennaio"
  Case "2"
          TitoloMese = "Febbraio"
  Case "3"
          TitoloMese = "Marzo"
  Case "4"
          TitoloMese = "Aprile"
  Case "5"
          TitoloMese = "Maggio"
  Case "6"
          TitoloMese = "Giugno"
  Case "7"
          TitoloMese = "Luglio"
  Case "8"
          TitoloMese = "Agosto"
  Case "9"
          TitoloMese = "Settembre"
  Case "10"
          TitoloMese = "Ottobre"
  Case "11"
          TitoloMese = "Novembre"
  Case Else
          TitoloMese = "Dicembre"
  End Select


Ora che ho inizializzato tutte le variabili mi appresto a cambiare il contenuto della select per la vista su cui stiamo lavorando        
  formula = "SELECT Form=""StatDoc_Studi"" & StatDoc_Anno = " & MioAnno

 
inizializzo la variabile della classe UserInterface relativa alla vista:                
  Set uiview = ws.CurrentView
E assegno alla variabile view il valore della variabile UIView
  Set view = uiview.View
Applico alla vista la nuova formula
  view.SelectionFormula = formula
         
e infine ciclo su tutte le colonne della vista.
  Forall vc In view.Columns
          title = vc.Title
          Select Case vc.Position
          Case Is = 1
                  vc.Title = "Statistica di " +TitoloMese + " / " + MioAnno
          Case Is = 2
                  vc.Formula = "StatDoc_RicTot" & Mese
          Case Is = 3
                  vc.Formula = "StatDoc_CloseTot" & Mese
          Case Is = 4
                  vc.Formula = "StatDoc_refperc" & Mese
          Case Is = 5
                  vc.Formula = "StatDoc_CloseLess25" & Mese
          Case Is = 6
                  vc.Formula = "StatDoc_Chiusi" & Mese
          Case Is = 7
                  vc.Formula = "StatDoc_OpenTot" & Mese
          Case Is = 8
                  vc.Formula = "StatDoc_Close" & Mese
          Case Is = 9
                  vc.Formula = "StatDoc_LiqMed" & Mese
          End Select
  End Forall
 
Ricostruisco la vista e effettuo un refresh della stessa.
  Call ws.ViewRebuild
  Call ws.ViewRefresh
 

Nel ciclo nella prima colonna cambio il titolo, dalla seconda alla nona la formula. I campi sono stati definiti con questa logica, descrizione, più il mese che rappresenta. Per cui la colonna 6 contiene il numero di pratiche chiuse nel mese di maggio ad esempio se l’utente avesse indicato 5 alla domanda quale mese.

E’ stato più complicato commentare che scrivere, spero che questa soluzione possa servire a qualche altro “collega”.

Un saluto

Enrico Scotti

2 Commenti:

  • #1 Lore 11/21/2006 2:55:43 PM

    grazie enrico hai avuto un'ottima idea. Ho provato ad applicare alla mia esigenza il tuo codice, ma ho un problema mi ritorna il seguente errore "notes error: unknown[keyword]for @Function(SELECT ( @UpperCase( Form ) = "OFFERTA" ) & ( !@Contains( Archiviata ; "1" ) ) )"

    Hai qualche idea da suggerirmi dove sto sbagliando? capisco che non mi acceta la riga di codice

    formula$ = "SELECT ( @UpperCase( Form ) = [OFFERTA] ) & ( !@Contains( Archiviata ; [1] ) )", però se metto quello che hai scritto tu e precisamente:

    formula = "SELECT Form=""StatDoc_Studi"" & StatDoc_Anno = " & MioAnno

    mi va subito in errore e non mi fa salvare la Action.

    Cosa posso fare?

    grazie

  • #2 Giuseppe Grasso 11/03/2006 5:38:23 PM

    Grazie Enrico, tutto molto chiaro e dettagliato!

Commenta articolo
 

Questo spazio web è stato creato da per un uso pubblico e gratuito. Qualsiasi tipo di collaborazione sarà ben accetta.
Per maggiori informazioni, scrivete a info@dominopoint.it

About Dominopoint
Social
Dominopoint social presence: