Jak použít recordset k třídění čehokoliv(Martin Vobr, publikováno ve Světě Namodro) V ASPéčkých aplikacích potřebujeme často vypisovat setříděná různá data. Pokud jsou data v relační databázi tak není žádný problém, stačí použít něco podobného jako SELECT NAME, PHONE ORDER BY NAME a je vymalováno. Jiný případ nastane pokud data v relační databázi nejsou. Například když potřebuju setřídit telefonní seznam podle oddělení a jmen vybíraný z Exchange Serveru, výpis souborů v adresáři podle data modifikace, počítače v Active Directory podle jejich názvu. V céčku by to bylo snadné, vytvořím si strukturu nebo třídu, načtu do ní data a pole setřídím quick sortem se standardní knihovny. Jak na podobný problém v ASPéčkách? Psát obecný třídicí algoritmus nad polem nebo nad kolekcí je jednak neefektivní, jednak zbytečné. Docela snadno je totiž možné do ADODB.Recordsetu ukládat a třídit data, která vůbec v relační databázi nejsou. Umožňují to dvě vlastnosti ADO: odpojené recordsety a podpora pro řazení klientských recordsetů. Řazení client-side recordsetů Obvyklý způsob jak získat setříděnou sadu dat je říct si o ně databázovému serveru klauzulí ORDER BY příkazu SELECT. Pokud ale z jakýchkoliv důvodů se z databázovým serverem nechci nebo nemůžu bavit nabízí se property Sort objektu ADODB.Recordset. Property Sort obsahuje seznam názvů sloupců podle kterých se má třídit oddělených čárkou. Setřídění provedeme pouhým přiřazením nové hodnoty (spolehlivě to ale funguje pouze u client-side recordsetů) například takto: rs.Sort = "FirstName asc, LastName desc" Výše uvedený příklad setřídí recordset podle křestního jména vzestupně a podle příjmení sestupně. Nic víc už není potřeba. Odpojený recordset Do recordsetu ale musíme nejdříve nějaká data dostat. Řešením je odpojený recordset. Odpojený (neboli unbound) recordset se chová ve většině ohledů jako normální recordset. Vzniknout může klasicky databázovým dotazem, a následným odpojením, nebo se vytvoří jen v paměti, naplní se ručně a s databází nepřijde vůbec nikdy do styku. Odpojený recordset vznikne například takto:
dim rs, i
on error resume next
' vytvor recordset
set rs = Server.CreateObject ("ADODB.Recordset")
rs.ActiveConnection = nothing ' odpojeny recordset
rs.CursorLocation = 3 ' = adUseClient
' pridej sloupce
' 200 = adVarChar, 255 je max delka ve znacich
rs.Fields.Append "FirstName", 200,255
rs.Fields.Append "LastName", 200,255
rs.Fields.Append "TelephoneNumber", 200,255
' otevri recorset
rs.Open ' napln testovacimi daty
for i = 1 to 10
rs.AddNew
rs.Fields("FirstName")= "Hugo_" & i
rs.Fields("LastName") = i & "_Ksandicka"
rs.Fields("TelephoneNumber") = i
rs.Update
next
Příklad: telefonní seznam via ADSI Protože nejlepší příklady jsou ty, které se dají hned použít máme tu script, který naplní recordset údaji o jménech a telefonech uživatelů uložených v Exchange Serveru via LDAP. Script je skutečně jen příklad, protože pro LDAP v Exchange serveru existuje i OLEDB driver, takže jde otevřít i přímo jako recordset.
'@bsub ziska recordset plny udaju
' o uzivatelich z LDAPu
'@bparm cisty, prave vytvoreny ADODB.Recordset
'@bparm LDAP cesta k uzivatelum, treba
' LDAP://server/o=organizace/
' ou=organizacniJednotka/cn=Recipients
sub FillAddressRecordset(rs, strDomainPath)
dim objDs, objUser
on error resume next
rs.ActiveConnection = nothing
rs.CursorLocation = 3 ' = adUseClient
rs.LockType = 4
' 200 = adVarChar, 255 je max delka ve znacich
rs.Fields.Append "FirstName", 200,255
rs.Fields.Append "LastName", 200,255
rs.Fields.Append "Email", 200,255
rs.Fields.Append "TelephoneNumber", 200,255
rs.Fields.Append "TelephoneHome", 200,255
rs.Fields.Append "FaxNumber", 200,255
rs.Fields.Append "Mobile", 200,255
rs.Fields.Append "Department", 200,255
rs.Fields.Append "AdsPath", 200,255
rs.Open
set objDs=GetObject(strDomainPath)
for each objUser in objDs
if (objUser.Class=EXCHANGE_GROUP) then
rs.AddNew
rs.Fields("LastName")= objUser.LastName
rs.Fields("FirstName")= objUser.FirstName
rs.Fields("Email")= GetEmail(objUser)
rs.Fields("TelephoneNumber")= _
objUser.TelephoneNumber
rs.Fields("TelephoneHome")= _
objUser.TelephoneHome
rs.Fields("FaxNumber")= objUser.FaxNumber
rs.Fields("Mobile")= objUser.Mobile
rs.Fields("TelephoneNumber")= _
objUser.TelephoneNumber
rs.Fields("OfficeLocations")= _
objUser.OfficeLocations
rs.Fields("Department")= objUser.Department
rs.Fields("AdsPath")=objUser.AdsPath
rs.Update
end if
next
end sub
' vlastni vypis:
set rs = CreateObject ("adodb.recordset")
FillAddressRecordset rs, _
"sem_prijde_validni_LDAP_cesta"
' setrid ho podle prijmeni, jmena
rs.Sort = "LastName asc, FirstName asc"
'vypis vysledky
do while not rs.eof
response.write ...
rs.movenext
loop
|