Ad esempio:
Nome/Cognome - [Data Inizio] - [Data fine]
Mario Rossi - 23/03/2001 - 31/12/2004
Carlo Bianchi - 11/10/2001 - 31/11/2002
Aldo Verdi - 06/05/2002 - 05/05/2003
Vorrei costruirmi una maschera che indichi in automatico i seguenti valori:
____________
| |
| Scelta Anno | Anno XXXX
|____________|
__________________________________________________
1> Unità/Anno al 31/12/(XX-1) | Dato da inserire |
----------------------------------------------------------------------------
-----------
2> Corrispondenti a giorni (nel XXXX) | Dato calcolato |
----------------------------------------------------------------------------
-----------
3> 80% Giorni (nel XXXX) | Dato calcolato |
----------------------------------------------------------------------------
-----------
4> Giorni coperti (nel XXXX) ad oggi | Dato calcolato * |
----------------------------------------------------------------------------
-----------
5> Disponibilità giorni | Dato calcolato |
----------------------------------------------------------------------------
-----------
* Somma dei giorni "lavorati" da ogni persona
nell'anno di cui si visualizza la maschera.
Il problema nasce dalla differente durata dei contratti
e dal calcolo dei giorni "lavorati" nell'anno.
Nell'esempio infatti ho i primi due che lavorano nel 2001.
Dovrei calcolare i giorni in cui lavorano nel 2001, etc etc.
e poi visualizzare i dati in maschera. Così via per gli anni
successivi.
Quali passi devo fare, dalla semplice tabella iniziale,
per automatizzare il tutto in questa maschera ?
Come faccio a frazionare i tempi dei contratti in giorni/anno
per poi sommare i dati di ipotetiche colonne (campi) con tali dati ?
(Non so se sono stata chiara...ho una gran confusione
dovuta all'inesperienza)
Grazie per l'attenzione.
Anna
Ciao Anna,
mi spiace, ma non ho capito molto.
L'unica cosa che ho capito è che hai bisogno di calcolare i giorni
lavorativi nel periodo in esame.
Dovresti riuscirci utilizzando la funzione presente nel Sito Comune.
Se hai altri problemi, riscrivi chiarendo meglio cosa sono le Unità/Anno al
31/12/(XX-1), i Giorni coperti (nel XXXX) ad oggi e la Disponibilità giorni.
--
Silvio
il sito comune di it.comp.appl.access:
http://www.sitocomune.com
"Silvio Berruti" <s...@libero.it> ha scritto
>
> Ciao Anna,
> mi spiace, ma non ho capito molto.
Lo immagino ;-)...per mio difetto...........
> L'unica cosa che ho capito è che hai bisogno di calcolare i giorni
> lavorativi nel periodo in esame.
> Dovresti riuscirci utilizzando la funzione presente nel Sito Comune.
Quella sulle diff. in anni mesi e giorni ? Non penso sia quello che
cerco e cmq ti confesso che non saprei come utilizzarla (dove va inserita
una funzione ? In un modulo ? E in quale ?)
Non immagini il mio livello di "neofitismo".....:(
Ma forse ora si.
>
> Se hai altri problemi, riscrivi chiarendo meglio cosa sono le Unità/Anno
al
> 31/12/(XX-1), i Giorni coperti (nel XXXX) ad oggi e la Disponibilità
giorni.
>
Vediamo se riesco a spiegarmi.
Nell'esempio del post originario c'erano:
Nome/Cognome - [Data Inizio] - [Data fine]
Mario Rossi - 23/03/2001 - 31/12/2004
Carlo Bianchi - 11/10/2001 - 30/11/2002
Aldo Verdi - 06/05/2002 - 05/05/2003
Quindi, nel 2001 ci sono i 283 giorni di Rossi
+ gli 81 di Bianchi. (364**)
Nel 2002 i 365 di Rossi, 333 di Bianchi, 208
di Verdi. (906**)
Nel 2003 365 di Rossi e 124 di Verdi. (489**)
Nel 2004 365 di Rossi.
Nel db ci sono solo i due dati di inizio e fine,
null'altro. (Tieni presente questa cosa)
Da quei soli dati si dovrebbe, (in automatico in
una maschera con tabella dalla forma più
o meno simile a quella che ho cercato di
"disegnare" nel post precedente) ottenere
una maschera che, scegliendo l'anno con una
combo, mi presenti i dati che seguono:
Anno 2001
1> Unità/Anno al 31/12/00 | 100 Dato inserito da utente
----------------------------------------------------------------------------
2> Corrispondenti a giorni (nel 2001) | 36400 calcolato (100 * 364**)
----------------------------------------------------------------------------
3> 80% Giorni (nel 2001) | 29120 calcolato (36400*0,8)
----------------------------------------------------------------------------
E fin qui il problema sta nella scomposizione del periodo
lavorativo per ogni persona (record) in n° giorni all'anno.
Come posso ottenere questa scomposizione e
"registrarla" nel db al fine di calcolare i dati da
visualizzare nella maschera ?
Poi:
4> Giorni coperti (nel 2001) ad oggi | Dato calcolato * |
Qui il tutto diventa, per me, ancora più complesso.
Come se cercassi di aggiungere altri campi a quelli della
tbl di origine:
N/C - [Data Inizio] - [Data fine] - [Giorni 2001] - [Giorni 2002] -
ecc...
Rossi - 23/03/2001 - 31/12/2004 - 283 365
Bianchi - 11/10/2001 - 30/11/2002 - 81 333
Verdi - 06/05/2002 - 05/05/2003 - 0 208
I dati da sommare per ogni record sono
quelli dei giorni che il contratto copre in ogni anno.
Ad es. nel 2001 sono già coperti dai contratti
364 giorni, quindi ottengo per differenza il
valore 5>
----------------------------------------------------------------------------
---
5> Disponibilità giorni | Dato calcolato
>
> Se hai altri problemi, riscrivi chiarendo meglio cosa sono le Unità/Anno
al
> 31/12/(XX-1), i Giorni coperti (nel XXXX) ad oggi e la Disponibilità
giorni.
>
Spero di essere stata un po più chiara.
Anna
Prego
>
> "Silvio Berruti" <s...@libero.it> ha scritto
> >
> > Ciao Anna,
> > mi spiace, ma non ho capito molto.
>
> Lo immagino ;-)...per mio difetto...........
>
Anch'io sono duro nel capire :-D
> > L'unica cosa che ho capito è che hai bisogno di calcolare i giorni
> > lavorativi nel periodo in esame.
> > Dovresti riuscirci utilizzando la funzione presente nel Sito Comune.
>
> Quella sulle diff. in anni mesi e giorni ? Non penso sia quello che
> cerco e cmq ti confesso che non saprei come utilizzarla (dove va inserita
> una funzione ? In un modulo ? E in quale ?)
No, pensavo a "Conteggio dei giorni lavorativi tra due date" di G. Paolo
Bizzaro e Silvio Mazzetto: la puoi inserire in un modulo e richiamarla come
se fosse una funzione predefinita di Access.
> Non immagini il mio livello di "neofitismo".....:(
> Ma forse ora si.
>
> >
> > Se hai altri problemi, riscrivi chiarendo meglio cosa sono le Unità/Anno
> al
> > 31/12/(XX-1), i Giorni coperti (nel XXXX) ad oggi e la Disponibilità
> giorni.
> >
>
> Vediamo se riesco a spiegarmi.
>
> Nell'esempio del post originario c'erano:
>
> Nome/Cognome - [Data Inizio] - [Data fine]
> Mario Rossi - 23/03/2001 - 31/12/2004
> Carlo Bianchi - 11/10/2001 - 30/11/2002
> Aldo Verdi - 06/05/2002 - 05/05/2003
>
>
> Quindi, nel 2001 ci sono i 283 giorni di Rossi
> + gli 81 di Bianchi. (364**)
> Nel 2002 i 365 di Rossi, 333 di Bianchi, 208
> di Verdi. (906**)
> Nel 2003 365 di Rossi e 124 di Verdi. (489**)
> Nel 2004 365 di Rossi.
>
> Nel db ci sono solo i due dati di inizio e fine,
> null'altro. (Tieni presente questa cosa)
OK
Supponiamo che la tua tabella con queste date si chiami T_Contratti e che
abbia i campi [NomeUt], [DataInizio] e [DataFine];
supponiamo che nella maschera [F_Calcoli] tu abbia un controllo [Anno] x
scegliere l'anno, un controllo [Unità], un controllo [Corrisp], un controllo
[ottantapercento], un controllo [Coperti] e un controllo [Disponibilità].
> Da quei soli dati si dovrebbe, (in automatico in
> una maschera con tabella dalla forma più
> o meno simile a quella che ho cercato di
> "disegnare" nel post precedente) ottenere
> una maschera che, scegliendo l'anno con una
> combo, mi presenti i dati che seguono:
>
> Anno 2001
>
> 1> Unità/Anno al 31/12/00 | 100 Dato inserito da utente
> --------------------------------------------------------------------------
--
> 2> Corrispondenti a giorni (nel 2001) | 36400 calcolato (100 * 364**)
su dopo aggiornamento di [Unità] puoi inserire una procedura evento tipo:
Private Sub Unità_AfterUpdate()
Dim gg As Integer, quanti As Long, i As Long, tgg As Long
Dim Inizio As Date, Fine As Date, cop As Long
Dim dbs As Database, rst As Recordset
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("T_Contratti", dbOpenDynaset)
rst.MoveLast: rst.MoveFirst
quanti = rst.RecordCount
For i = 1 To quanti
Inizio = rst("DataInizio")
Fine = rst("DataFine")
If Year(Inizio) = Year(CDate("01/01/" & Me.Anno)) Then
gg = ContaLavorativi(Inizio, CDate("31/12/" & Me.Anno), True)
ElseIf Year(Fine) = Year(CDate("01/01/" & Me.Anno)) Then
gg = ContaLavorativi(CDate("31/12/" & Me.Anno), Fine, True)
ElseIf Year(Inizio) < Year(CDate("01/01/" & Me.Anno)) And Year(Fine) >
Year(CDate("01/01/" & Me.Anno)) Then
gg = ContaLavorativi(CDate("01/01/" & Me.Anno), CDate("31/12/" &
Me.Anno), True)
Else
gg = 0
End If
tgg = tgg + gg
If Inizio < Date Then
If Inizio < CDate("01/01/" & Year(Date)) Then
cop = cop + ContaLavorativi(CDate("01/01/" & Year(Date)), Date,
True)
Else
cop = cop + ContaLavorativi(Inizio, Date, True)
End If
End If
rst.MoveNext
Next
Me.Corrisp = Me.Unità * tgg
Me.ottantapercento = Me.Corrisp * 0.8
Me.Coperti = cop
End Sub
> --------------------------------------------------------------------------
--
> 3> 80% Giorni (nel 2001) | 29120 calcolato (36400*0,8)
vedi sopra
> --------------------------------------------------------------------------
--
>
> E fin qui il problema sta nella scomposizione del periodo
> lavorativo per ogni persona (record) in n° giorni all'anno.
> Come posso ottenere questa scomposizione e
> "registrarla" nel db al fine di calcolare i dati da
> visualizzare nella maschera ?
Perché registrarla?
>
> Poi:
>
> 4> Giorni coperti (nel 2001) ad oggi | Dato calcolato * |
vedi sopra
>
> Qui il tutto diventa, per me, ancora più complesso.
>
> Come se cercassi di aggiungere altri campi a quelli della
> tbl di origine:
>
> N/C - [Data Inizio] - [Data fine] - [Giorni 2001] - [Giorni
2002] -
> ecc...
> Rossi - 23/03/2001 - 31/12/2004 - 283 365
> Bianchi - 11/10/2001 - 30/11/2002 - 81 333
> Verdi - 06/05/2002 - 05/05/2003 - 0 208
>
>
> I dati da sommare per ogni record sono
> quelli dei giorni che il contratto copre in ogni anno.
> Ad es. nel 2001 sono già coperti dai contratti
> 364 giorni, quindi ottengo per differenza il
> valore 5>
e qui non ci sono + io.
Cioè, vorresti sapere la somma dei giorni lavorativi ancora da lavorare
nell'anno XXXX?
>
> --------------------------------------------------------------------------
--
> ---
> 5> Disponibilità giorni | Dato calcolato
>
> >
> > Se hai altri problemi, riscrivi chiarendo meglio cosa sono le Unità/Anno
> al
> > 31/12/(XX-1), i Giorni coperti (nel XXXX) ad oggi e la Disponibilità
> giorni.
> >
>
>
> Spero di essere stata un po più chiara.
Sì, ma chiariscimi ancora l'ultimo punto.
Ciao
>
> OK
> Supponiamo che la tua tabella con queste date si chiami T_Contratti e che
> abbia i campi [NomeUt], [DataInizio] e [DataFine];
> supponiamo che nella maschera [F_Calcoli] tu abbia un controllo [Anno] x
> scegliere l'anno, un controllo [Unità], un controllo [Corrisp], un
controllo
> [ottantapercento], un controllo [Coperti] e un controllo [Disponibilità].
>
> su dopo aggiornamento di [Unità] puoi inserire una procedura evento tipo:
>
> Private Sub Unità_AfterUpdate()
> Dim gg As Integer, quanti As Long, i As Long, tgg As Long
> Dim Inizio As Date, Fine As Date, cop As Long
> Dim dbs As Database, rst As Recordset
> Set dbs = CurrentDb
> Set rst = dbs.OpenRecordset("T_Contratti", dbOpenDynaset)
> rst.MoveLast: rst.MoveFirst
> quanti = rst.RecordCount
> For i = 1 To quanti
> Inizio = rst("DataInizio")
> Fine = rst("DataFine")
> If Year(Inizio) = Year(CDate("01/01/" & Me.Anno)) Then
> gg = ContaLavorativi(Inizio, CDate("31/12/" & Me
**).Anno(***) ) , True)
evidenziandomi in blu dal punto alla "o" di Anno e dicendomi
"Errore di compilazione, sub o function non definita"
> ElseIf Year(Fine) = Year(CDate("01/01/" & Me.Anno)) Then
> gg = ContaLavorativi(CDate("31/12/" & Me.Anno), Fine, True)
> ElseIf Year(Inizio) < Year(CDate("01/01/" & Me.Anno)) And Year(Fine) >
> Year(CDate("01/01/" & Me.Anno)) Then
> gg = ContaLavorativi(CDate("01/01/" & Me.Anno), CDate("31/12/" &
> Me.Anno), True)
> Else
> gg = 0
> End If
> tgg = tgg + gg
> If Inizio < Date Then
> If Inizio < CDate("01/01/" & Year(Date)) Then
> cop = cop + ContaLavorativi(CDate("01/01/" & Year(Date)), Date,
> True)
> Else
> cop = cop + ContaLavorativi(Inizio, Date, True)
> End If
> End If
> rst.MoveNext
> Next
> Me.Corrisp = Me.Unità * tgg
> Me.ottantapercento = Me.Corrisp * 0.8
> Me.Coperti = cop
> End Sub
>
Sto provando a tamponare con una serie infinita di query di selezione con
criteri
ma, dopo aver isolato i contratti che hanno, ad es., almeno un giorno di
lavoro
previsto nell'anno definito, non riesco a imporgli un efficace conteggio dei
giorni
(se non con altri campi di qry con espressioni...ma che fatica e che
vergogna !)
Anna
>
> OK
> Supponiamo che la tua tabella con queste date si chiami T_Contratti e che
> abbia i campi [NomeUt], [DataInizio] e [DataFine];
> supponiamo che nella maschera [F_Calcoli] tu abbia un controllo [Anno] x
> scegliere l'anno, un controllo [Unità], un controllo [Corrisp], un
controllo
> [ottantapercento], un controllo [Coperti] e un controllo [Disponibilità].
>
> su dopo aggiornamento di [Unità] puoi inserire una procedura evento tipo:
>
> Private Sub Unità_AfterUpdate()
> Dim gg As Integer, quanti As Long, i As Long, tgg As Long
> Dim Inizio As Date, Fine As Date, cop As Long
> Dim dbs As Database, rst As Recordset
> Set dbs = CurrentDb
> Set rst = dbs.OpenRecordset("T_Contratti", dbOpenDynaset)
> rst.MoveLast: rst.MoveFirst
> quanti = rst.RecordCount
> For i = 1 To quanti
> Inizio = rst("DataInizio")
> Fine = rst("DataFine")
> If Year(Inizio) = Year(CDate("01/01/" & Me.Anno)) Then
> gg = ContaLavorativi(Inizio, CDate("31/12/" & Me
**).Anno(***) ) , True)
evidenziandomi in blu dal punto alla "o" di Anno e dicendomi
"Errore di compilazione, sub o function non definita"
> ElseIf Year(Fine) = Year(CDate("01/01/" & Me.Anno)) Then
> gg = ContaLavorativi(CDate("31/12/" & Me.Anno), Fine, True)
> ElseIf Year(Inizio) < Year(CDate("01/01/" & Me.Anno)) And Year(Fine) >
> Year(CDate("01/01/" & Me.Anno)) Then
> gg = ContaLavorativi(CDate("01/01/" & Me.Anno), CDate("31/12/" &
> Me.Anno), True)
> Else
> gg = 0
> End If
> tgg = tgg + gg
> If Inizio < Date Then
> If Inizio < CDate("01/01/" & Year(Date)) Then
> cop = cop + ContaLavorativi(CDate("01/01/" & Year(Date)), Date,
> True)
> Else
> cop = cop + ContaLavorativi(Inizio, Date, True)
> End If
> End If
> rst.MoveNext
> Next
> Me.Corrisp = Me.Unità * tgg
> Me.ottantapercento = Me.Corrisp * 0.8
> Me.Coperti = cop
> End Sub
>
... ma hai inserito in un modulo le funzioni presenti sul Sito Comune come
ti avevo detto?
copiato il tuo codice nell'evento "Dopo Aggiornamento"
Il tutto funziona (ovviamente...non l'ho partorito io !)
ma non coglie ancora ciò che cercavo.
Ho modificato (non so se ho capito male io il "tgg":
Me.Corrisp = Me.Unità * tgg
In:
Me.Corrisp = Me.Unità * 365
e ottengo il dato (2>) che cerco: numero unità X 365 = giorni/anno MAX
Con:
Me.ottantapercento = Me.Corrisp * 0.8
ottengo il dato (3>) che mi serve nella differenza successiva.
Devo a questo punto dirti che il dato più importante è
l'ultimo (5> Disponibilità) ma difficile e focale è il
"4> Giorni coperti nel XXXX", quello arduo da calcolare.
I conti in Excel sono facili: immaginando un wksht e facendo
i calcoli a mano
Nome/Cognome - [Data Inizio] - [Data fine] - [gg2001] - [gg2002] -
[gg2003] - [gg2004] - ecc
1) Mario Rossi - 23/03/2001 - 31/12/2004 283 365
365 365
2) Carlo Bianchi - 11/10/2001 - 30/11/2002 81 333
0 0
3) Aldo Verdi - 06/05/2002 - 05/05/2003 208
124
somma gg 364
906 489 365
e le varie cifre "somma gg" sono le cifre del dato (4>) che, a seconda
dell'anno scelto da una combo, vorrei mi apparissero in automatico.
Il dato (5>) è la differenza ("3>" - "4>")
Ma fare la stessa cosa in Access automatizzando tutto
è il fulcro del 3d !
Un saluto, Anna
Vedi Anna, il punto è che non ho capito che cosa vuoi fare esattamente, nel
senso che non ho idea di quale sia la partenza del ragionamento e la fine.
tgg è una variabile che va a sommare i giorni lavorativi di tutte le persone
nell'anno scelto.
> Ho modificato (non so se ho capito male io il "tgg":
> Me.Corrisp = Me.Unità * tgg
> In:
> Me.Corrisp = Me.Unità * 365
>
> e ottengo il dato (2>) che cerco: numero unità X 365 = giorni/anno MAX
Se hai bisogno che il valore massimo di tgg sia 365 modifica così
If tgg > 365 Then tgg=365
Me.Corrisp = Me.Unità * tgg
>
> Con:
> Me.ottantapercento = Me.Corrisp * 0.8
> ottengo il dato (3>) che mi serve nella differenza successiva.
>
> Devo a questo punto dirti che il dato più importante è
> l'ultimo (5> Disponibilità) ma difficile e focale è il
> "4> Giorni coperti nel XXXX", quello arduo da calcolare.
>
>
> I conti in Excel sono facili: immaginando un wksht e facendo
> i calcoli a mano
>
> Nome/Cognome - [Data Inizio] - [Data fine] - [gg2001] - [gg2002] -
> [gg2003] - [gg2004] - ecc
> 1) Mario Rossi - 23/03/2001 - 31/12/2004 283 365
> 365 365
> 2) Carlo Bianchi - 11/10/2001 - 30/11/2002 81 333
> 0 0
> 3) Aldo Verdi - 06/05/2002 - 05/05/2003
208
> 124
>
> somma gg 364
> 906 489 365
>
> e le varie cifre "somma gg" sono le cifre del dato (4>) che, a seconda
> dell'anno scelto da una combo, vorrei mi apparissero in automatico.
>
> Il dato (5>) è la differenza ("3>" - "4>")
Chiariscimi qualche dubbio.
Sono partito con il considerare che questi Sigg. abbiano stipulato dei
contratti di lavoro x periodi anche superiori ad un anno (calciatori? Piloti
F1? Rappresentanti? Franchisee?) e che tu voglia calcolare:
a) la somma dei giorni lavorativi di tutti i contratti riferiti all'anno
scelto (max 365?);
b) l'80% di a);
c) la somma dei giorni già lavorati di tutti i Sigg. nell'anno scelto;
d) la disponibilità intesa come differenza tra b) e c).
Sto toppando su tutta la linea?
Giusto.(CMQ...semplicemente dipendenti di una società.
Se fossero calciatori o piloti di F1 anche io sarei pagata bene !)
> e che tu voglia calcolare:
> a) la somma dei giorni lavorativi di tutti i contratti riferiti all'anno
> scelto (max 365?);
Il dato 1> è immesso dall'utente.
Il dato 2> calcola il n° di "giorni potenziali" ((dato1>)*365)).
100 dipendenti * 365 gg = 36500 gg disponibili
"lavorabili" per la società
Non c'è un MAX.
> b) l'80% di a);
esatto.
Il dato 3> è il N° di giorni "lavorabili" realmente disponibili.
> c) la somma dei giorni già lavorati di tutti i Sigg. nell'anno scelto;
Il dato 4> E' la somma dei giorni che la società ha già "definito" come
"lavorati"
tramite i contratti.
2001 2002 2003 2004
I famosi 364 - 906 - 489 - 365 dell'esempio.
Il dato fulcro del problema, insomma.
> d) la disponibilità intesa come differenza tra b) e c).
Si. Il dato 5> è = ((Dato 4>) - (Dato 3>)).
Dato che rappresenta i gg "lavorabili" ancora non assegnati
da alcun contratto.
Ciao, Anna.
Ora comincio a capire qualcosa! ;-))
> > e che tu voglia calcolare:
> > a) la somma dei giorni lavorativi di tutti i contratti riferiti all'anno
> > scelto (max 365?);
>
> Il dato 1> è immesso dall'utente.
> Il dato 2> calcola il n° di "giorni potenziali" ((dato1>)*365)).
o *366 se l'anno fosse bisestile
>
> 100 dipendenti * 365 gg = 36500 gg disponibili
> "lavorabili" per la società
> Non c'è un MAX.
OK
> > b) l'80% di a);
>
> esatto.
OK
Tieni presente che, anziché calcolare in modo approssimato, potresti
utilizzare la funzione ContaLavorativi() x sapere esattamente in quell'anno
quanti giorni feriali ci siano, a cui togliere, eventualmente, i periodi di
ferie.
> Il dato 3> è il N° di giorni "lavorabili" realmente disponibili.
>
>
> > c) la somma dei giorni già lavorati di tutti i Sigg. nell'anno scelto;
>
> Il dato 4> E' la somma dei giorni che la società ha già "definito" come
> "lavorati"
> tramite i contratti.
>
> 2001 2002 2003 2004
> I famosi 364 - 906 - 489 - 365 dell'esempio.
>
> Il dato fulcro del problema, insomma.
Quindi è + facile di come la facevo (ho aggiunto qualche commento x renderti
+ facile seguire il mio ragionamento, spero)
su dopo aggiornamento di [Unità] puoi inserire una procedura evento tipo:
Private Sub Unità_AfterUpdate()
Dim gg As Integer, quanti As Long, i As Long, tgg As Long
Dim Inizio As Date, Fine As Date
Dim dbs As Database, rst As Recordset
Set dbs = CurrentDb
' apro con rst la tabella T_Contratti (mi si passi il termine)
Set rst = dbs.OpenRecordset("T_Contratti", dbOpenDynaset)
' e conto quanti contratti ci sono
rst.MoveLast: rst.MoveFirst
quanti = rst.RecordCount
' quindi, partendo dal 1°, per ciascuno...
For i = 1 To quanti
' leggo le date di inizio e di fine contratto
Inizio = rst("DataInizio")
Fine = rst("DataFine")
' calcolo i giorni lavorativi
If Year(Inizio) = Year(CDate("01/01/" & Me.Anno)) Then
' se l'anno in esame è quello di inizio, il n° dei gg lavorativi è
' dato da quanti gg ci sono da inizio al 31/12
gg = ContaLavorativi(Inizio, CDate("31/12/" & Me.Anno), True)
ElseIf Year(Fine) = Year(CDate("01/01/" & Me.Anno)) Then
' se l'anno in esame è quello di fine, il n° dei gg lavorativi è
' dato da quanti gg ci sono dal 1/1 a fine
gg = ContaLavorativi(CDate("31/12/" & Me.Anno), Fine, True)
ElseIf Year(Inizio) < Year(CDate("01/01/" & Me.Anno)) And Year(Fine) >
Year(CDate("01/01/" & Me.Anno)) Then
' se l'anno cade all'interno del periodo, i giorni sono quelli feriali
gg = ContaLavorativi(CDate("01/01/" & Me.Anno), CDate("31/12/" &
Me.Anno), True)
Else
' se l'anno è fuori del periodo i giorni sono 0
gg = 0
End If
' sommo il n° di gg ottenuti con i precedenti
tgg = tgg + gg
' e passo al prossimo
rst.MoveNext
Next
' il risultato lo scrivo nel controllo
Me.Coperti = tgg
End Sub
Nota che ho sempre usato la funzione ContaLavorativi x calcolare esattamente
il n° dei giorni feriali; se tu volessi solo il calcolo dei giorni tra 2
date senza distinguere i feriali dai festivi, sostituisci ContaLavorativi
con la funzione DateDiff() presente in Access
es.: DateDiff("d", dalladata, alladata)
Inoltre in ContaLavorativi ho usato la settimana corta:
ContaLavorativi( inizio, fine, True)
senza settimana corta:
ContaLavorativi( inizio, fine, False)
>
>
> > d) la disponibilità intesa come differenza tra b) e c).
>
> Si. Il dato 5> è = ((Dato 4>) - (Dato 3>)).
>
> Dato che rappresenta i gg "lavorabili" ancora non assegnati
> da alcun contratto.
nell'origine controllo di [Disponibilità] scrivi
= [ottantapercento] - [Coperti]
Ciao
> Private Sub Unità_AfterUpdate()
> Dim gg As Integer, quanti As Long, i As Long, tgg As Long
> Dim Inizio As Date, Fine As Date
> Dim dbs As Database, rst As Recordset
> Set dbs = CurrentDb
> ' apro con rst la tabella T_Contratti (mi si passi il termine)
> Set rst = dbs.OpenRecordset("T_Contratti", dbOpenDynaset)
> ' e conto quanti contratti ci sono
> rst.MoveLast: rst.MoveFirst
> quanti = rst.RecordCount
> ' quindi, partendo dal 1°, per ciascuno...
> For i = 1 To quanti
> ' leggo le date di inizio e di fine contratto
> Inizio = rst("DataInizio")
> Fine = rst("DataFine")
> ' calcolo i giorni lavorativi
> If Year(Inizio) = Year(CDate("01/01/" & Me.Anno)) Then
> ' se l'anno in esame è quello di inizio, il n° dei gg lavorativi è
> ' dato da quanti gg ci sono da inizio al 31/12
> gg = ContaLavorativi(Inizio, CDate("31/12/" & Me.Anno), True)
> ElseIf Year(Fine) = Year(CDate("01/01/" & Me.Anno)) Then
> ' se l'anno in esame è quello di fine, il n° dei gg lavorativi è
> ' dato da quanti gg ci sono dal 1/1 a fine
> gg = ContaLavorativi(CDate("31/12/" & Me.Anno), Fine, True)
gg = ContaLavorativi(CDate("01/01/" & Me.Anno), Fine, True)
> ElseIf Year(Inizio) < Year(CDate("01/01/" & Me.Anno)) And Year(Fine) >
> Year(CDate("01/01/" & Me.Anno)) Then
> ' se l'anno cade all'interno del periodo, i giorni sono quelli feriali
> gg = ContaLavorativi(CDate("01/01/" & Me.Anno), CDate("31/12/" &
> Me.Anno), True)
> Else
> ' se l'anno è fuori del periodo i giorni sono 0
> gg = 0
> End If
> ' sommo il n° di gg ottenuti con i precedenti
> tgg = tgg + gg
> ' e passo al prossimo
> rst.MoveNext
> Next
> ' il risultato lo scrivo nel controllo
> Me.Coperti = tgg
> End Sub
--
Ti ringrazio infinitamente della gentilezza e della disponibilità.
Anna
ps. Dimmi...le prendi come delle piccole sfide tutto sommato divertenti ?
Questa è la sensazione che ho io quando devo aiutare qualcuno
in qualcosa che conosco bene.
prego, prego...
>
> Anna
>
>
> ps. Dimmi...le prendi come delle piccole sfide tutto sommato divertenti ?
> Questa è la sensazione che ho io quando devo aiutare qualcuno
> in qualcosa che conosco bene.
certamente!
Dopo aver scoperto questo mare di informazioni, ho imparato a leggermi tutti
i thread x vedere cosa e come era stata data una risposta, poi ho cominciato
a rispondere anch'io e ho scoperto un divertimento nuovo a cui non rinuncio,
compatibilmente con il tempo disponibile.