Access: calcolo basato su periodi di tempo e inserimento di altrettanti record nella tabella

Anonimo
2010-04-20T10:34:15+00:00

Vorrei un consiglio su come poter effettuare questa operazione. Ho provato con datediff ma riesco a calcolare solo una prima parte del risultato finale. Spiego. Partendo da una data iniziale e conoscendo quella finale vorrei suddividere un importo dato in proporzione ai giorni che intercorrono tra la data iniziale e la fine di un semetre (es: 14 aprile 2010 fino 30 giugno 2010)  ma anche calcolare la parte di importo proporzionata ai semestri successivi finche non si giunge al calcolo dell'inizio dell'ultimo semetre utile fino alla data finale (continuando l'esempio di prima, periodi: 1 luglio 2010 al 31 dicembre 2010, 1 gennaio 2011 al 30 giugno, 01 luglio 2011 al 23 agosto 2011). Ogni risultato di questo frazionamento dovrebbe poi essere aggiunto in un record della tabella. Vi ringrazio in anticipo.

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2010-04-21T11:05:52+00:00

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

La risposta è stata utile?

2 persone hanno trovato utile questa risposta.
0 commenti Nessun commento

3 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2010-04-21T12:20:44+00:00

    Ciao Giorgio,

    non so che dire, avevo perso ogni speranza per riuscire ad automatizzare il processo.

    Ti ringrazio tantissimo,

    domenico

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2010-04-21T10:12:55+00:00

    Ciao Giorgio,

    grazie della risposta innanzitutto.

    Ti faccio un esempio pratico: ho una somma (€ 1000) da utilizzare dal 01/03/2010 al 30 novembre 2011. Devo sapere per ogni semestre solare (01 gennaio a 30 giugno oppure dal 01 luglio al 31 dicembre) quanta parte di quella somma posso disporre in proporzione 

    Sulla carta calcolo i giorni dal:

     I periodo  -  01/03/2010 alla fine del successivo semestre, nello specifico, 30 giugno 2010,  gg. 120 (per convenzione ogni mese è di 30 gg.)  

    II periodo -   01/07/2010 al 31/12/2010, gg. 180

    III periodo-   01/01/2011 al 30/06/2011, gg. 180

    IV periodo -  01/07/2011 al 30/11/2011, gg. 150

    Il totale giorni è di 630

    quindi moltiplicando la somma (€ 1000) per i giorni di ogni periodo ottenuti e dividendoli per i giorni totali ottengo la somma a disposizione in quel periodo:

    I periodo: 1000 * 120 / 630 =  € 190,48

    II periodo: 1000 * 180 / 630 = € 285,71

    IIIperiodo: 1000 * 180 / 630 = € 285,71

    IV periodo: 1000 * 150 / 630 = € 238,10 

    il risultato, in questo caso con quattro periodi (ma è cmq una variabile in quanto le date possono essere diverse) dovrà essere inserito in 4 nuovi record uno per ogni risultato parziale.

    Saluti 

    Domenico

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2010-04-20T18:49:03+00:00

    Ciao,

    Puoi mostrare un esempio di dati in input e il risultato che vuoi ottenere ?

    DataInizio: ??

    DataFine: ??

    Importo: ??

    Risultato:

    Data:     Importo:

    ???         ???

    ???         ???

    ???         ???

    ???         ???

    ecc.        ecc.

    Ciao

    Giorgio Rancati

    La risposta è stata utile?

    0 commenti Nessun commento