Newsgroup: it.comp.appl.access
Titolo: Report su campi incrociati

In un report che si basa su una query a campi incrociati, nell'evento su
apertura ho scritto questo codice:
Private Sub Report_Open(Cancel As Integer)
Dim rst As Recordset
Dim CMP As Field
Dim Conta As Integer
Dim Conta2 As Integer
Set rst = CurrentDb.OpenRecordset("impl_forn_finale")
Conta = 1
Conta2 = 12
For Each CMP In rst.Fields
      If Conta <= 11 Then
         Me("Controllo" & Trim(Conta)).ControlSource = CMP.Name
         Me("Controllo" & Trim(Conta)).Visible = True
         Conta = Conta + 1
      Else
         If CMP.Name <> " " Then
               Me("Controllo" & Trim(Conta2)).ControlSource = CMP.Name
               Me("Controllo" & Trim(Conta2)).Visible = True
               Conta2 = Conta2 + 1
          End If
       End If
 Next
Set rst = Nothing
End Sub
I primi 11 "controlli" si riferiscono a instestazioni di riga, mentre i
"controlli" che vanno dal 12 al 24 si riferiscono a una intestazione di
colonna.
Secondo il mio ragionamento le intestazioni di colonna dovrebbero essere
scritte solo se il campo di riferimento non è vuoto,
così come il contatore Conta2 dovrebbe incrementarsi solo se il campo di
riferimento non è vuoto, in modo tale che la visulizzazione di tali campi
parte sempre da sinistra, senza lasciare caselle vuote ma questo non accade.
Sono stato chiaro? Dove sbaglio?
Grazie in anticipo a chi mi potrà aiutare.

                Me("Controllo" & Trim(Conta2)).ControlSource = cut
cut
Hai notato che confronti CMP.name con la stringa 'spazio'?
Forse credevi di verificare che CMP.name fosse vuoto? se credevi questo hai
sbagliato sintassi.
Sib

 sbagliato sintassi.
Hai perfettamete ragione, ho guardato adesso il debug e il confronto che ho
fatto non và bene. Non riesco a capire però su cosa devo fare il confronto
per fare in modo che il contatore (cont2) si incrementi solo quando esiste
un valore non " " del campo nella query; mi potresti aiutare?
Grazie

 un valore non " " del campo nella query; mi potresti aiutare?
Elementare Watson.
se non e' " " allora e' "".
Megli se scrivi:
If nz(CMP.Name,"")<>"" then
Sib


In questa maniera perň, la condizione č sempre vera, anche quando il campo
non contiene niente,percui in contatore si incrementa sempre.
Dovrei trovare una condizione diversa ma non ci riesco.
Ciao

 Dovrei trovare una condizione diversa ma non ci riesco.
O non ho capito io o non hai capito tu.
Questa condizione e' vera in due soli casi:
1. quando CMP.Name e' null
2. quando CMP.Name e' una stringa a lunghezza zero ("", che non contiene
alcun carattere)
In tutti gli altri casi e' falsa.
Sib


Questo l'ho capito. Il problema è che probabilmente non devo guardare il
CMP.Name ma qualcos'altro. Se puoi rileggiti il primo post del 3d e dimmi se
hai capito cosa voglio fare.
Ti ringrazio comunque per l'interesse che hai dimostrato.
Ciao

 ha scritto nel messaggio
news:ao367r$ms0$1...@fe1.cs.interbusiness.it...

Mi sembra di aver capito, anche dalla discussione che abbiamo fatto in un
altro thread, che i primi 11 campi della query sono le intestazioni di
colonna e quindi esistino sempre.
Dopo di che la query può avere anche da 1 a 13 campi che rappresentano le
intestazione della query a campi incrociati: quindi la query avrà un numero
variabile di campi compreso tra 12 e 24.
A meno che tu, nella query non abbia usato la proprietà Intestazione
colonne, nel qual caso saranno 11 (intestazioni riga) più il numero di
intestazioni colonne che hai dichiarato: ma non credo che le cose stiano
così, altrimenti sarebbe da pazzi gestire dinamicamente l'origine controllo
dei controlli del report.
Se il numero dei campi della query a campi incrociati è compreso tra 12 e
24, a me sembra che ti stai complicando inutilmente la vita; se la query si
chiama impl_forn_finale, il codice VBA che devi generare a fronte
dell'evento "Su apertura" del report è il semplicemente il seguente:
Private Sub Report_Open(Cancel As Integer)
Dim rst As Recordset
Dim CMP As Field
Dim Conta As Integer
Set rst = CurrentDb.OpenRecordset("impl_forn_finale")
Conta = 1
For Each CMP In rst.Fields
         Me("Controllo" & Trim(Conta)).ControlSource = CMP.Name
         Me("Controllo" & Trim(Conta)).Visible = True
         Conta = Conta + 1
        End If
Next
Set rst = Nothing
End Sub
Così facendo i controlli da Controllo1 a Controllo11 conterranno i valori
dei primi 11 campi della query (quindi delle intestazioni di riga), dopo di
che i controlli da Controllo12 a Controllo24 del report conterranno i
restanti campi della query, naturalmente verranno visualizzati quelli che
effettivamente esistono: ma a verificare l'effettiva esistenza dei
campi/intestazione colonne se ne preoccupa la
For Each CMP In rst.Fields
e non devi fare altre indagini sul CMP.Name .
Quanto al fatto che vengano utilizzati a controllo più a sinistra del
report, tutto dipende da come hai sistemato i controlli stessi nel corpo del
report (da sinistra a destra o viceversa).
Onestamente non capisco il tuo problema.
--
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------

 hai capito cosa voglio fare.
Lasciamo perdere.
Vai sul sito comune e cerca l'esempio con i report dinamici.
Sib