Newsgroup: it.comp.appl.access
Titolo: Ciclare valori e assegnare colore etichetta

Ciao a tutti, forse il 3d di amalia sulle etichette variabili di qualche
giorno fa mi ha un po' confuso ... ma mi ha stuzzicato e convinto a
risolvere un problema che avevo in precedenza risolto in modo un po'
artigianale.
Ho la necessità di generare dinamicamente un report che varia il colore di
alcune sue sezioni in funzione del valore della categoria a cui si
riferisce.
Siccome all'inizio le categorie dovevano essere fisse avevo messo a manina
tutte le casistiche in un
select case ... ecc
Case "Ruolo nella Strategia"
variaz_backcolor = 10040115
Case "Ruolo nella pianificazione della successione del ceo"
variaz_backcolor = 65535
Case "Valutazione sulla gestione"
variaz_backcolor = 16711935
ecc...
Siccome ho visto ora che le categorie del nuovo questionario (e suppongo
sarà cosi anche per il futuro) variano, ho aggiunto i diversi valori alla
tabella categorie ed in più ho messo un campo in cui memorizzo il colore.
(strutt: id_Categoria, categoria, id_questionario, colore)
Case "Ruolo nella Strategia"
variaz_backcolor = DLookup("[colore]", "Tbl_categorie", "[categoria]='Ruolo
nella Strategia'")
Case "Ruolo nella pianificazione della successione del ceo"
variaz_backcolor = DLookup("[colore]", "Tbl_categorie", "[categoria]='Ruolo
nella pianificazione della successione del ceo'")
Case "Valutazione sulla gestione"
variaz_backcolor = 16711935
variaz_backcolor = DLookup("[colore]", "Tbl_categorie",
"[categoria]='Valutazione sulla gestione'")
ecc...
Visto che la tabella categorie ha anche un campo id_questionario a cui si
linka, come potrei fare per ciclare all'apertura del report tutte le
categorie di un questionario ed assegnare i valori che posso usare
dinamicamente per i vari select case?
Forse una matrice (che non so quanto può essere grande) o un recordset ...
ma su questi ultimi "zoppico"  ancora un po' ... idealmente dovrebbe essere
una roba del genere ...
Case matrice1
variaz_backcolor = DLookup("[colore]", "Tbl_categorie", "[categoria]='" &
matrice1 & "'")
Case matrice2
variaz_backcolor = DLookup("[colore]", "Tbl_categorie", "[categoria]='" &
matrice2 & "'")
Case matrice3
variaz_backcolor = DLookup("[colore]", "Tbl_categorie", "[categoria]='" &
matrice3 & "'")
matrice n???
ecc...

ciroteo ® (nospam) ha scritto:

Se usi una matrice poi sei costretto a ciclarla tutta per fare la
ricerca...!
Non ti conviene caricare un Recordset su Open del Report con
IdCategoria e Colore, quindi con un bel FindFirst sul Recordset estrai
direttamente ed assegni....?
Su Formattazione della sezione devi avere il campo IdCategoria
ovviamente.
Quindi dichiariil RS a livello di Modulo ed assegni alla proprietà
BackColor il valore del campo
Colore...!
Ho capito male...?
@Alex


Io ti consigliere una collezione (array associativo). La collezione la 
carichi da un recordset mettendo come indice la categoria e valore il 
colore. Fatto questo la select non ti dovrebbe piu servire poiche' e' 
sufficente
variaz.backcolor = mycoll(categoria)
per caricare la collezione
Dim myColl as new collection
set rs = currentdb.openrecordset("Tbl_categorie")
do until rs.eof
	mycoll.add rs!categoria, rs!colore.value
	rs.movenext
loop
Questo sempre a patto che abbia capito "lo" problema
Vedo che ci stiamo occupando delle stesse cose! ;<)
-- 
ac
y-1=x

 ha scritto nel messaggio
news:1j5nh.16217$AA.1...@tornado.fastwebnet.it...

board performance? io sto diventando matto ... questi qui non sanno nemmeno
cosa vogliono ed ogni tre per due cambiano tutto. questionario, categorie
tipologie di valutazioni!!!
Tento la tua strada anche se non ho ben capito.
Dim sql_scroll As String
 sql_scroll = "select categoria,colore from categorie where
numero_questionario='" & Forms("Frm_iniziale")!numero_questionario & "'"
Dim myColl As New Collection
variaz_backcolor = myColl(categoria)
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset(sql_scroll)
Do Until rs.EOF
myColl.Add rs!categoria, rs!colore.Value
rs.MoveNext
Loop
come faccio adesso ad assegnare il valore del colore all'etichetta se non so
a priori quante categorie ci sono?

 y-1=x
Nel caso specifico, questo di cui parliamo, mi fai capire perchè usare
una Collection obbligandoti a ciclare un RS, quando il metodo
FindFirst(DAO) o Find(ADO) fanno già
quello che serve...?
Parlo di ottimizzazione, non del fatto che non vada bene, perchè va
benissimo...!
Abbiamo già parlado di questa cosa....?
@Alex


e come se lo sai!
ne hai myColl.count
-- 
ac
y-1=x

 Abbiamo già parlado di questa cosa....?
Si ne abbiamo gia' parlato e "talvolta" trovo le collezioni piu' 
prestazionali e piu' duttili da usare, soprattutto se gli elementi della 
collezione sono a lora volta degli oggetti non e' questo il caso) a cui 
posso aggiungere, togliere o modificare proprietà e posso gestirle in 
modo "gerarchizzato" e spesso mi consentono il "riordinamento" e la 
"riaggregazione" via pointers la qual cosa da punto di vista 
prestazionale e' sicuramente superiore alla gestione via recordset.
-- 
ac
y-1=x

 y-1=x
Bye
@Alex


il pollo benchè con una coscia soltanto, sta ancora cuocendo ... ma forse
nel suo caso la soluzione potrebbe
essere ancor più semplice.
se questo maledetto evento su formattazione non mi facesse incasinare.
fortunatamente ho il salto pagina ad ogni categoria, prima valorizzo la
categoria e poi con un semplice dlokup
valuto il colore e lo assegno a tutte le etichette.
cosa più complessa sarebbe a questo punto se nella stessa pagina (o sezione)
devo valutare più categorie.
ah gli amici di accenture ... stanno bene quelli!


 ha scritto nel messaggio 
news:459cd24e$0$22394$4faf...@reader2.news.tin.it...

Se ho capito bene la frase: "Visto che la tabella categorie ha anche un 
campo id_questionario a cui si linka,.."; potresti benissimo inserire una 
relazione tra le tabelle e nell'evento "su formattazione" della sezione 
assegnare il colore al controllo...
Ciao.
-- 
Sergio MAZZA 


infatti questo è quello che ho fatto.
il problema si porrebbe se sulla stessa sezione di formattazione
(intestazione o corpo) ci fossero
più categorie. Fortunatamente raggruppo e faccio interruzione di pagina al
variare della categoria.
In questo modo mi ricalcola la pagina ogni folta che formatta.
Al momento non mi serve mettere nella stessa sezione più categorie, in tal
caso riprenderò i suggerimenti di Alex e di Alessandro,.
Grazie a tutti ce l'ho fatta ... + o - ...

 ecc...
Ma scusa, una struttura così...
Select Case Valore
  case valore1: dlookup(....valore1)
  case valore2: dlookup(....valore2)
  case valore3: dlookup(....valore3)
..non ha senso.
Puoi usare direttamente un'unica riga, senza select case, senza matrici, e
altri orpelli, mettendo la variabile nella dlookup:
  dlookup(....,"[categoria]=""" & Valore & """")
Non necessita di modifiche al codice se aggiungi nuove categorie, basta
che siano aggiunte nella tabella.
Tutt'al più aggiungi un Nz() per restituire un colore predefinito casomai
una categoria non fosse stata inserita in tabella.
Ciao.
-Marco-
-- 
namor at inwind punto it
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 ha scritto nel messaggio
news:enl162$gk0$1...@news.newsland.it...

sigh ... alla fine ho fatto pure io cosi.
ma ribadisco, se per esempio nel corpo ci sono più categorie?

 ma ribadisco, se per esempio nel corpo ci sono più categorie?
Siccome la formattazione della sezione è gestibile, io ti suggerirei
di ciclare nella Sezione
i controlli relativi alle categorie...!, e di applicare loro la
formattazione...., per velocizzare ribadisco che la cosa più comoda
nel tuo caso è un RS precaricato...!
Da quanto capisco + Categorie ci sono solo se hai più controlli,
altrimenti se il controllo fosse unico avresti il ripetersi dell'Evento
format, ed il problema non si porrebbe...!
Volendo puoi crearti una Classe alla quale passi l'Oggetto Report che
riesca ad intercettare
gli Eventi Format delle sezioni(per questo devo riprendere un demo in
quanto l'intercettazione non è esposta, ma si ottiene con facilità
solo che non ricordo a memoria il metodo(non mi riferisco al
WithEvents, ma all'Object Type da definire, che se non è esplicito non
consente il WithEvents, se trovo il demo ti posto il codice)...!
@Alex

ciroteo ® ha scritto:


Magari non sarà ottimizzato ma secondo me dovrebbe funzionare se lo meti
sull'evento corpo_format:
  Me.Section(0).BackColor = dlookup(.....)
Anche nel caso in cui ci sia un cambio di categoria all'interno del corpo
dovrebbe cambiare lo sfondo.
Come prova prendi un qualsiasi report e prova a mettere questo sul
corpo_format:
    Me.Section(0).BackColor = Me.Section(0).BackColor Xor 16711680
Dovrebbe alternare le righe bianche/gialle.


 ha scritto nel messaggio
news:459e09e5$0$19097$4faf...@reader4.news.tin.it...

grazie ad entrambi, domani in giornata ci provo.
da lunedi ... stampellato mi toccherà andare a milano col lavoro fatto!
mannaggia ...

 mannaggia ...
Se pensi a realizzare una Classe queste sono le dichiarazioni dei
DataObject:
Private WithEvents mSectionDetail As Access.[_SectionInReport]
Private WithEvents mSectionReportHeader As Access.[_SectionInReport]
Private WithEvents mSectionReportFooter As Access.[_SectionInReport]
Private WithEvents mSectionGroupLevel1Header As
Access.[_SectionInReport]
Private WithEvents mSectionGroupLevel1Footer As
Access.[_SectionInReport]
Private WithEvents mSectionGroupLevel2Header As
Access.[_SectionInReport]
Private WithEvents mSectionGroupLevel2Footer As
Access.[_SectionInReport]
Private WithEvents mSectionGroupLevel3Header As
Access.[_SectionInReport]
Private WithEvents mSectionGroupLevel3Footer As
Access.[_SectionInReport]
Private WithEvents mSectionGroupLevel4Header As
Access.[_SectionInReport]
Private WithEvents mSectionGroupLevel4Footer As
Access.[_SectionInReport]
Private WithEvents mSectionGroupLevel5Header As
Access.[_SectionInReport]
Private WithEvents mSectionGroupLevel5Footer As
Access.[_SectionInReport]
Private WithEvents mSectionGroupLevel6Header As
Access.[_SectionInReport]
Private WithEvents mSectionGroupLevel6Footer As
Access.[_SectionInReport]
Private WithEvents mSectionGroupLevel7Header As
Access.[_SectionInReport]
Private WithEvents mSectionGroupLevel7Footer As
Access.[_SectionInReport]
Private WithEvents mSectionGroupLevel8Header As
Access.[_SectionInReport]
Private WithEvents mSectionGroupLevel8Footer As
Access.[_SectionInReport]
da definire con:
Public Sub Inizializza(rpt as Access.Report)
Set mSectionDetail = rpt.Section(acDetail)
If Not (mSectionDetail Is Nothing) Then
    'mSectionDetail.OnFormat = "[Event Procedure]"
    mSectionDetail.OnPrint = "[Event Procedure]"
    Set SectionDetail.Section = mSectionDetail
End If
Set mSectionReportHeader = rpt.Section(acHeader)
...
Set mSectionReportFooter = rpt.Section(acFooter)
...
Set mSectionPageHeader = rpt.Section(acPageHeader)
....
ecc....
End Sub
dove rpt è l'oggetto Report che istanzia la Classe
Quindi su evento Open del Report istanzierai la Classe passando Me come
oggetto
alla funzione Inizializza, nella quale io caricherei anche il Recordset
con i colori.
All'interno della Classe avrai poi cli eventi derivati:
Private Sub mSectionDetail_Format(Cancel As Integer, FormatCount As
Integer)
    ' quì ci metti quello che serve...!
End Sub
Buon Lavoro.
@Alex