Support http://amicus.ba with small donation

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