Buonasera e buone feste a tutto il forum.
Ho dovuto affrontare in questi giorni la stradiscussa questione dell'esigenza di interrogare tab che contengono dati che variano nel tempo.
Conservo sempre, per abitudine codice che ritengo mi possa servire anche se non nell'immediato ed in questo caso ne ho usato uno di cui non ricordo al momento l'autore, ma vado subito alla questione.
Ho trovato al momento due fattispecie:
1)Prelevo dalla Tb Storico un dato storicizzato ad una data è lo visualizzo in un controllo, lo uso in un recordset etc nel caso in specie si tratta di regimi fiscali vigenti ad una data o scelti da una ditta .
2)E' il classico caso della variazione degli indirizzi nel tempo in questo caso il dato temporale deve essere filtrato in una maschera o un report.
1° caso la TbStorico si sarebbe dovuta presentare con questi Campi:
Pk IdRegime - Regime - Dal - Al
la Tb così strutturata presenta due problemi il primo pratico nell'inserimento di un nuovo record bisogna inserire la data fine del record precedente e la data inizio del periodo successivo (sembra una questione di lana caprina ma vi garantisco che ci sono utenti capaci di tutto)
Il secondo problema riguarda soltanto l'economia del codice per stabilire qual' é il record vigente, per capirci quello che presenta un “AL” nullo
è necessaria un query (perlomeno io ho fatto così) ecco la stringa:
SELECT TbRegimi.IdRegime, TbRegimi.Regime, TbRegimi.Dal, TbRegimi.Al, IIf(IsNull([Al]),Date(),[al]) AS AData
FROM TbRegimi;
L'esigenza nasce per avere la data odierna nell' “AL” assente.
Per l'Interrogazione ho utilizzato questa Function:
Public Function RegimeFiscaleAL(TuaData As Date) As Integer
Dim rst As DAO.Recordset
Set rst = DBEngine(0)(0).OpenRecordset("QrRegimi", 2)
With rst
.FindFirst "dal<=" & CLng(CDate(TuaData)) & " And AData> " & CLng(CDate(TuaData))
If Not .NoMatch Then
RegimeFiscaleAL = .Fields("IdRegime")
Else
RegimeFiscaleAL = "0"
End If
.Close
End With
Set rst = Nothing
End Function
La chiamata della funzione è questa =RegimeFiscaleAL([DataTest])
Tutto funziona mah ho deciso che non funziona: l'inserimento delle due date è farraginosa e inutile, la query mi disturbava parecchio ed era foriera di errori:
Ho trasformato tutto cosi la TbStorico si presenta cosi
Pk IdRegime - Regime - Dal
L'inserimento è più immediato (una data) la query non giova più.
L'interrogazione avviene in questo modo è funziona:
Public Function RegimeDAL(TuaData As Date) As Integer
Dim rst As DAO.Recordset
Set rst = DBEngine(0)(0).OpenRecordset("TbRegimi", 2)
With rst
.FindLast "dal<=" & CLng(CDate(TuaData))
If Not .NoMatch Then
RegimeDAL = .Fields("IdRegime")
Else
RegimeDAL = "0"
End If
.Close
End With
Set rst = Nothing
End Function
Domanda cosa ne pensate, potrei avere qualche problema, c'è un motivo tecnico per cui si inserisce “DAL-AL”?
Saluti e grazie anticipate a chi vorrà rispondere.