Newsgroup: it.comp.appl.access
Titolo: Filtrare record rappresentati in un report, tramite maschera o codice VBA del Report. Come?

Premetto che stò lavorando su un report che ho trovato su "sitocomune"
succeritomi da Roberto da Casa.
Il report è: Rappresentazione di spazi temporali mediante....
Ho impostato una maschera in cui poter inserire le 2 date (PrimaData ----
UltimaData) ed un tasto,
per poter eseguire il mio report secondo le due date inserite nella
maschera.
Succede che nel report si vedono, i record posizionati correttamente ed
anche i record che non hanno niente a che
fare con quell'arco di tempo impostato nella maschera.
Ho pensato di creare quindi una Query per filtrare i record della Tabella
prima di riportarli nel Report;
utilizzando la precedente Maschera lancio la Query per filtrare i record, ma
non so come
dirgli che adesso deve lanciare il Report rappresentando solo i record
filtrati.
DoCmd.OpenQuery "Query2", , acReadOnly                    'La Query2 è
quella che filtra'
    Dim stDocName As String
    stDocName = "RptTimeLines"
    DoCmd.OpenReport stDocName, acViewPreview, acEdit
Con questo codice VBA applicato sul tasto della maschera riesco a lanciare
sia la Query2 di selezione che il Report,
ma ovviamente non riesco a dire al Report di prendere solo i Record filtrati
da Query2!!!
Notare bene che il Report dovrà comunque essere impostato secondo l'arco
temporale compreso
tra le due date riportate nella maschera e visualizzare i record filtrati.
Mi chiedevo se è possibile, anzichè utilizzare una Query per filtrare i
record,
creare un filtro nel codice VBA del Report; se sì, quale istruzione devo
quardarmi?
Spero di essere riuscito a spiegare il problema e non c'è bisogno di dirvi
che sono alle primissime armi con Access,
perchè si capisce da come scrivo!!!
Grazie a tutti.
Salvatore
(Ma di chi?!!!! Mi piacerebbe saperlo.)

 (Ma di chi?!!!! Mi piacerebbe saperlo.)
(quando lo scopri dillo anche a noi)
--
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------

 [Forms]![Criteri]![PeriodoDal]   (E' solo un esempio, perchè appena
funziona così lo farò anche più restrittivo)
Report   "RptTimeLines"
Quando provo a lanciare la Maschera Criteri, si verifica l'errore su Set
rst...... del VBA sul Report (vedi sotto)
Nella maschera Critery ho solo messo l'apertura del Report e non quella
della Query, come suggeritomi da Roberto da casa.
IstrSQL = "SELECT Importo, PeriodoDal, PeriodoAl FROM QryTimeLines WHERE
IDCamera=" & Me.IDCamera
Set rst = CurrentDb.OpenRecordset(IstrSQL, dbOpenSnapshot) 'tutti i
pagamenti del ciente selezionato
Se levo il criterio di filtro dalla Query, tutto funziona ma ovviamente mi
riporta tutti i record della TblAssistenza.
Questo errore mi sembra voglia dire che non è esatta IstrSQL, perchè sulla
Set rst cosa può esserci di sbagliato?
Qualcuno mi dice perchè non funziona?
In realtà non rappresenta neanche bene i record, ma questo cercherò di
risolverlo dopo, perchè forse è una conseguenza anomala del
rappresentare tutti i record contemporaneamente.
Salvatore

 Salvatore


 Roberto
Sono d'accordo: espongo in breve il mio obbiettivo.
Devo creare un gestionale per un albergo, con una serie di funzioni......nel
caso specifico devo realizzare un report o
qualsiasi altra cosa che mi possa far visualizzare le prenotazioni di tutte
le camere in un determinato intervallo, che
in genere è quello settimanale; tipo dal 22/02/2003 al 01/03/2003.
Ho una tabella TblPrenotazioni con i campi [IDPrenotazione] [IDCamera] [Dal]
[Al] [DataPrenotazione]
Nel mio report devo visualizzare le prenotazioni di un periodo; ciascuna
riga corrisponde ad una camera e ciascuna colonna
corrisponde ad un giorno.
Partendo dall'esempio preso da Sitocomune, ho considerato le Assistenze come
se fossero le mie prenotazioni.
Il problema è giunto perchè quando si lancia il report si visualizza secondo
il seguente criterio trovato sul codice VBA del report.
Private Sub Report_Open(Cancel As Integer)
 'periodo totale da visualizzare
 PrimaData = DMin("PeriodoDal", "QryTimeLines")
 UltimaData = DMax("PeriodoAl", "QryTimeLines")
 If UltimaData < Date Then UltimaData = Date
End Sub
Ho capito che PrimaData è il più piccolo valore trovato dalla QryTimeLines e
UltimaData è quello più grande trovato sempre
nella stessa Query.
L'intervallo del Report è compreso tra le due.
La mia necessità è quella di visualizzare l'intervallo secondo due date
variabili dall'utente stesso;
ho quindi creato una query "Criteri" ed al posto del codice VBA soprascritto
ho inserito:
Private Sub Report_Open(Cancel As Integer)
 'periodo totale da visualizzare
 PrimaData = Forms![Criteri]![PeriodoDal]
 UltimaData = Forms![Criteri]![PeriodoAl]
End Sub
Le anomalie riscontrate sono:
1) inserendo nei campi non associati della maschera Criteri un intervallo
dal 01/03/2003 al 08/03/2003
si vedono anche le Assistenze (per me sono prenotazioni) di febbraio. Ce ne
è una che parte dal 26/02 e si vede!
Ecco perchè volevo inserire un criterio di filtro nella query, per non fare
vedere le prenotazioni che non intaccassero
l'intervallo di tempo da visualizzare nel report.
2) se faccio un report dal 20/02/2003 al 27/02/2003 alcune prenotazioni
partono dal giorno esatto rappresentato sul report, altre no.
Ad esempio: una prenot che và dal 19/02 al 23/02 parte come fosse una prenot
dal 21/02.  Mentre quelle che partono dal 20/02
oppure dal 21/02/03 oppure dal 26/02 vanno tutte nella posizione giusta.
Se faccio un altro report dal 21/02 al 28/02 la stessa prenot che parte dal
19/02 avanza di un giorno e và al giorno 23/02.
Ho notato che la differenza in valore assoluto tra la data di inizio report
e di inizio data è giusta, ma la prenotazione viene posizionata
dalla parte opposta.....non so se mi sono riuscito a far capire.
Dove diavolo sbaglio?

= [Forms]![Criteri]![PeriodoDal], 1,
IIf([PeriodoDal]>[Forms]![Criteri]![PeriodoDal] And [PeriodoDal] <=
[Forms]![Criteri]![PeriodoAl], 1, 0))) = 1))
ORDER BY TblAssistenze.PeriodoDal;
4) Modifica il codice VBA generato a fronte dell'evento "Su apertura" del
report nella seguente maniera:
 Private Sub Report_Open(Cancel As Integer)
 PrimaData = DMin("PeriodoDal", "TAbPippo")
 UltimaData = DMax("PeriodoAl", "TAbPippo")
 If UltimaData < Date Then UltimaData = Date
 GiorniDifferenza = DateDiff("d", PrimaData, UltimaData)
End Sub
5) Modifica il codice VBA generato a front dell'evento "Su formattazione"
del corpo del report nella seguente maniera:
Private Sub Detail_Format(Cancel As Integer, FormatCount As Integer)
 'visualizza scadenza con label in rosso
 Me.EtiAssistenzaScaduta.Visible = Me.AssistitoFino < Date
 'per tracciare i rettangoli
 Dim Factor As Single, StartDayDiff As Integer, DayDiff As Integer
 'dimensioni rettangolo
 Dim x1 As Single, y1 As Single, x2 As Single, y2 As Single
 Me.ScaleMode = 1 'twips
 Factor = Me.boxMaxDays.Width / GiorniDifferenza
 'legge i pagamenti per il cliente corrente
 Dim rst As Recordset, IstrSQL As String
 IstrSQL = "SELECT Importo, PeriodoDal, PeriodoAl FROM TAbPippo WHERE
IDcliente=" & Me.IDcliente
 Set rst = CurrentDb.OpenRecordset(IstrSQL, dbOpenSnapshot) 'tutti i
pagamenti del cliente selezionato
 With rst
 If Not .EOF Then
  .MoveFirst 'primo pagamento
 End If
  Do Until .EOF
   StartDayDiff = Abs(DateDiff("d", !PeriodoDal, PrimaData)) 'offset inizio
rettangolo
   DayDiff = Abs(DateDiff("d", !PeriodoAl, !PeriodoDal)) 'durata periodo in
giorni
   If StartDayDiff = 0 Then StartDayDiff = 1
   'colore di riempimento rettangoli (il periodo di assistenza gratuito lo
mostra in verde scuro, i pagamenti in verde chiaro)
   If !Importo > 0 Then
    Me.FillColor = RGB(0, 255, 0)
   Else
    Me.FillColor = RGB(0, 190, 0)
   End If
   Me.FillStyle = 0
   x1 = Me.boxMaxDays.Left + (StartDayDiff * Factor)
   y1 = Me.boxMaxDays.Top + 200
   x2 = x1 + DayDiff * Factor
   y2 = y1 + 300
   Me.Line (x1, y1)-(x2, y2), , B
   'stampa data ad inizio periodo
   Me.CurrentX = x1
   Me.CurrentY = y2 + 50
   Me.Print !PeriodoDal
   .MoveNext
  Loop
  .Close
 End With
 'visualizza con una linea verticale azzurra il giorno corrente
 Me.FillColor = RGB(0, 200, 255)
 Me.FillStyle = 0
 StartDayDiff = Abs(DateDiff("d", Date, PrimaData))
 x1 = Me.boxMaxDays.Left + (StartDayDiff * Factor)
 y1 = Me.boxMaxDays.Top + 50
 x2 = x1 + 100
 y2 = Me.Height - 50
 Me.Line (x1, y1)-(x2, y2), , B
End Sub
6) Ora apri la maschera Criteri, digita le due date del periodo e pigia il
pulsante di comando: si dovrebbe aprire il report con i soli record che
cadono nel periodo da te richiesto.
Dopo che avrai modificato l'esempio del Sito Comune nella maniera che ti ho
indicato e il tutto ti funziona, riporta il tutto all'interno del tuo
database.


[SUPERCUT]
Pensandoci bene c'è una soluzione che non usa una tabella temporanea, ma che
"personalizza" il codice SQL della query QryTimeLines con la tecnica QBF
(Query By Form).
Creati la maschera Criteri come ti ho indicato nel mio messaggio delle 20:20
di ieri; però a fronte dell'evento "Su clic" del pulsante di comando genera
il seguente cosice VBA:
Dim StrSQL As String
Dim MyQueryDef As DAO.QueryDef
StrSQL = "SELECT IDcliente, Importo, PeriodoDal, PeriodoAl " & _
"FROM TblAssistenze " & _
"WHERE (((IIf(PeriodoDal<=#" & Format(Me!PeriodoDal, _
"mm/dd/yyyy") & "# And PeriodoAl>=#" & _
Format(Me!PeriodoDal, "mm/dd/yyyy") _
& "#, 1, IIf(PeriodoDal>#" & _
Format(Me!PeriodoDal, "mm/dd/yyyy") _
& "# And PeriodoDal<=#" & _
Format(Me!PeriodoAl, "mm/dd/yyyy") _
& "#, 1, 0))) = 1)) ORDER BY PeriodoDal;"
Set MyQueryDef = CurrentDb.QueryDefs("QryTimeLines")
MyQueryDef.SQL = StrSQL
Dim stDocName As String
stDocName = "RptTimeLines"
DoCmd.OpenReport stDocName, acViewPreview
Il resto resta invariato rispetto all'esempio pubblicato sul Sito comune
fatta eccezione per il fatto che nella routine VBA generata a fronte
dell'evento "Su formattazione" del corpo del report devi comunque sostituire
la riga di codice:
.MoveFirst
con queste tre righe di codice:
If Not .EOF Then
  .MoveFirst
End If
Questo va comunque fatto (anche nell'esempio originale pubblicato sul Sito
Comune), in caso contrario Access produrrà un errore nel caso in cui ci
fossero clienti senza contratto di assistenza (o nel tuo caso camere senza
prenotazione).
A me questa soluzione sembra più elegante.


 ha scritto nel messaggio
news:O856a.148754$ZE.43...@twister2.libero.it...

Ho realizzato entrambe le soluzioni, e mi sembra che la seconda sia la
migliore
e meno macchinosa.
Sono rimasti alcuni problemi e stò verificando se sono dovuti dal VBA del
report;
infatti nel report un rettangolo azzurro indica la posizione della data
odierna e non funziona anche se il VBA sembra corretto.
Mi chiedevo se nei service pack di access, sono stati corretti dei bug sui
report .
Salvatore

 Salvatore
Uso Access Xp su una macchina con Windows Xp Prof.

 Salvatore


 Roberto
Ho avuto anche un altro suggerimento (credo da Maurizio Borrelli su
microsoft.public.it.office.access  se non ricordo male), utilizzando 4
query;
proverò anche con quello.
Grazie di tutto il tuo supporto,
Salvatore.

 Salvatore.


 Roberto
Di fatti ho fatto qualche cambiamento al VBA, perchè volevo che quando
PeriodoDal < PrimaData,
il rettangolo iniziasse prima del report (o meglio fuori dallo stesso); di
conseguenza la data della prenotazione non
viene visualizzata. Con esattezza ti riporto quello che ho scritto nel VBA.
Option Compare Database
Option Explicit
Private PrimaData As Date
Private UltimaData As Date
Private GiorniDifferenza As Integer
Private Sub Detail_Format(Cancel As Integer, FormatCount As Integer)
   'per tracciare i rettangoli
 Dim Factor As Single, StartDayDiff As Integer, DayDiff As Integer,
StartDayDiff1 As Integer, DayDiff1 As Integer
  'dimensioni rettangolo
 Dim x1 As Single, y1 As Single, x2 As Single, y2 As Single, x3 As Single,
y3 As Single, x4 As Single, y4 As Single
 Me.ScaleMode = 1 'twips
 Factor = Me.boxMaxDays.Width / GiorniDifferenza
 'legge i pagamenti per il cliente corrente
 Dim rst As Recordset, IstrSQL As String
 IstrSQL = "SELECT Importo, PeriodoDal, PeriodoAl FROM QryTimeLines WHERE
IDcliente=" & Me.IDcliente
 Set rst = CurrentDb.OpenRecordset(IstrSQL, dbOpenSnapshot) 'tutti i
pagamenti del cliente selezionato
 With rst
  '.MoveFirst 'primo pagamento
  If Not .EOF Then
  .MoveFirst
End If
  Do Until .EOF
  If !PeriodoDal < PrimaData Then
   StartDayDiff = -Abs(DateDiff("d", !PeriodoDal, PrimaData))
  Else
   StartDayDiff = Abs(DateDiff("d", !PeriodoDal, PrimaData)) 'offset inizio
rettangolo
  End If
   DayDiff = Abs(DateDiff("d", !PeriodoAl, !PeriodoDal)) 'durata periodo in
giorni
   'colore di riempimento rettangoli (il periodo di assistenza gratuito lo
mostra in verde scuro, i pagamenti in verde chiaro)
  Me.FillColor = RGB(0, 190, 0)
Me.FillStyle = 0
   x1 = Me.boxMaxDays.Left + (StartDayDiff * Factor)
   y1 = Me.boxMaxDays.Top + 200
   x2 = x1 + DayDiff * Factor
   y2 = y1 + 300
   Me.Line (x1, y1)-(x2, y2), , B
   'stampa data ad inizio periodo
   StartDayDiff = StartDayDiff
   Me.CurrentX = x1
   Me.CurrentY = y2 + 50
   Me.Print !PeriodoDal
   .MoveNext
  Loop
  .Close
 End With
 'visualizza con una linea verticale azzurra il giorno corrente
 Me.FillColor = RGB(0, 200, 255)
 Me.FillStyle = 0
 If PrimaData <= Date Then
 StartDayDiff1 = DateDiff("d", PrimaData, Date)
 x3 = Me.boxMaxDays.Left + (StartDayDiff1 * Factor)
 y3 = Me.boxMaxDays.Top + 50
 x4 = x3 + 100
 y4 = Me.Height - 50
 Me.Line (x3, y3)-(x4, y4), , B
 End If
End Sub
Private Sub Report_Open(Cancel As Integer)
 'periodo totale da visualizzare
 PrimaData = Forms![Criteri]![PeriodoDal]
 UltimaData = Forms![Criteri]![PeriodoAl]
GiorniDifferenza = DateDiff("d", PrimaData, UltimaData)
End Sub
 Credo che vada bene per quello che voglio fare.
Grazie di tutto il tuo supporto credo di essere riuscito a risolvere questo
problema,
grazie molte.
Salvatore