Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Filtrare record rappresentati in un report, tramite maschera o codice VBA del Report. Come?

1,995 views
Skip to first unread message

Leonblu

unread,
Feb 20, 2003, 11:11:41 AM2/20/03
to
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.)

Roberto da casa

unread,
Feb 20, 2003, 12:49:29 PM2/20/03
to

"Leonblu" <leo...@infinito.it> ha scritto nel messaggio
news:1775a.138407$YG2.4...@twister1.libero.it...

Come origine record del report RptTimeLines usa Query2.
Non è affatto necessario che tu apri Query2 con una OpenQuery, ci penserà da
solo il report quando verrà aperto.

>
> 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?

Tramite l'argomento condizioneWHERE del Metodo OpenReport (vedi help).

> 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.)

(quando lo scopri dillo anche a noi)

--
Roberto

---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------


Leonblu

unread,
Feb 21, 2003, 10:59:50 AM2/21/03
to

"Roberto da casa" <r.ma...@libero.it> ha scritto nel messaggio
news:Jy85a.138724$YG2.4...@twister1.libero.it...
>

> Roberto


OK. Ho provato a fare così:
Maschera "Criteri" dove inserisco le date di inizio e fine periodo da
visualizzare. PeriodoDal PeriodoAl
Query "QryTimeLines" che filtra i risultati della tabella
"TblAssistenza" il criterio sotto il campo PeriodoDal è il seguente:
> [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

Roberto da casa

unread,
Feb 21, 2003, 12:15:50 PM2/21/03
to

"Leonblu" <leo...@infinito.it> ha scritto nel messaggio
news:W1s5a.141673$YG2.4...@twister1.libero.it...

Non ho assolutamente capito dove scrivi questo codice VBA e cosa ci vuoi
fare; se devi fare altri condizionamenti o inserisci altri criteri nella
query QryTimeLines oppure usi l'argomento condizioneWHERE del metodo
OpenReport; non riesco proprio a capire cosa ti serva, per stampare il
report, aprire un recordset sulla query QryTimeLines.

> 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 VBA non puoi usare la sintessi da te scritta per aprire un recordset su
una query di selezione parametrica: i parametri glieli devi passare al
momento dell'apertura. Per maggiori dettagli vai sul Sito Comune (link qui
sotto) e nella Sezione Queries leggi la FAQ di Federico Luciani intitolata
"Aprire una query parametrica da codice VBA".
Ma comunque resta il fatto che non si capisce il motivo per cui devi aprire
un recordset su quella query.

> 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.

????

Comunque, invece di raccontarci cosa hai fatto e non funziona sarebbe meglio
che tu ci raccontassi cosa vorresti fare, il come farlo magari lo vedremo
insieme; ho il "legittimo sospetto" che per stampare con un report i dati di
una query parametrica stai impelagandoti su cose che fra l'altro potrebbero
non servire a nulla.

>
> Salvatore

Leonblu

unread,
Feb 21, 2003, 5:35:42 PM2/21/03
to

"Roberto da casa" <r.ma...@libero.it> ha scritto nel messaggio
news:a9t5a.141914$YG2.4...@twister1.libero.it...

> Comunque, invece di raccontarci cosa hai fatto e non funziona sarebbe
meglio
> che tu ci raccontassi cosa vorresti fare, il come farlo magari lo vedremo
> insieme; ho il "legittimo sospetto" che per stampare con un report i dati
di
> una query parametrica stai impelagandoti su cose che fra l'altro
potrebbero
> non servire a nulla.

> 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?


Roberto da casa

unread,
Feb 22, 2003, 2:20:39 PM2/22/03
to

"Leonblu" <leo...@infinito.it> ha scritto nel messaggio
news:2Rx5a.143828$ZE.41...@twister2.libero.it...

Nell'esempio del Sito Comune il codice VBA generato a fronte dell'evento "Su
apertura" del report serve solo a ridimensionare correttamente il disegno
dei rettangoli; è del tutto inutile intervenire su tale codice.
Potresti filtrare in maniera parametrica la query QryTimeLines, però poi ti
verrebbe restituito un errore quando viene aperto un recordset su tale query
essendo appunto parametrica: dovresti passare i parametri al momento
dell'apertura del recordset, ma significherebbe rivedere pesantemente il
codice VBA.
Per effettuare ciò che vuoi, penso che la cosa più facile è quella di creare
una tabella temporanea nella quale, con una query di creazione tabella,
registrerai solo i record che ti interessano, quindi nel report farai
riferimento ai recod di tale tabella invece che alle righe della query
QryTimeLines.

Ti suggerisco di realizzare quanto segue:

1) Creati una maschera non associata chiamata Criteri nella quale inserirai
due caselle di testo non associate chiamate rispettivamente PeriodoDal e
PeriodoAl nelle quali digiterai l'inizio e la fine del periodo
dell'elaborazione.

2) Nella maschera Criteri inserisci anche un pulsante di comando per aprire
il report ed a fronte del suo evento "Su clic" genera il seguente codice
VBA:

DoCmd.SetWarnings False
DoCmd.OpenQuery "Pippo"
DoCmd.SetWarnings True


Dim stDocName As String
stDocName = "RptTimeLines"
DoCmd.OpenReport stDocName, acViewPreview

3) Creati una query di creazione tabella chiamata Pippo e che abbia il
seguente codice SQL:

SELECT TblAssistenze.IDcliente, TblAssistenze.Importo,
TblAssistenze.PeriodoDal, TblAssistenze.PeriodoAl INTO TabPippo
FROM TblAssistenze
WHERE (((IIf([PeriodoDal] <= [Forms]![Criteri]![PeriodoDal] And [PeriodoAl]
>= [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.

Roberto da casa

unread,
Feb 23, 2003, 9:46:06 AM2/23/03
to
[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.

Leonblu

unread,
Feb 26, 2003, 9:56:25 AM2/26/03
to

"Roberto da casa" <r.ma...@libero.it> 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

Leonblu

unread,
Feb 26, 2003, 9:59:16 AM2/26/03
to

"Leonblu" <leo...@infinito.it> ha scritto nel messaggio
news:tA47a.158321$ZE.46...@twister2.libero.it...

> [CUT]

> 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

Uso Access Xp su una macchina con Windows Xp Prof.


Roberto da casa

unread,
Feb 26, 2003, 10:43:33 AM2/26/03
to

"Leonblu" <leo...@infinito.it> ha scritto nel messaggio
news:tA47a.158321$ZE.46...@twister2.libero.it...
[CUT]

>
> 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.

Cosa significa "non funziona"?
Cosa fa, o cosa non fa?
Ricordati che il codice VBA è fatto in maniera tale che se UltimaData è
minore della data odierna (vedi la routine del report Private Sub
Report_Open), essa viene forzata con la data odierna e quindi il rettangolo
blu viene giustamente disegnato nel margine destro del report.

> Mi chiedevo se nei service pack di access, sono stati corretti dei bug sui
> report .
>

Cosa sono i service pack di Access, intendi forse le varie release delle
varie edizioni?
Non lo so, ma puoi sempre verificare con Windows Update se ci sono
aggiornamenti alla versione di Access che usi.

> Salvatore

Leonblu

unread,
Feb 26, 2003, 9:54:34 PM2/26/03
to

"Roberto da casa" <r.ma...@libero.it> ha scritto nel messaggio
news:Fg57a.157451$YG2.4...@twister1.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.
>
> Cosa significa "non funziona"?
> Cosa fa, o cosa non fa?
> Ricordati che il codice VBA è fatto in maniera tale che se UltimaData è
> minore della data odierna (vedi la routine del report Private Sub
> Report_Open), essa viene forzata con la data odierna e quindi il
rettangolo
> blu viene giustamente disegnato nel margine destro del report.

Ok! Adesso mi sembra funzioni tutto! Ho solo un dubbio che ho risolto con un
trucchetto,
ma volevo imparare il sistema corretto: quando l'intervallo del report non
comprende la
data odierna, volevo rendere invisibile la striscia blu. Avevo provato a
scrivere questo ma non funziona:

If PrimaData > Date then
Me.line.visible = false
End if

Perchè non funzia?
Tra l'altro non sono riuscito a spostare la scritta PeriodoDal sul report,
in modo che sia sempre all'inizio del rettangolo della prenotazione, anche
quando
è prima di PrimaData......


'stampa data ad inizio periodo
Me.CurrentX = x1
Me.CurrentY = y2 + 50
Me.Print !PeriodoDal

dove


x1 = Me.boxMaxDays.Left + (StartDayDiff * Factor)

Considera che qualche riga sopra ho posto questa condizione:

If !PeriodoDal < PrimaData Then
StartDayDiff = -StartDayDiff

in modo tale che il rettangolo venga rappresentato prima di PrimaData e si
possa così
capire che la prenotazione inizia prima del periodo del Report.
In questo modo la data PeriodoDal è legata alla x1 e se il valore
(StartDayDiff * Factor) è
negativo uscirà dal Report; invece sembra che la condizione in cui
PeriodoDal < PrimaData
mi resistituisce la data all'inizio del Me.boxMaxDays, come se (StartDayDiff
* Factor) fosse= 0.
Non capisco!

> > Mi chiedevo se nei service pack di access, sono stati corretti dei bug
sui
> > report .
> >
>
> Cosa sono i service pack di Access, intendi forse le varie release delle
> varie edizioni?
> Non lo so, ma puoi sempre verificare con Windows Update se ci sono
> aggiornamenti alla versione di Access che usi.

Ho visto che ci sono 2 Update, ma i miei errori non erano dovuti a quello.

> 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.


Roberto da casa

unread,
Feb 27, 2003, 8:19:24 AM2/27/03
to

"Leonblu" <leo...@infinito.it> ha scritto nel messaggio
news:K5f7a.160203$ZE.47...@twister2.libero.it...

Scusa, ma Line è il metodo con cui Access disegna linee e rettangoli nei
report ed onestamente non capisco cosa significhi, come vorresti fare tu,
rendere un metodo non visibile.

Se vuoi eliminare in certi casi il rettangolo blu che rappresenta
graficamente la data odierna, condiziona con una If ... End If le ultime 8
righe di codice VBA della routine Private Sub Detail_Format con le quale
viene appunto disegnato tale rettangolo.

> Tra l'altro non sono riuscito a spostare la scritta PeriodoDal sul report,
> in modo che sia sempre all'inizio del rettangolo della prenotazione, anche
> quando
> è prima di PrimaData......
>
>
> 'stampa data ad inizio periodo
> Me.CurrentX = x1
> Me.CurrentY = y2 + 50
> Me.Print !PeriodoDal
>
> dove
> x1 = Me.boxMaxDays.Left + (StartDayDiff * Factor)
>
> Considera che qualche riga sopra ho posto questa condizione:
>
> If !PeriodoDal < PrimaData Then
> StartDayDiff = -StartDayDiff
>
> in modo tale che il rettangolo venga rappresentato prima di PrimaData e si
> possa così
> capire che la prenotazione inizia prima del periodo del Report.
> In questo modo la data PeriodoDal è legata alla x1 e se il valore
> (StartDayDiff * Factor) è
> negativo uscirà dal Report; invece sembra che la condizione in cui
> PeriodoDal < PrimaData
> mi resistituisce la data all'inizio del Me.boxMaxDays, come se
(StartDayDiff
> * Factor) fosse= 0.
> Non capisco!
>

Per dire la verità a non capire sono io; se tu hai usto il codice VBA che ti
ho suggerito nei messaggi precedenti ed in virtù di quanto generato nella
routine Private Sub Report_Open, non mi spiego proprio come tu possa avere
StartDayDiff negativo.
Per continuare il nostro dialogo avrei bisogno di sapere come precisamente è
fatto il tuo database.

[CUT]
> Salvatore.

Leonblu

unread,
Mar 3, 2003, 9:57:43 AM3/3/03
to

"Roberto da casa" <r.ma...@libero.it> ha scritto nel messaggio
news:wfo7a.161072$ZE.47...@twister2.libero.it...

[supercut]

> Scusa, ma Line è il metodo con cui Access disegna linee e rettangoli nei
> report ed onestamente non capisco cosa significhi, come vorresti fare tu,
> rendere un metodo non visibile.
>
> Se vuoi eliminare in certi casi il rettangolo blu che rappresenta
> graficamente la data odierna, condiziona con una If ... End If le ultime 8
> righe di codice VBA della routine Private Sub Detail_Format con le quale
> viene appunto disegnato tale rettangolo.

E' vero, che sciocco!
Fatto!

> 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

0 new messages