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”
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
Costruire dinamicamente una Vista
- 11/03/2006
- 2 commenti
2 Commenti:
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
Grazie Enrico, tutto molto chiaro e dettagliato!