Ok, po te shpjegoj c'kam modifikuar tek databaza jote (sic eshte) ne lidhje me tarifen.
Se pari, meqenese tarifat jane vlera qe te nesermen ndryshojne (aq me teper intervalet), krijova nje tabele TARIFA me atributet Tarife_ID (autonumber), KufiriPoshtem (number), KufiriSiperm (number), Tarifa (number), Aktive (Yes/No), DataEfektive, DateMbarimi. Fusha Aktive tregon nese Tarifa eshte ende efektive (pra, a aplikohet tek hyrjet e reja), apo jo. Fushat e datave jane te redesishme per arsye raportimesh financiare (per shembull, per te gjetur se cilat tarifa jane aplikuar tek nje set i dhene transaksionesh ne nje interval te dhene kohor).
Vlera KufiriPoshtem eshte e qarte. Vlera KufiriSiperm mund te jete deri ne pafundesi (psh. kur thua >1000), por meqenese pafundesia nuk eshte diskrete, me konvencion marrim vleren -1. Pra, intervali [1000, -1) do te thote ">1000". Me poshte do te tregoj se si trajtohet "-1".
Paskesaj, meqenese nje tarife is perket nje ose me shume transaksioni, shtova kolonene Tarife_ID tek tabela TRANSACTION, ne menyre qe te dime se cila tarife aplikohet tek transaksioni.
Paskesaj, krijova nje PARAMETER QUERY, qe eshte si nje stored procedure e SQL Server-it, me emrin sp_MerrTarifen (Vlera). Pra, dhene Vlera, gjej tarifen ne baze te intervalit ku bie kjo vlere. Kodi per kete query eshte ky:
Kodi:
PARAMETERS Vlera IEEEDouble;
SELECT Tarife_ID, Tarifa
FROM TARIFA
WHERE Vlera>=KufiriPoshtem
AND Vlera<IIF(KufiriSiperm=-1, Vlera+1, KufiriSiperm)
AND Aktive = TRUE;
Pra, shko tek Queries, kliko tek butoni Design, pastaj tek menuja View, kliko mbi SQL View. Aty krijohet nje query SQL.
Tani, tek procedura e mesiperme na intereson te zgjedhim tarifen dhene vlera. Sic shihet tek blloku WHERE, Vlera krahasohet me Kufirin e Poshtem, pastaj krahasohet me kufirin e siperm. Por, ne rast se nuk ka kufi te siperm (pra, ne rastin "-1"), atehere si kufi te siperm bej numrin Vlera+1, ne menyre qe te na rikthehet tarifa perkatese. Pra, nese themi qe per vlerat mbi 1000 tarifa eshte 20, atehere ne kete rast vlera>=1000 dhe vlera<1001. Ne kete menyre, na kthehet tarifa 20. Gjithesesi, kodi behet me i qarte me prova te ndryshme.
Tani, te kam krijuar dhe nje forme ne Wizard mode nga tabela TRANSACTION. Forma quhet "T_TRANSAKSIONI". Tani, hapa formen ne Design Mode dhe modifikova kodin VBA si me poshte.
Kodi:
Private Sub Vlera_Exit(Cancel As Integer)
Tarife = MerrTarifen(CDbl(Vlera.Text))
Tarifa.Locked = False
Tarifa.SetFocus
Tarifa.Text = Tarife
Tarifa.Locked = True
Tarife_ID.Locked = False
Tarife_ID.SetFocus
Tarife_ID.Text = TarifeID
Tarife_ID.Locked = True
End Sub
Private Sub Vlera_LostFocus()
If Vlera.Text = vbNullString Or Vlera.Text = "" Then
Vlera.Text = 0.1
End If
Tarife = MerrTarifen(CDbl(Vlera.Text))
End Sub
Sa here qe perdoruesi futet tek textbox-i Vlera dhe ndryshon nje vlere, ekzekutohen dy eventet e mesiperme. Funksioni MerrTarifen() eshte vene Public ne nje module, si me poshte:
Kodi:
Global Tarife As Double, TarifeID As Integer
Public Function MerrTarifen(vl As Double) As Double
Dim stProc As QueryDef, rs As Recordset, fld As New Field, db As Database
Set db = CurrentDb
Set stProc = db.QueryDefs("sp_MerrTarifen")
stProc.Parameters("Vlera") = vl
For Each fld In stProc.OpenRecordset.Fields
If fld.Name = "Tarifa" Then
MerrTarifen = fld.Value
Else
TarifeID = fld.Value
End If
Next fld
Set rs = Nothing
Set db = Nothing
End Function
Pra, sa here largohesh nga textboxi "Vlera", te ekzekutohet funksioni MerrTarifen(Vlera) dhe variablat globale Tarife dhe TarifeID ruajne perkatesisht tarifen dhe tarife_id e kthyer nga query sp_MerrTarifen. Paskesaj, keto vlera ruhen ne textbox-et perkatese ne forme.
Sic mund ta vesh re, textbox-i Tarife_ID eshte krijuar nga Wizard nga tabela TRANSACTION, por textbox-in Tarifa e shtova une sa per efekt paraqitje te tarifes. Ne te vertete, ne tabelen TRANSACTION nuk ruhet vlera e tarifes, por Tarife_ID.
Gjithesesi, po te bashkangjis databazen me ndryshimet e mesiperme. Hidhi nje sy. Bej nje prove: shto nje rekord te ri duke perdorur formen T_Transaksioni dhe shih se c'ndodh me tej. Me thuaj per ndonje gje, gabim, etj.
Krijoni Kontakt