« Prethodna stranica Page — Sledeća stranica »
Software
Kako dobiti svaki n-ti slog iz tabele?
17.05.2007
Kako da vam upit vrati svaki n-ti slog iz tabele, recimo svaki 5 ili svaki 10 slog
Ovde je prikazan upit koji vraća svaki n-ti slog iz tabele. Na ovaj način se iz tabele uzimaju slogovi na istom rastojanju, ali ne možete početi u bilo kojem slogu, na primer možete dobiti 1., 5. i 9. ili 2., 6. i 10. slog ako je razmak između slogova 4. Prvo, kreirajte novu funkciju:
Function PlusJedan (var As Variant)
Static i As Integer
i = i + 1
PlusJedan = i
End Function
Potom, kreirajte upit. Postavite polja koja želite da vidite u upitu. Dodajte jednu ili više kolona u upit, sa ovom osobinom:
Field Expr1: PlusJedan([MojePolje]) Mod 5
Show No
Criteria 0
Možete koristiti bilo koje polje umesto “MojePolje” — nije bitno koje koristite. Ako želite svaki 7. podatak, koristite Mod 7, za svaki 10. podatak, koristite Mod 10, i tako dalje. ![]()
Parametarski upiti
17.05.2007
Podaci koje vraćaju upiti ne moraju uvek biti statični, upiti se mogu prilagođavati u vreme upita
Podaci koje vraćaju upiti iz baze podataka ne moraju uvek biti statički, odnosno ne moraju se uvek vraćati isti podaci. Upiti se mogu prilagođavati u vreme izvršenja, tako što korisnik unosi kriterijum za pretraživanje u specijalnom okviru za dijalog. Ako želite da zadajete uslove pretraživanja u trenutku pokretanja upita, koristite patrametarske upite koji su u suštini isti kao i upiti za izbor , s tim što će Access zahtevati od vas da unesete jedan ili više kriterijuma za izbor pre nego što se upit pokrene.
Naročito se koriste za dobijanje informacija o nekim aktivnostima obavljenim u određenom vremenskom periodu, na primer, o rezultatima prodaje u u jednom mesecu ili o nalozima za određeni period. Upit može imati parametara koliko vam je potrebno, a korisnik će ih unositi jedan po jedan. Parametar se može ubaciti u svako polje u kojem možete da zadate kriterijum u vrsti Criteria i u skoro sve tipove upita , pa i akcioni. Param. upiti se mogu kreirati u mreži za kreiranje upita, uz pomoć SQL upita ili u okviru osobine Record Source neke forme ili izveštaja.
Da biste kreirali parametarski upit, počnite sa običnim upitom za izbor i, umesto da unosite kriterijum u ćeliju Criteria, unesite tekst koji želite da se pojavi kao odziv tj. tekst koji će se pojaviti u dijalogu kriterijuma (tekst treba da bude u zagradama). Ovaj tekst treba da pruža dovoljno informacija korisniku šta se od njega traži.
Parametarski upiti se takođe mogu koristiti za pronalaženje zapisa sa nizom vrednosti, kao što je neki vremenski period. Na primer možete prikazati radne naloge u vašoj firmi koji su počeli da se ostvaruju u toku juna. Da biste ovo uradili, postavite parametar Between … and … u vrsti Criteria nekog vašeg datumskog polja. I dobićete sve zapise tj. naloge koji su se realizovali u junu ako u okviru za dijalog unesete 01.06.2000, a u drugom 01.07.2000.
U najvećem broju slučajeva Access će znati koji je tip parametra u pitanju, ali u slučaju da je reč polju sa tipom podatka Yes/No, tip parametra se mora posebno zadati.
|
Napomena : |
![]()
Migracija podataka na MS SQL Server
17.05.2007
Kada naša baza podataka preraste mogućnosti Access-a, vreme je za selidbu naših podataka na neki od sistema za upravljanje relacionim bazama podataka.
Kada naša baza podataka preraste mogućnosti Access-a, vreme je za selidbu naših podataka na neki od sistema za upravljanje relacionim bazama podataka. Jedna od najpovoljnijih i najjednostavnijih opcija je migracija podataka,tj. cele baze podataka na Microsoft SQL Server. SQL Server za migracijeu podataka uopšte, ima odličnu alatku koja se zove “Data Transformation Services”, tj. “Import and export data”, sve zavisi odakle pozivate alatku. Ako je pozivate iz SQL “Enterprise Manager”-a, kliknućete na dugme Tools > Data Transformation Services > Import Data, a ako pokrećete servis sa desktopa, ićićete na Start > Program files > Microsoft SQL Server > Import and Export Data.
Kada izaberete prethodnu opciju, pokrenućete “DTS Wizard”, odosno “čarobnjak” koji će vas voditi kroz celu proceduru migracije. Kada se pojavi prvi dijalog prozor kliknite “Next” da bi došli do dijaloga za definisanje izvora. U novom dijalog prozoru “Choose a Data Source” u listi Source izaberite “Microsoft Access”, a zatim kliknite dugme sa tri tačke pored polja “File Name”. Otvoriće se stand. dijalog za pronalaženje fajlova na disku, pronađite željenu “*.mdb” bazu i kliknite “Open”.Kada kliknete “Next”, u sledećem koraku ćete odrediti destinaciju, podrazumeva se da će to biti SQL Server, ali takođe ovu alatku možete upotrebiti za prostu konverziju baza podataka, iz jednog formata u drugi. U listi “Server” pronađite vaš lokalni SQL server ili upišite njegovu IP adresu, potom ispod, preko radio-dugmadi izaberite tip autentikacije za datu bazu. I na kraju ovog koraka, preko liste “Database” birate da li ćete izvornu bazu uvesti u postojeću ili potpuno novu bazu podataka. Klikom na Next prelazimo na dijalog prozor u kome specifikujemo da li ćemo prebaciti sve tabele i sve podatke, ili ćemo pomoću upita definisati samo određene podatke za uvoz. Kliknite “Next” i pojaviće se sledeći dijalog – “Choose a Data Source” u kome jednostavnom potvrdom biramo tabele iz baze, za uvoz. I na kraju, dovoljno je da u narednom koraku kliknete samo “Next”.
Radeći po prethodnoj proceduri, uvezli ste vašu Access bazu podataka na SQL Server. Takođe, preporuka je da ovu alatku – “Data Transformation Services” koristite i kao dopunu drugim alatkama za kreiranje rezervnih kopija (BackUp). Jer ćete njihovim zajedničkim korišćenjem moći da obezbedite vašim korisnicima maksimalnu raspoloživost resursa. ![]()
Automatsko štampanje izveštaja u zadato vreme
17.05.2007
Verovatno vam nikada nije pala na pamet ideja da možete automatizovati pozivanje i štampanje izveštaja. Zamislite da vas svako jutro na radnom stolu čeka gotov izveštaj
Verovatno vam nikada na pamet nije pala ideja povezivanja Access-a i Windows Scripting Host-a (o WSH-u smo pisali u jednom od pređašnjih priloga). Povezivanjem WSH-a sa izvršnim vbScript fajlom (koga pokreće WSH), u kombinaciji sa Windows Task Scheduler-om, možete podesiti da se vaši Access izveštaji automatski štampaju u određeno vreme. Da bi ovo bilo moguće, potrebno je da kreiramo vbscript (ili Jscript fajl, koji takođe podržava WSH) i pokrenemo ga koristeći skript endžin cscript.exe, iz Task Scheduler-a.
Da biste pokrenuli skript iz Task scheduler-a, selektujte samo cscript.exe kada inicijalno podešavate novi zadatak (task). Zatim, kada podesite novi task, modifikujte ga i dodajte putanju do skript fajla, tako što ćete putanju do vbscript fajla smestiti unutar navodnika. Kao na primer:
cscript.exe “c:\moji skriptovi\
stampa_izvestaja.vbs”
Nakon ovog podešavanja, potrebno je još samo kreirati skript fajl. Sledeći programski kod preko bilo kog tekst editora smestite u novi fajl i snimite ga pod nazivom stampa_izvestaja.vbs:
‘——————-Pocetak skript koda——-
‘Windows Scripting Host Script, za Win 95/98/NT/2000
‘Kompatibilno sa WSH-om verzije 1 i 2
‘Moze se pokrenuti i iz komandne linije
koriscenjem cscript.exe endzina
‘Pozovite cscript.exe iz Windows Scheduler-a
‘——————————————-
On error resume next
call RunReport(“c:\moji skriptovi\baza.mdb”,”Izvestaji1″)
Function RunReport (strPutanjaDoBaze, strImeIzvestaja)
On Error Resume Next
Dim objDb
Set objDb = CreateObject
(“Access.Application”)
objDb.Visible = True
objDb.OpenCurrentDatabase (strPutanjaDoBaze)
objDb.Docmd.OpenReport strImeIzvestaja, 0
DoEvents
objDb.CloseCurrentDatabase
objDb.Quit
End Functio
![]()
Kreiranje izveštaja od linkovanih podataka iz Excel-a
17.05.2007
Predstavljamo vam jednu vrlo zanimljivu funkciju koja u Access-u formira izveštaj (Report) od podataka preuzetih iz neke Excel tabele.
Predstavićemo vam jednu vrlo zanimljivu funkciju koja će da u Access-u formira izveštaj (Report) od podataka preuzetih iz neke Excel tabele. Za ovu našu funkciju koristićemo Access-ovu ugrađenu funkciju CreateReport. Ovaj primer iskoristićemo kao prikaz kako može da se izvrši automatizacija, za povezivanje sa Excel-om, te kreiranje linkovane tabele u nekoj Access bazi podataka (u našem primeru to će biti baza Northwind koja dolazi uz instalaciju Access-a). Nakon linkovanja, i kreiranja tabele, izvršiće se kreiranje izveštaja (Report-a) sa podacima iz date tabele. Biće potrebno samo da u folder “My Documents” kreirate jednu radnu svesku sa nazivom Book1.xls ( ili samo zamenite određenu liniju iz donjeg programskog koda). Podaci iz te radne sveske koji će ući u linkovanu tabelu, definisani su preko osobine SourceTableName.
Kada ste spremili Excel tabelu kao izvor, unesite donji kod u modul bilo koje baze podataka, te na praznoj formi postavite jedno komandno dugme i odatle pozovite funkciju Izvestaj(). Pre nego što pokrenete sam kod, referencirajte Microsoft Excel 8.0 object library i DAO 3.5 object library (mogu naravno da budu i druge verzije).
Option Compare Database
‘ Ovu liniju unesite u sekciju Declarations module-a.
Dim appAccess As New Access.Application
Sub Izvestaj()
Dim rpt As Access.Report, ctl As Access.TextBox
Dim dbs As DAO.Database, tdf As DAO.TableDef, fld As DAO.Field
Dim strDB As String, intLeft As Integer
‘ Konstanta koja predstavlja putanju do baze Northwind.
Const conPutanja As String = “C:\”
‘ Otvaranje baze u Access-u, korišćenjem cele putanje.
appAccess.OpenCurrentDatabase conPutanja & “Northwind.mdb”
‘ preuzimanje reference tekuće baze.
Set dbs = appAccess.CurrentDb
‘ Kreiranje novog TableDef objekta.
Set tdf = dbs.CreateTableDef(“XLData”)
‘ Definisanje konekcionog stringa ka Excel-ovom ISAM drajveru.
‘ Ovde ubacite putanju do neke vaše radne sveske
tdf.Connect = “EXCEL 8.0; Database=C:\My Documents\Book1.xls”
‘ Određivanje izvorne tabele, preko reference bloka ćelija.
tdf.SourceTableName = “A2:E8″
‘ Linkvanje nove tabele u tekuću bazu.
dbs.TableDefs.Append tdf
‘ Kreiranje novog izveštaja u Access-u.
Set rpt = appAccess.CreateReport
‘ Definisanje linkovane tabele kao izvora.
rpt.RecordSource = tdf.Name
‘ Otvaranje reporta u Print Preview modu.
appAccess.DoCmd.OpenReport rpt.Name, acViewPreview
appAccess.DoCmd.Restore
‘ Prikaz Access-a kao aktivne aplikacije.
AppActivate “Microsoft Access”
End Sub
![]()
Zadržavanje SubReport-a na jednoj stranici
17.05.2007
Evo kako obezbediti da vam SubReport vezan za određeni izveštaj (master-detail veza) bude zadržan na jednoj stranici
Kada dizajnirate izveštaje (report) koji sadrže jedan ili više podizveštaja (sub-report-a), tj. master-detalj struktura, moguće je da vam se kod nekih instanci gde podizveštaj sadrži dosta podataka; javi prelazak podizveštaja i na drugu, ili čak treću stranicu. Do “prelivanja” podizveštaja na drugu stranicu će gotovo sigurno doći ukoliko u izveštaju imate i zaglavlje i podnožje. Ovim prelivanjem, kod nekih tipova izveštaja gubi se osnovni smisao izveštaja, a to je njegova preglednost i informativnost.
Naravno, ukoliko postavite vaš podizveštaj unutar glavne detalj-sekcije (detail section) izveštaja, ne postoji način da postavite osobinu keep together za podizveštaj, pa tako ako podaci sa podizveštaja prelaze veličinu jedne stranice, forsiraće se nova stranica izveštaja.
Na svu sreću, postoji zaobilazni put kojim možete izforsirati potpuno novu stranicu izveštaja ukoliko podizveštaj zahteva više stranica. Da bi implementirali ovu “zaobilaznicu” u vaše izveštaje uradite sledeće:
- Unutar osobine dijaloga Sorting and Grouping izveštaja, unesite novu – pseudo grupu za sortiranje, čiji će naziv biti cifra, pa na mestu u izveštaju gde želite da se pojavi podizveštaj, prethodiće naziv “pseudo” grupe sa znakom jednako (=), kao npr. “=1″.
- Podesite osobinu izveštaja Group Header, ili Group Footer, na Yes.
- Postavite vaš podizveštaj unutar Group Headera-a ili Group Footer-a, pre nego u detalj-sekciju izveštaja.
- Unutar atributa za header ili footer (ne podizveštaja), podesite osobinu Keep together na Yes.
![]()
Restartovanje broja strane, za svaku grupu unutar izveštaja
17.05.2007
U nekim tipovima izveštaja trebaće vam mogućnost resetovanja i restartovanja broja stranice, i to za svaku grupu
Veliki broj izveštaja sadrži podatke koji su sortirani (grupisani) po grupama. Često ćete u izveštajima kao što su na primer fakture, želeti da restartujete broj stranice na “1″ za svaku grupu, za razliku od default podešavanja Access-a gde broj stranica teče kontinualno. Ovo podešavanje vrlo lako možete da izvedete ubacivanjen nešto malo programskog koda unutar modula izveštaja. Evo kako ćete doći do cilja:
- Unutar sekcije deklaracija programskog modula izveštaja, dimenzionisaćemo varijablu koja će koristiti kao indikator startovanja nove grupe podataka:
Dim Grupa as Integer 'možete koristit i Boolean tip varijable
- Unutar obrade događaja OnPrint sekcije Group Header, dodajte naredni programski kod koji će da prepoznaje početak svake nove grupe:
Grupa= -1 'true
- Unutar obrade događaja OnPrint sekcije Group Footer, dodajete naredni programski kod kojim obeležavamo završetak grupe:
Grupa= 0 'false
- Kreirajte nevezano (unbound) tekst polje unutar footer-a izveštaja, i nazovite ga recimo BRSTR.
- Unutar obrađivača događaja OnPrint PageFooter-a, dodajte sledeći programski kod:
Static GrupniBRSTR as Integer If Grupa = 0 Then ' Završetak poslednje grupe GrupniBRSTR = 1 ' prvi broj stranice za grupu Else ' i dalje smo u istoj grupi, sve dok je Grupa=-1 GrupniBRSTR = GrupniBRSTR +1 'uvećanje broja stranice End If Me!BRSTR = GrupniBRSTR 'dodela generisanog broja stranice kontroli
![]()
Kreiranje tabela uz pomoć VBA koda
17.05.2007
Naučite kako se uz pomoć VBA koda mogu dizajnirati tabele, kao i celokupne baze podataka
U Access-u postoji mnogo načina da kreirate tabele i upite. Naravno, najjednostavniji je preko Database prozora, a nešto složeniji način je uz pomoć VBA programskog koda. I u jednom i u drugom slučaju samo vi kao dizajner baze podataka možete da kreirate novu tabelu ili upit. Postavlja se pitanje kako omogućiti korisnicima baze podataka/programa da kreiraju novu tabelu? U ovom slučaju jedino rešenje je programski kod kojim ćete korisnicima obezbediti mogućnost kreiranja novih tabela i upita.
Za kreiranje nove tabele u pomoć nam priskače SQL i njegova instrukcija CREATE TABLE. U sledećem jednostavnom primeru videćemo kako se kreira jedna nova tabela:
Sub KreirajTabelu()
Dim Table As New Table
Dim Catalog As New ADOX.Catalog
Dim Key As New ADOX.Key
Catalog.ActiveConnection =
“Provider=Microsoft.Jet.OLEDB.4.0;
Data Source=C:\Baze\Imenik.mdb”
Table.Name = “KONTAKTI”
Table.ParentCatalog = Catalog
Table.Columns.Append “SIFRA”, adInteger
Table.Columns(“SIFRA”).
Properties( AutoIncrement ) = True
Table.Columns.Append “IME”, adVarWChar, 20
Table.Columns.Append “PREZIME”, adVarWChar, 20
Table.Columns.Append “TELEFON”, adVarWChar, 36
Catalog.Tables.Append Table
Key.Name = “SIFRA”
Key.Type = adKeyPrimary
Key.Columns.Append “SIFRA”
Catalog.Tables(“KONTAKTI”).
Keys.Append Key, kyPrimary
Set Catalog.ActiveConnection = Nothing
End Sub
Ovim programskim kodom definisali smo proceduru Kreiraj tabelu(), koja vam na prvi pogled izgleda komplikovano, ali to i nije baš tako. Prve četiri linije koda služe za deklarisanje potrebnih varijabli. ADOX predstavlja ActiveX objekat koji je definisan od strane programera, a da biste ga uopšte mogli koristiti, moraćete da ga referencirate preko izbora menija Tools > References…i potvrđivanja polja sa ActiveX bibliotekom – Microsoft ActiveX Data Objects XX Library. Nakon toga, kreiramo konekciju ka željenoj bazi podataka u kojoj ćemo kreirati novu tabelu. Potom određujemo sve osobine buduće tabele, od samog naziva (Name) do navođenja svih polja u tabeli sa karakteristikama. Iza toga, instrukcijom Catalog.Tables.Append Table izvršavamo kreiranje. Na red dolazi i kreiranje primarnog ključa i upis ključa u tabelu. Ovim smo završili kreiranje nove tabele, te nam ostaje samo da oslobodimo sve resurse, tj. prekinemo aktivnu konekciju.
![]()
Detekcija verzije Office-a i njegovih zakrpa
17.05.2007
Na koji način je moguće iščitati podatak o instaliranoj verziji, tj. detektovati verziju MS Office-a koja se nalazi kod klijenta
Kada krajnjim korisnicima isporučujete aplikacije urađene u Access okruženju, vrlo je važno da detektujte koja je verzija Office-a prisutna na mašini i da li je instalirana neka od mnogobrojnih servisnih zakrpa. Nažalost, Microsoft nam nije obezbedio nijedan način za detektovanje instaliranosti servisnih zakrpa (kao što su Office Service Pack-ovi) preko programskog koda. Jedna od zaobilaznih mogućnosti da se prevaziđe ovaj problem jeste iščitavanje informacija o verziji, smeštenih u izvršne fajlove aplikacija Office paketa. U tabeli na slici možete videti informacije o verziji koje su preuzete sa jedne postojeće mašine. Zato ćemo vam predstaviti funkcije za dobijanje ovih informacija:
Private Type VS_FIXEDFILEINFO
dwSignature As Long
dwStrucVersion As Long
dwFileVersionMS As Long
dwFileVersionLS As Long
dwProductVersionLS As Long
dwFileFlagsMask As Long
dwProductVersionMS As Long
dwFileFlags As Long
dwFileOS As Long
dwFileType As Long
dwFileSubtype As Long
dwFileDateMS As Long
dwFileDateLS As Long
End Type
Private Declare Function apiGetFileVersionInfoSize _
Lib “version.dll” Alias “GetFileVersionInfoSizeA” _
(ByVal lptstrFilename As String, _
lpdwHandle As Long) As Long
Private Declare Function apiGetFileVersionInfo Lib _
“version.dll” Alias “GetFileVersionInfoA” _
(ByVal lptstrFilename As String, _
ByVal dwHandle As Long, _
ByVal dwLen As Long, _
lpData As Any) As Long
Private Declare Function apiVerQueryValue Lib _
“version.dll” Alias “VerQueryValueA” _
(pBlock As Any, _
ByVal lpSubBlock As String, _
lplpBuffer As Long, _
puLen As Long) _
As Long
Private Declare Sub sapiCopyMem _
Lib “kernel32″ Alias “RtlMoveMemory” _
(Destination As Any, _
Source As Any, _
ByVal Length As Long)
Function fGetProductVersion(strExeFullPath As String)
As String
On Error GoTo ErrHandler
Dim lngSize As Long
Dim lngRet As Long
Dim pBlock() As Byte
Dim lpfi As VS_FIXEDFILEINFO
Dim lppBlock As Long
lngSize = apiGetFileVersionInfoSize( _
strExeFullPath, _
lngRet)
If lngSize Then
ReDim pBlock(lngSize)
lngRet = apiGetFileVersionInfo(strExeFullPath, 0, _
lngSize, pBlock(0))
If Not lngRet = 0 Then
lngRet = apiVerQueryValue(pBlock(0), _
“\”, lppBlock, lngSize)
Call sapiCopyMem(lpfi, ByVal lppBlock, lngSize)
With lpfi
fGetProductVersion =
HIWord(.dwFileVersionMS) & “.” & _
LOWord(.dwFileVersionMS) & “.” &
HIWord(.dwFileVersionLS) & “.” & _
LOWord(.dwFileVersionLS)
End With
End If
End If
ExitHere:
Erase pBlock
Exit Function
ErrHandler:
Resume ExitHere
End Function
Private Function LOWord(dw As Long) As Integer
If dw And &H8000& Then
LOWord = dw Or &HFFFF0000
Else
LOWord = dw And &HFFFF&
End If
End Function
Private Function HIWord(dw As Long) As Integer
HIWord = (dw And &HFFFF0000) \ &H10000
End Function
![]()
Tasterima +/- do manipilacije datumom
17.05.2007
Omogućite korisnicima vaših aplikacija da uvećavaju/smanjuju datum, pritiskom na tastere +/-
Većina komercijalnih Windows programa (MS Money, Quicken, MS Office…) omogućavaju korisnicima da pritiskom na plus (+) ili minus (-), povećavaju datume u datumskim poljima, gore i dole, za po jedan dan. Na ovaj način se prevazilazi problem ponovnog unošenja datuma u isto polje, tj. smanjuje se potrebno vreme za unošenje podataka u obrazac. Ovo može da bude jako značajno kod računovodstvenih i sl. aplikacija, zbog unosa velikog broja podataka. Da kažemo još da se sledeća procedura može primeniti i na brojčana polja.
U Access-u (ili drugoj Office aplikaciji), dodajte sledeću proceduru događaju KeyPress, one kontrole gde se nalazi datum:
Private Sub txtDatum_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case 43 ‘ Plus znak
KeyAscii = 0
Screen.ActiveControl = Screen.ActiveControl + 1
Case 45 ‘ Minus znak
KeyAscii = 0
Screen.ActiveControl = Screen.ActiveControl – 1
End Select
End Sub
Šta se dešava? Kada je pritisnut alfanumerički taster na tastaturi, Access prosleđuje ASCII vrednost obrađivaču događaja, putem varijable KeyAscii. Programski kod ispituje prosleđenu vrednost (Select), i reaguje samo ako su pritisnuti tasteri plus (ASCII kod = 43) ili minus (ASCII kod = 45). Potom se poništava pritisak na tastere (KeyAscii = 0), da ne bi došlo do unosa znaka plus ili minus u datumsko polje (njihovog upisa). I na kraju se vrednost aktivne kontrole povećava ili smanjuje za jedan. Kao što smo rekli ideja nije ograničena datumska polja, a proceduru možete iskombinovati sa događajem KeyDown, radi recimo razdvajanja pritiska na testere u gornjem delu tastature ili na numeričkom delu (upis ili povećavanje). ![]()


