Manipulacije sa rekordsetom - rs move complete procedura
Ova procedura se izvršava pri svakom pozivu rekordseta, bilo čitanje, izmjena, filtriranje ili upis. Zato je bitno da izvršavanje koda unutar ove procedure bude kontrolisano nekom IF naredbom da se kod izvršava samo kada je to potrebno.
Private Sub rs_MoveComplete(ByVal adReason As ADODB.EventReasonEnum, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
If modus = pregled Then
'učitavanje podataka
UcitajIsplate
End If
End sub
Pretraga rekordseta
Ako je varijabla sifraart tekstualna pretraga se vrši kao u sljedećem primjeru (varijabla je unutar jednostrukih navodnika ' '):
rs.MoveFirst
rs.Find "sifart='" & sifraart & "'"
Ako se pretraga vrši po koloni koja je formatirana kao datum onda se tekst koji se traži mora formatirati kao datum (isto kao u bazi i u datagrid kontroli), a varijabla mora biti ograničena znakom #:
rsstare.Find PoKoloni & " = #" & Format(txtpretraga.Text, "d/m/yyyy") & "#", , adSearchForward
Varijabla PoKoloni je tekstualna varijabla koja predstavlja naziv polja u recordset-u po kome se vrši pretraga.
Pretraga rekordseta upisom teksta u text box
Pronalaženje u gridu teksta koji je upisan u text box, njegovo ispisivanje u taj text box i selektovanje dijela koji nije upisan.
Private Sub dgartikli_HeadClick(ByVal ColIndex As Integer)
'izbor kolone po kojoj se pretraga vrši
rssvi.Sort = dgartikli.Columns(ColIndex).DataField
kolona = dgartikli.Columns(ColIndex).DataField
If kolona = "sifraa" Then
index = 0
Else
index = 1
End If
txtpretraga.Text = ""
txtpretraga.SetFocus
End Sub
Private Sub txtpretraga_Change()
'pretraga po šifri artikla
Dim cFind As String
Dim cField As String
Dim lDesc As Boolean
If rssvi.RecordCount <> 0 Then
If Len(Trim(txtpretraga.Text)) = 0 Then
rssvi.MoveFirst
Exit Sub
End If
cField = dgartikli.Columns(index).DataField
Select Case cField
Case Is = "sifraa"
cFind = cField & " >= '" & Format(txtpretraga.Text, "000") & "'"
Case Is = "naziva"
cFind = cField & " >= '" & txtpretraga.Text & "'"
End Select
rssvi.MoveFirst
rssvi.Find cFind
If rssvi.EOF Then rssvi.MoveFirst
End If
End Sub
'drugi način, ali bez selektovanja
Prvo je potrebno u proceduru General_Declarations deklarisati varijable
Dim cfind As String
Dim nLenSearch As Long
Nakon toga, u proceduri Datagrid_HeadClick upisati:
Private Sub datagrid_HeadClick(ByVal ColIndex As Integer)
rs.Sort = datagrid.Columns(ColIndex).DataField
kolona = datagrid.Columns(ColIndex).DataField
If kolona = "sifra" Then
index = 0
Else
index = 1
End If
txtpretraga.Text = ""
txtpretraga.SetFocus
cfind = frmpretraga. datagrid.Columns(ColIndex).DataField
rs.Sort = cfind
End Sub
Private Sub txtpretraga_Change()
'pretraga po šifri ili po nazivu
If index = 0 Then
txtpretraga.MaxLength = 3
Else
txtpretraga.MaxLength = 30
End If
modus = pretraga
With rs
If .RecordCount = 0 Then Exit Sub
If txtpretraga.Text = "" Then
.MoveFirst
Exit Sub
End If
If nLenSearch < Len(Trim(txtpretraga.Text)) Then
On Error GoTo greska
.Find cfind & " LIKE '" & txtpretraga.Text & "*'", , adSearchForward
Else
On Error GoTo greska
.Find cfind & " < '" & txtpretraga.Text & "*'", , adSearchBackward
.Find cfind & " LIKE '" & txtpretraga.Text & "*'", , adSearchForward
End If
If .EOF Then .MoveLast
End With
nLenSearch = Len(Trim(txtpretraga.Text))
Exit Sub
greska:
If nLenSearch < Len(Trim(txtpretraga.Text)) Then
rs.Find cfind & " = " & txtpretraga.Text, , adSearchForward
Else
rs.Find cfind & " < " & txtpretraga.Text, , adSearchBackward
rs.Find cfind & " = " & txtpretraga.Text, , adSearchForward
End If
If rs.EOF Then rs.MoveLast
nLenSearch = Len(Trim(txtpretraga.Text))
End Sub
U Form_Load proceduri postaviti da je početna vrijednost za cFind ime neke kolone iz rekordseta rs.
Filtriranje rekordseta
Da bi se izvršilo filtriranje rekordseta po nekom uslovu potrebno je postaviti filter:
rs.MoveFirst
rs.filter = "Skladiste = '" & sifraskl & "'"
Ako je potrebno na jedan rekordset postaviti višestruki filter onda koristiti sljedeći kod
rsfilter.Filter = "pol = '" & fpol & "' And tip = '" & ftip & "'"
a moguća je i kombinacija string varijabli
filter1 = "pol = '" & fpol & "'"
filter2 = "And tip = '" & ftip & "'"
rsfilter.Filter = filter1 & filter2
Primjer sklapanja višestrukog filtera na osnovu izbora opcija filtera u drugoj formi
If Button.Key = "filter" Then
'izbor filtera
frmfilterd.Show 1
If frmfilterd.tipf = True Or frmfilterd.polf = True Or frmfilterd.godinaf = True _
Or frmfilterd.mjestorf Or frmfilterd.mjestosf = True Then
'filter po tipu diplome
If frmfilterd.tipf = True Then
filtriranje = "tip = '" & frmfilterd.ftip & "'"
End If
'filter po polu
If frmfilterd.polf = True Then
If filtriranje = "" Then
filtriranje = "pol = '" & frmfilterd.fpol & "'"
Else
filtriranje = filtriranje & " And pol = '" & frmfilterd.fpol & "'"
End If
End If
'filter po godini izdavanja diplome
If frmfilterd.godinaf = True Then
If filtriranje = "" Then
filtriranje = "godina = '" & frmfilterd.fgodina & "'"
Else
filtriranje = filtriranje & " And godina = '" & frmfilterd.fgodina & "'"
End If
End If
'filter po mjestu rođenja
If frmfilterd.mjestorf = True Then
If filtriranje = "" Then
filtriranje = "mjestor = '" & frmfilterd.fmjestor & "'"
Else
filtriranje = filtriranje & " And mjestor = '" & frmfilterd.fmjestor & "'"
End If
End If
'filter po mestu stanovanja
If frmfilterd.mjestosf = True Then
If filtriranje = "" Then
filtriranje = "mjestos = '" & frmfilterd.fmjestos & "'"
Else
filtriranje = filtriranje & " And mjestos = '" & frmfilterd.fmjestos & "'"
End If
End If
'filtriranje
rsstare.Filter = filtriranje
dgstare.Refresh
frmstarediplome.Caption = "Pregled podataka o već izdanim diplomama (FILTRIRANO - ukupno: " & rsstare.RecordCount & " )"
filtriranje = ""
Else
'poništavanje filtera
rsstare.Filter = adFilterNone
filtriranje = ""
frmstarediplome.Caption = "Pregled podataka o već izdanim diplomama (ukupno: " & rsstare.RecordCount & " )"
End If
End If
Varijable frmfilterd.tipf, frmfilterd.polf, frmfilterd.godinaf, frmfilterd.mjestorf i frmfilterd.mjestosf određuju da li je uopšte izabran neki filter, dok varijable frmfilterd.ftip, frmfilterd.fpol, frmfilterd.fgodina, frmfilterd.fmjestor i frmfilterd.fmjestos određuju vrijednost po kojoj se filtrira.
Poništavanje filtera
Poništavanje filtera vrši se na sljedeći način:
rs.filter = adFilterNone
Sortiranje rekordseta
Sortiranje rekordseta po željenoj koloni se vrši upisom:
rsartikli.Sort = "sifraa način" 'sortiranje rekordseta po koloni sifraa po abecednom redu
Ako se želi sortiranje rekordseta po koloni sifraa po abecednom redu za nacin upisati ASC, a za obrnuti redoslijed upisati DESC.
Da bi se omogućilo sortiranje po abecednom redu i obrnuto naizmjeničnim klikom na zaglavlje datagrid kontrole koristiti sljedeći kod:
If nacin = "ASC" Then
nacin = "DESC"
Else
nacin = "ASC"
End If
rsstare.Sort = PoKoloni & " " & nacin
U Form_Load proceduri postaviti da je nacin="ASC", a varijablu nacin deklarisati kao string.
Osvježavanje rekordseta
Da bi, nakon upisa novih podataka u bazu ili izmjene postojećih, dobili te podatke u rekordsetu potrebno je izvršiti osvježavanje rekordseta sa:
rs.Requery
Provjera pozicije (početak i kraj)
Da ne bi dolazilo do grešaka u toku manipulacija sa rekordsetom, zbog dostizanja početka ili kraja baze, prije izvršenaj neke akcije, potrebno je provjeriti poziciju tj. da li je dostignut kraj ili početak:
If rs.BOF Or rs.EOF Then Exit Sub
Zatvaranje rekordseta
Ako se više puta pokreće neka procedura u kojoj se otvara rekodset ili prikazuje forma u čijoj form load proceduri je otvoren rekordset, javiće se greška jer je rekordset već otvoren. Da se to spriječi potrebno je zatvoriti rekordset na kraju te procedure ili u proceduri Form_Unload te forme.
Private Sub Form_Unload(Cancel As Integer)
Set rs = Nothing
Set db = Nothing
End Sub