Newsgroup: it.comp.appl.access
Titolo: Come applicare tariffe diverse in un intervallo di data?

Provo a ripostare un quesito gia posto circa 20 giorni fa ancora insoluto.
Sergio Mazza diceva che il problema è risolvibile con VBA e Recordset, ed io 
da allora ci sto studiando, ma non riesco a venirne fuori.
Il problema e' che non trovo un algoritmo logico da applicare per poi 
ricavarne il codice VBA.
Qualcuno può aiutarmi?
E' davvero possibile farlo?
Mi conviene chiedere aiuto per l'algoritmo in un altro newsgroup?
Grazie
Maurizio
Riposto:
Ho necessita' di risolvere un "piccolo" problema in ACCESS
Ho un DB con 2 tabelle
La prima è composta da 2 campi data che rappresentano un intervallo 
temporale in cui e' dovuto il pagamento di una tariffa
La seconda e' composta da 2 campi data ed un campo valuta che rappresentano 
l'intervallo temporale in cui applicare la specifica tariffa giornaliera 
indicata nel campo valuta.
Il numero di record nella seconda tabella non è costante ma soggetto ad 
ulteriori inserimenti.
Ora io ho bisogno di determinare per l'intervallo della prima tabella la 
tariffa complessiva applicando per ogni periodo temporale della seconda 
tabella la relativa tariffa giornaliera
Cioe'
Tabella 1
01/01/1999   01/08/2005
01/01/2000   31/12/2005
07/04/1999   05/05/2005
....
....
Tabella 2
01/01/1998  31/12/1999   Euro 1,51
01/01/2000  31/05/2004   Euro 2,15
01/06/2005  31/12/2006   Euro 3,24
....
....
Ora io devo calcolare il totale della tariffa ad esempio nel periodo 
01/01/1999 01/08/2005 applicando le tariffe della tabella 2 quindi Euro 1,51 
al giorno nell'intervallo 01/01/1999 - 31/12/1999, Euro 2,15 al giorno 
nell'intervallo 01/01/2000 - 31/05/2004 e Euro 3,24 al giorno 
nell'intervallo 01/06/2005 - 01/08/2005.
Come faccio??
Grazie dell'aiuto...
Maurizio 

 ha scritto nel messaggio
news:44d6ea8d$0$35081$4faf...@reader4.news.tin.it...

Ciao Maurizio,
vedi un po'  se un algoritmo  del genere può andare bene, come vedi è un
algoritmo scritto in pseudo-VB
lascio a te mettere a posto sintatticamente il tutto!
Apri il recordset su tabella1
While not rs.eof
    dataInizio = rs.Fields(0)
    Datafine = rs.Fields(1)
    curdata=DataInizio
    TariffaTotale=0
    While curdata<DataFine
            TariffaTotale=GetTariffa(curdata)
            curdata=Curdata+1
   Wend
rs.movenext
wend
Chiudi il recordsdset
Function GetTariffa(data as date ) as Currency
    dim rs as Dao.recordset
    rs.Open ("Select Tariffa Form Tabella2 where " & data &  " Between
DataInizioTariffa AND DataFineTariffa")
    if not rs.eof then
        GetTariffa=rs.fields(0)
   else
        GetTariffa=0
    end if
end Function
-- 
Cinzia
---------------------------------------
|  
http://www.riolab.org
  |
--------------------------------------->

 ha scritto nel messaggio 
news:44d6ee52$0$999$5fc...@news.tiscali.it...

Grazie Cinzia
Sei stata davvero esauriente e rapida nella risposta
Quando torno dalle ferie cerco di "aggiustare" il codice e spero che 
funzioni
Grazie ancora
Ciao
Maurizio

 end Function
questa funzione non riesco a crearla, non riesco a capire come deve 
funzionare
il fatto č che non sono bravo in programmazione vba ma ho sempre errori 
oppure non funziona come dovrebbeů
un aiuto??
Grazie Maurizio 

 ha scritto nel messaggio
news:44da1945$0$988$5fc...@news.tiscali.it...

Caio Maurizio,
posta quello che hai fatto e descrivi l'errore che ottieni
Ciao



Io ho fatto in questo modo,
ma il risultato non è incoraggiante
ciao e grazie dell'aiuto
Maurizio
Nome Database db1
Tabella1
campo1 = DataArrivo
campo2 = DataPartenza
campo3 = TariffaTotale
Tabella2
campo1 = DataInizioTariffa
campo2 = DataFineTariffa
campo3 = Tariffa
Dim DataInizioTariffa As Date
   Dim DataFineTariffa As Date
   Dim dbscurrent As Database
   Dim rs As DAO.Recordset
   Dim Tariffa As Currency
   Dim datacorrente As Date
   Set rs = CurrentDb.OpenRecordset("Tabella1")
While rs.EOF = False
    DataArrivo = rs.Fields(0)
    DataPartenza = rs.Fields(1)
    Tariffa = rs.Fields(2)
    datacorrente = DataArrivo
    TariffaTotale = 0
       While datacorrente < DataPartenza
       TariffaTotale = GetTariffa(datacorrente)
       datacorrente = datacorrente + 1
       Wend
    rs.MoveNext
Wend
    rs.Close
   End Sub
Function GetTariffa(datas As Date) As Currency
    Dim rs As Recordset
    Dim DataInizioTariffa As Date
    Dim DataFineTariffa As Date
    Dim Tariffa As Currency
    rs.OpenRecordset "Select Tariffa FROM Tabella2 WHERE" & datas & "BETWEEN 
DataInizioTariffa AND DataFineTariffa"
    If Not rs.EOF Then
        GetTariffa = rs.Fields(2)
    Else
        GetTariffa = 0
    End If
End Function
in questo modo ho sempre errore in
    rs.OpenRecordset "Select Tariffa FROM Tabella2 WHERE" & datas & "BETWEEN 
DataInizioTariffa AND DataFineTariffa"
che tra l'altro è la parte che non riesco a capire come funziona
bye 

 End Function


Ciao Cinzia
Purtroppo ancora non va:
Alla esecuzione della routine i campi della tabella1 DataArrivo e 
DataPartenza si modificano e si azzerano all'anno 1900
ma di determinare la tariffa non se ne parla.
Ciao e grazie dell'interessamento..
Maurizio

 ha scritto nel messaggio
news:44db8e8f$0$35084$4faf...@reader4.news.tin.it...

Ciao Maurizio,
ehmmm  c'č qualcosa da sistemare anche nella prima parte
   Dim DataInizio as date
Dim dataFine as Date
   Dim rs As DAO.Recordset
   Dim Tariffa As Currency
   Dim datacorrente As Date
   Set rs = CurrentDb.OpenRecordset("Tabella1")
While not rs.EOF
    DataInizio = rs.Fields(0)
    DataFine = rs.Fields(1)
    datacorrente = DataInizio
   TariffaTotale = 0
       While datacorrente < DataFine
           TariffaTotale = TariffaTotale + GetTariffa(datacorrente)
           datacorrente = datacorrente + 1
       Wend
    rs.Fields(2) = tariffaTotale
    rs.Update
    rs.MoveNext
Wend
    rs.Close
   End Sub
vedi di seguire con il debug  (F9 sulla riga dove vuoi interrombere e poi F8
per seguire passo passo) cosa succede per capire eventualmente dove si
pianta o dov'č l'errore



Ciao Cinzia,
Ho riscritto (come tu dicevi) così le due routine
Dim DataInizio As Date
Dim DataFine As Date
Dim rs As DAO.Recordset
Dim Tariffa As Currency
Dim DataCorrente As Date
Set rs = CurrentDb.OpenRecordset("Tabella1")
While Not rs.EOF
    DataInizio = rs.Fields(0)
    DataFine = rs.Fields(1)
    DataCorrente = DataInizio
    Tariffa = 0
**       While DataCorrente < DataFine
       Tariffa = Tariffa + GetTariffa(DataCorrente)
       DataCorrente = DataCorrente + 1
       Wend
    rs.Edit
    rs.Fields(2) = Tariffa
    rs.Update
    rs.MoveNext
Wend
    rs.Close
    Set rs = Nothing
   End Sub
Function GetTariffa(datas As Date) As Currency
    Dim rs As Recordset
    Dim DataInizioTariffa As Date
    Dim DataFineTariffa As Date
    Dim Tariffa As Currency
    Set rs = CurrentDb.OpenRecordset("Select Tariffa FROM Tabella2 WHERE " & 
datas & " BETWEEN  DataInizioTariffa AND DataFineTariffa", dbOpenSnapshot, 
dbReadOnly)
    If Not rs.EOF Then
        GetTariffa = rs.Fields(0)
    Else
        GetTariffa = 0
    End If
    rs.Close
    Set rs = Nothing
End Function
Ora Le routine scorrono regolarmente e senza errori ma il campo Tariffa 
resta sempre uguale a zero.
Ciao e grazie dell'aiuto e della disponibilità che mi stai offrendo
ciao Maurizio


Il problema č nella funzione perchč dopo l'esecuzione di:
Set rs = CurrentDb.OpenRecordset("Select Tariffa FROM Tabella2 WHERE " & 
datas & " BETWEEN  DataInizioTariffa AND DataFineTariffa", dbOpenSnapshot, 
dbReadOnly)
il recordset non si apre e nella If Else Thenviene esguita sempre 
l'istruzione Else GetTariffa=0
    If Not rs.EOF Then
        GetTariffa = rs.Fields(0)
    Else
        GetTariffa = 0  (Viene sempre eseguita questa funzione) 


Ciao Maurizio,
bene iniziamo a circoscrivere il problema...
iniziamo a vedere se la query restituisce quello che vogliamo
vai nelle query nuova query e in visualizza SQL incolli  la select
Select Tariffa FROM Tabella2 WHERE   [datas ]   BETWEEN  DataInizioTariffa
AND DataFineTariffa
ed esegui quando ti chiede il parametro metti la data che vuoi controllare e
vediamo cosa ottieni se ottieni un valore corretto siamo a cavallo...
Tieni presente che le date devono essere passate nel formato "yyyy/mm/dd"
per cui il problema potrebbe essere questo che la data non viene
interpretatata correttamente, eventualmente prova a cambiare così nel
codice:
Set rs = CurrentDb.OpenRecordset("Select Tariffa FROM Tabella2 WHERE #" &
  Format(datas, "yyyy/mm/dd")  & "#  BETWEEN  DataInizioTariffa AND
DataFineTariffa", dbOpenSnapshot,
  dbReadOnly)
-- 


 ---------------------------------------
!!!!!!!!!!!!!!!!!!! FUNZIONA   !!!!!!!!!!!!!!!!
Grazie Cinzia
Funziona perfettamente non ci credo ma nelle prove finora fatte va 
perfettamente
Ti ringrazio moltissimo per il tempo perso "appresso" a me sei davvero bravo 
anche a spiegare perche' tutto il codice ora l'ho anche capito.
ciao e grazie ancora
Alla fine è cosi'
Nome Database db1
Tabella1
campo1 = DataArrivo
campo2 = DataPartenza
campo3 = TariffaTotale
Tabella2
campo1 = DataInizioTariffa
campo2 = DataFineTariffa
campo3 = Tariffa
Dim DataInizio As Date
Dim DataFine As Date
Dim rs As DAO.Recordset
Dim Tariffa As Currency
Dim DataCorrente As Date
Set rs = CurrentDb.OpenRecordset("Tabella1")
While Not rs.EOF
    DataInizio = rs.Fields(0)
    DataFine = rs.Fields(1)
    DataCorrente = DataInizio
    Tariffa = 0
       While DataCorrente < DataFine
       Tariffa = Tariffa + GetTariffa(DataCorrente)
       DataCorrente = DataCorrente + 1
       Wend
    rs.Edit
    rs.Fields(2) = Tariffa
    rs.Update
    rs.MoveNext
Wend
    rs.Close
    Set rs = Nothing
   End Sub
Function GetTariffa(datas As Date) As Currency
    Dim rs As Recordset
    Dim DataInizioTariffa As Date
    Dim DataFineTariffa As Date
    Dim Tariffa As Currency
   Set rs = CurrentDb.OpenRecordset("Select Tariffa FROM Tabella2 WHERE #" & 
Format(datas, "yyyy/mm/dd") & "#  BETWEEN  DataInizioTariffa AND 
DataFineTariffa", dbOpenSnapshot, dbReadOnly)
    If Not rs.EOF Then
        GetTariffa = rs.Fields(0)
    Else
        GetTariffa = 0



Ciao  Maurizio,
ci abbiamo messo un po' ma alla fine ce l'abbiamo fatta!
Grazie del feedbak.
