Una famiglia di sistemi di gestione per database relazionali di Microsoft progettati per semplificare l'uso.
Ciao Domenico,
ok, adesso ho capito :-)
Data una tabella di nome Partizionamento con i campi :
Data_Da (data/Ora)
Data_A (Data/Ora)
Importo (Valuta)
Eseguendo questa Sub
Sub PartizionaSemestri(ByVal Data_Da As Date, _
ByVal Data_A As Date, _
ByVal Importo As Currency)
Dim Semestre As Integer 'Semestre di partenza
Dim ImGG As Double 'Importo giornaliero
Dim Dal As Date 'Dalla Data per calcolo interno
Dim Al As Date 'Alla Data per calcolo interno
Dim SubTotale As Currency 'Subtotale per compensazione arrotondamenti su ultimo periodo
Dim Rs As DAO.Recordset 'Recordset per scrittura tabella
'Calcolo importo giornaliero
ImGG = Importo / (DateDiff("d", Data_Da, Data_A) + 1)
'Calcolo semestre di partenza
Semestre = Fix(Month(Data_Da) / 6 + 0.9999)
Dal = Data_Da
Al = DateAdd("m", 6 * Semestre, DateSerial(Year(Data_Da), 1, 0))
'Azzero la tabella
CurrentDb.Execute "DELETE * FROM Partizionamento"
'Apro il recordset
Set Rs = CurrentDb.OpenRecordset("Partizionamento", dbOpenDynaset)
'Inserisco i periodi
Do
If Al >= Data_A Then
'Se la data fine del nuovo semestre è maggiore della Data_A passta
'scrivo importo compensato e esco
Rs.AddNew
Rs!Data_Da = Dal
Rs!Data_A = Data_A
Rs!Importo = Importo - SubTotale
Rs.Update
Exit Do
End If
Rs.AddNew
Rs!Data_Da = Dal
Rs!Data_A = Al
Rs!Importo = Round(ImGG * (DateDiff("d", Dal, Al) + 1), 2)
SubTotale = SubTotale + Rs!Importo
Rs.Update
'Incremento Dal di 1 giorno
Dal = Al + 1
'Incremento il semestre
Semestre = Semestre + 1
'Calcolo Al alla data di fine del nuovo semestre
Al = DateAdd("m", 6 * Semestre, DateSerial(Year(Data_Da), 1, 0))
Loop
Rs.Close
Set Rs = Nothing
End Sub
e passando i parametri:
Data_Da = 01/03/2010
Data_Da = 30/11/2011
Importo = 1000
Si Ottiene questo risultato nella tabella
| 01/03/2010 | 30/06/2010 | 190,62 | | --- | --- | --- | | 01/07/2010 | 31/12/2010 | 287,50 | | 01/01/2011 | 30/06/2011 | 282,81 | | 01/07/2011 | 30/11/2011 | 239,07 | <tfoot></tfoot>
La leggera differenza degli importi tra il risultato e il tuo esempio è dovuta al fatto che il codice considera i giorni esatti contemplando quindi anche gli anni bisestili.
Questo permette di passare anche date che non corrispondono all'inizio e alla fine del mese, come anche riportato nel tuo post originale che mostrava:
Data_Da = 14/04/2010
Data_A = 23/08/2011
Importo = 1000
quindi con questi dati si otterrà questo risultato:
| 14/04/2010 | 30/06/2010 | 156,94 | | --- | --- | --- | | 01/07/2010 | 31/12/2010 | 370,22 | | 01/01/2011 | 30/06/2011 | 364,19 | | 01/07/2011 | 23/08/2011 | 108,65 | <tfoot></tfoot>
Ciao
Giorgio Rancati