Home Ritorna

 

Tutorial Access - Giocare con le date

Questo caso pratico ci è stato segnalato da un utente di sviluppoisi.com. Realizzando un database di contabilità familiare si è scontrato con il seguente problema:

se viene fatto un pagamento con carta di credito la data di addebito varia in funzione della data del pagamento e delle condizioni bancarie. Come è possibile calcolare in modo automatico la data di addebito dell'importo sul conto corrente?

Abbiamo, per ovvi motivi, semplificato il database che il nostro utente ci ha mandato lasciando solo i campi necessari allo studio:

Nella maschera sopra riportata sono evidenti le condizioni che devono essere rispettate. Si noti che è sempre indicata una data superata la quale se ne deve applicare un'altra del mese successivo.

Se provate il demo allegato al tutorial vi accorgerete che messa la data del movimento, l'importo e selezionata la banca (il tipo di carta di credito) nella casella Data Scadenza compare la data voluta. Se modificate la Data Movimento la Data Scadenza viene cancellata.

Per fare quanto voluto sono sufficienti due routine VBA negli eventi Dopo Aggiornamento, ma prima abbiamo dovuto inserire nella preesistente tabella BANCA i dati Fino al e Pagare il :

Quando sceglieremo una banca nella casella combinata della maschera di contabilità il sistema leggerà i dati corrispondenti e, a titolo esemplificativo, le riporterà nelle caselle a destra che sono disabilitate.

Queste caselle dovrebbero essere non visibili ma lo sono perchè possiate verificarne il funzionamento. Voi scegliete una banca, il sistema riempie le caselle con i dati relativi, viene avviata una routine all'evento Dopo Aggiornamento che legge i dati nelle caselle, calcola la data di scadenza e la scrive nella casella corrispondente.

In realtà la routine di visual basic non è semplice per un principiante: guardatela dall'esempio.

Si noti l'utilizzo della funzione IsDate. Tale funzione risponde falso se vede che una data non è corretta. In pratica noi per calcolare un fine mese creeremo una data 31/mm/aa. Se il mese fosse febbraio la funzione IsDate segnalerebbe l'errore e noi proveremmo con un giorno in meno, ovvero 30/02/aa. Di nuovo errore e quindi 29/02/aa. Se l'anno è bisestile abbiamo finito altrimenti si prova con 28 febbraio. A questo punto la routine passa la data alla casella scadenza.
Vale lo stesso per tutti gli altri mesi.

Dim giorno As Integer, F As Integer, I As Integer
Dim gg As Integer, mm As Integer, aa As Integer, dd1 As String, dd2 As String

F = Me![Fino_Al]
I = Me![Pagare_Il]

If F = 0 Then Exit Sub
If I = 0 Then Exit Sub

giorno = Day(Me![DATA MOVIMENTO])
aa = Year(Me![DATA MOVIMENTO])
gg = I
mm = Month(Me![DATA MOVIMENTO])

If giorno > F Then GoTo Maggiore

If giorno < F Or giorno = F Then dd1 = gg & "/" & mm & "/" & aa
If IsDate(dd1) Then Me![DATA SCADENZA] = dd1: Exit Sub
dd1 = gg - 1 & "/" & mm & "/" & aa
If IsDate(dd1) Then Me![DATA SCADENZA] = dd1: Exit Sub
dd1 = gg - 2 & "/" & mm & "/" & aa
If IsDate(dd1) Then Me![DATA SCADENZA] = dd1: Exit Sub
dd1 = gg - 3 & "/" & mm & "/" & aa
If IsDate(dd1) Then Me![DATA SCADENZA] = dd1: Exit Sub

Maggiore:
If giorno > F Then gg = I
mm = (Month(Me![DATA MOVIMENTO]) + 1)
If mm = 13 Then mm = 1: aa = aa + 1

dd = gg & "/" & mm & "/" & aa
If IsDate(dd) Then Me![DATA SCADENZA] = dd: Exit Sub
dd = gg - 1 & "/" & mm & "/" & aa
If IsDate(dd) Then Me![DATA SCADENZA] = dd: Exit Sub
dd = gg - 2 & "/" & mm & "/" & aa
If IsDate(dd) Then Me![DATA SCADENZA] = dd: Exit Sub
dd = gg - 3 & "/" & mm & "/" & aa
If IsDate(dd) Then Me![DATA SCADENZA] = dd: Exit Sub

Exit Sub

Provate ad impratichirvi con l'utilizzo di visual basic e vedrete che non è poi così complicato.

 

Ritorna