Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Access - Tehnike programiranja

[es] :: Access :: Access - Tehnike programiranja

[ Pregleda: 17550 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Simke
Marko Simic
Sandfield Associates (Solution
Developer)
Novi Zeland

Član broj: 1158
Poruke: 751
*.dialup.xtra.co.nz.

ICQ: 71578686
Sajt: www.sandfield.co.nz


Profil

icon Access - Tehnike programiranja10.11.2004. u 07:00 - pre 235 meseci
Ova tema se bavi tehnikama programiranja u Access-u.

Neke od stvari kojima cemo se baviti ovde:
- Kako najbrze i najefikasnije resiti neki problem
- Kako pisati citljiv i elegantan kod
- Sta, gde i kako koristiti razlicite tehnike
- Sta izbegavati

Nadam se da ce ovo pomoci mnogima koji tek pocinju rad sa Access-om, a takodje i korisnicima koji ga vec duze koriste da nauce neke nove trikove.
All beer is good. Some beer is better.
 
Odgovor na temu

Simke
Marko Simic
Sandfield Associates (Solution
Developer)
Novi Zeland

Član broj: 1158
Poruke: 751
*.dialup.xtra.co.nz.

ICQ: 71578686
Sajt: www.sandfield.co.nz


Profil

icon Re: Access - Tehnike programiranja10.11.2004. u 07:18 - pre 235 meseci
Naming Conventions

Koriscenje standardnih konvencija za imenovanje objekata cini kod citljivijim.
Svaki objekat bi trebao ispred svoga imana imati prefiks koji oznacava tip objekta.
Lista i primeri su dati ispod.

Variables
---------

Code:

Type                    Prefix               Primer
------------------------------------------------------
Boolean                 bln                  blnFound
Byte                    byt                  bytRasterData
Collection object       col                  colWidgets
Currency                cur                  curRevenue
Date (Time)             dtm                  dtmStart
Double                  dbl                  dblTolerance
Error                   err                  errOrderNum
Integer                 int                  intQuantity
Long                    lng                  lngDistance
Object                  obj                  objCurrent
Single                  sng                  sngAverage
String                  str                  strFName
User-defined type       udt                  udtEmployee
Variant                 vnt                  vntCheckSum


Za vise detalja pogledajte
http://msdn.microsoft.com/libr...mingconventions.asp?frame=true


Data Access Objects (DAO)
---------------------------

Code:

Database object     Prefix            Primer
----------------------------------------------
Container           con               conReports
Database            db                dbAccounts
DBEngine            dbe               dbeJet
Document            doc               docSalesReport
Field               fld               fldAddress
Group               grp               grpFinance
Index               ix                idxAge
Parameter           prm               prmJobCode
QueryDef            qry               qrySalesByRegion
Recordset           rec               recForecast
Relation            rel               relEmployeeDept
TableDef            tbd               tbdCustomers
User                usr               usrNew
Workspace           wsp               wspMine



Kontrole (cesto koriscene)
-------------------------

Code:

Control type               Prefix       Primer
------------------------------------------------
Check box                  chk          chkReadOnly
Combo box                  cbo          cboEnglish
Command button             cmd          cmdExit
Form                       frm          frmEntry
Frame                      fra          fraLanguage
Image                      img          imgIcon
Label                      lbl          lblHelpMessage
List box                   lst          lstPolicyCodes
Menu                       mnu          mnuFileOpen
Option button              opt          optGender
ProgressBar                prg          prgLoadFile
TabStrip                   tab          tabOptions
Text box                   txt          txtLastName
Timer                      tmr          tmrAlarm
Toolbar                    tlb          tlbActions


Za vise detalja pogledajte
http://msdn.microsoft.com/libr...mingconventions.asp?frame=true


Ostalo
-------

Code:

Type                    Prefix          Primer
------------------------------------------------
Global variables        g               gstrUserName
Module-level            m               mblnCalcInProgress
Lokalne                 none            dblVelocity



Preuzeto sa http://msdn.microsoft.com

All beer is good. Some beer is better.
 
Odgovor na temu

Zidar
Canada

Moderator
Član broj: 15387
Poruke: 3085
*.eqao.com.



+79 Profil

icon Re: Access - Tehnike programiranja10.11.2004. u 17:23 - pre 235 meseci
Rukovanje Run Time greskama

Absolutno svaka funkcija/procedura morala bi da ima error handler - set naredbi za kontrolu run time gresaka. Ovo vazi i za event procedure.

Prilozeni kod moze se uzeti kao template. Mozete da kopirate od linije On Error GoTo ERROR_HANDLER: do linije Resume EXIT_HERE:. Ako imate vise funkcija u istom modulu, mozete da kopirate ovaj deo koda u svaku od njih, nista ne smeta. Access zna da su imena labela (ERROR_HANDLER:, EXIT_HERE:) lokalna za funkciju. Access 97 nije dozvoljavao labele sa istim imenom u razlicitim funkcijama istog modula. Prilozeni kod je slican onome koji rade wizardi za dugmice , ali je poboljsan. Preporucujemo da uporedite ovaj kod sa onim koji gradi wizard pa da ili zamenite ili izmenite ono sto je wizard uradio.

Na pocetku funkcije imate jednostavno tempalte zaglavlje, gde dokumentujete funkciju na neki kratak i pogodan nacin. Dokumentovanje radite za sebe ali i za druge koji se mozda jednog dana da kopaju po vasoj aplikaciji.

Ima jos teksta iz primera koda.

Code:

Function funTest() As Boolean
'Simple error handling i dokumantovanje funkcije
'Namena : sta radi i cemu sluzi ova funkcija
'Kako radi:  kako to stvari funkcija radi
'Pozvana od: koje procedure/funkcije i objekti pozivaju ovu funkciju
'Poziva:
'Ulaz:  komentar ulaznih parametara
'Izlaz: opis sta je rezultat, razlicite slucajeve
On Error GoTo ERROR_HANDLER:

'neki kod dodje ovde

EXIT_HERE:
On Error Resume Next
Exit Function

ERROR_HANDLER:
Select Case Err.Number
'Ako se neka specificna greska zeli obraditi ond se kaze
'Case 5301
'   msgbox "Greska 5301 bla bla bla"

Case Else
    MsgBox prompt:="Error " & Err.Number & vbCrLf & Err.Description, _
                    Title:="Funkcija modErrorHandling.Test()"
'Ovo se Title:= treba podesiti da prikazije ime konkretne funkcije
'Uocite ime modula ispred imena funkcije. Ako je funkcija unutar
'forminog modula, treba staviti ime forme, frmMyForm.MyFunction()
'
End Select

Resume EXIT_HERE:

End Function


Ako u funkciji radite sa rekrdsetima, lepo je zatvoriti ih na kraju. Medjutim, ako se greska desila pre otvaranja rekrdseta, onda ce zatvaranje da izazove gresku. Zato se error handler malo modifikuje:
Code:

Function funTestRS() As Boolean
'Namena: pokazati Error kod za funkcije koje koriste rekordsete
'
'
On Error GoTo ERROR_HANDLER:

'neki kod dodje ovde
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strSQL As String

strSQL = "SEELCT * FROM tblClanovi"
Set db = CurrentDb
Set rs = db.OpenRecordset(strSQL)
'
'ovde nesto radimo sa rekordsetom
'

EXIT_HERE:
On Error Resume Next
'Pocistimo za sobom
'Ako se greska desila pre otvaranja recordseta, rs.Close bi izazvalo jos jednu gresku
'Zato  rs.close stavili iza On Error Resume Next
rs.Close
Set db = Nothing
Exit Function

ERROR_HANDLER:
Select Case Err.Number
'Ako se neka specificna greska zeli obraditi onda se kaze na primer
'Case 5301
'   msgbox "Greska 5301 bla bla bla"

Case Else
    MsgBox prompt:="Error " & Err.Number & vbCrLf & Err.Description, _
                    Title:="Funkcija modErrorHandling.funTestRS()"
End Select

Resume EXIT_HERE:

End Function

Ovo naravno nije kraj price.


Nastavak price obuhvatice upravljanje greskama koje prijavljuje ODBC izvor- greske koje se dese na SQL serveru ili slicnoj ODBC bazi, na serevr strani.

Postoje i greske koje nisu Run time, a desavaju se. Na primer, imate formu bez koda. Dodate novi rekord, sa losim PK - na primer duplikat. to nije run time greska, kod ni ne psotoji. Access ce vamjaviti na engleskom nesto kao "You have tried to insert duplicate value into unique indexed or primery key field" Poruka je u stvari mnogo duza i konfuznija, pa se i na engleskom govornom podrucju ta greska hvata i tekst poruke se menja. To ce biti tema za sledeci put.
 
Odgovor na temu

Simke
Marko Simic
Sandfield Associates (Solution
Developer)
Novi Zeland

Član broj: 1158
Poruke: 751
*.dialup.xtra.co.nz.

ICQ: 71578686
Sajt: www.sandfield.co.nz


Profil

icon Re: Access - Tehnike programiranja11.11.2004. u 05:29 - pre 235 meseci
Komentari
-----------

Jedna stvar koju bi stalno trebalo koristi u programu su komentari. Uveliko olaksavaju posao citanja/tumacenja/shvatanja koda, kako za vas tako i za druge koji budu razvijali vas program.

Svaka procedura/funkcija/logicka celina treba da ima komentar koji sadrzi kratak opis sta se i kako radi.

Primer:

Code:

Public Function ProveriSifru (strKorisnik As String, strSifra As String) As Boolean
     ' Ova funkcija proverava sifru koja je ukucana za datog korisnika.
     ' Parametri:
     '      - strKorisnik - korisnicko ime
     '      - strSifra - ukucana sifra
     ' Vraca True ako je sifra tacna, False ako je pogresna

     ' Blok koda 1, opis sta i kako radi
     
     ...

     ' Blok koda 2, opis sta i kako radi

     ...
End Function


Ovo je jedna od stvari koje dosta ljudi zanemaruje, jer smatraju pisanje komentara gubljenjem vremena. Nasuprot, ne da nije gubljenje vremena, vec je i velika usteda kada vi ili neko drugi pogledate taj isti kod posle nekoliko meseci i nemorate da provedete par sati kapirajuci sta radi.
All beer is good. Some beer is better.
 
Odgovor na temu

Simke
Marko Simic
Sandfield Associates (Solution
Developer)
Novi Zeland

Član broj: 1158
Poruke: 751
*.dialup.xtra.co.nz.

ICQ: 71578686
Sajt: www.sandfield.co.nz


Profil

icon Re: Access - Tehnike programiranja11.11.2004. u 06:46 - pre 235 meseci
Error Handling - Drugi deo (Error Logging)
----------------------------------------

Ponekad moze biti korisno da vasa aplikacija ima neku vrstu error log-a, gde se beleze sve run-time greske. Ovo moze dosta pomoci pri resavanju nekog problema.

Primer koji je ovde dat sluzi bas tome - zapisuje greske u posbenu tabelu, kako bi se iste mogle kasnije pregledati.


Primer
-------

Za pocetak treba napraviti tabelu koja ce se nalaziti u mdb fajlu gde se nalazi glavni program (ne data fajl), kako bi smo mogli da pratimo greske za svakog korisnika posebno.

Code:

tblErrorLog
(
     ErrorLogID (AutoNumber) (PK),
     Number (Text, 50),
     Description (Text, 255),
     Module (Text, 50),
     Procedure (Text, 50),
     ErrorDate (DateTime),
     ErrorTime (DateTime)
)


Sledece treba napraviti modul u kome ce se nalaziti procedura koja upisuje logove u tabelu.

modErrorLog

Code:

Option Compare Database
Option Explicit

Public Sub WriteError(Number As String, Description As String, _
                      Module As String, Procedure As String)
    'Autor: Simke @ eLitesecurity.org
    'Ova procedura sluzi da upisuje greske u log tabelu.
    'Parametri:
    '    - Number - broj greske (err.Number)
    '    - Description - opis greske (err.Description)
    '    - Module - modul/forma/report gde se nalazi procedura koja je
    '               prijavila gresku
    '    - Procedure - ime procedure koja je prijavila gresku
    
    On Error GoTo Proc_Error
    
    Dim strSQL As String
    
    'Konstrukcija upita za upis greske
    strSQL = "INSERT INTO tblErrorLog " & _
                "([Number], [Description], [Module], [Procedure], " & _
             "[ErrorDate], [ErrorTime]) " & _
             "VALUES(" & Chr(34) & Number & Chr(34) & ", " & Chr(34) & _
                Description & Chr(34) & ", " & Chr(34) & Module & Chr(34) & _
        ", " & Chr(34) & Procedure & Chr(34) & ", #" & Date & "#, " & _
                Chr(34) & Time & Chr(34) & ")"
        
    DoCmd.RunSQL strSQL
    
Proc_Exit:
    Exit Sub
    
Proc_Error:
    GoTo Proc_Exit
End Sub


Zadnje sto vam ostaje je da ovu proceduru zovete u svojim error handler-ima. Za koriscenje error handler-a pogledajte prethodni primer koji je dao Zidar.

Primer:
WriteError Err.Number, Err.Description, "Form_frmAttachments", "Form_Delete"

[Ovu poruku je menjao Simke dana 13.11.2004. u 06:08 GMT+1]

[Ovu poruku je menjao Simke dana 13.11.2004. u 06:09 GMT+1]
All beer is good. Some beer is better.
 
Odgovor na temu

Zidar
Canada

Moderator
Član broj: 15387
Poruke: 3085
*.eqao.com.



+79 Profil

icon Re: Access - Tehnike programiranja12.11.2004. u 20:08 - pre 235 meseci
Hvala Simketu za odlican dodatak :-) jedan od najjednostavnijih i najkracih postupaka za logiranje gresaka. :-)

Da sumiramo Error handling: Kod za upravljanje greskama se pise PRE nego sto pocnete da pisete proceduru/funkciju. Najbolje je da napravite sablon proceduru(template) i kad god pocnete novu proceduru, cut/paste error handler.

Form Events
A sad nesto drugo - flowchart za evente na formi. Korisno je znati. Pogledajte attachment. Napomena: nisu obuhvacene subforme. Ako imate i subforme, prvo se dese Open/Current/Load za subformu pa tek onda za formu. Cudno? Jeste. Ali tako je.

Mozete da experimetisete, tako sto cete u svaki formin event staviti MsgBox koji izgleda kao MsgBox "Sad sam u event OnLoad". Otvorite formu i uradite nesto. Pratite kako se pojavljuju poruke u zavisnosti od vasih akcija. lepo se zabavljajte.

:-)
Prikačeni fajlovi
 
Odgovor na temu

Simke
Marko Simic
Sandfield Associates (Solution
Developer)
Novi Zeland

Član broj: 1158
Poruke: 751
*.dialup.xtra.co.nz.

ICQ: 71578686
Sajt: www.sandfield.co.nz


Profil

icon Re: Access - Tehnike programiranja13.11.2004. u 01:20 - pre 235 meseci
Querydefs
-----------

Querydef je objekat koji definise query i sluzi za pokretanje query-ja i vracanje podataka za dalje koriscenje u aplikaciji.

Dosta olaksava / ubrzava posao kada treba izvrsiti query koji prima parametre.
Umesto da pisete custom SQL string i da njega koristite putem DoCmd.RunSQL komande ili kao source za recordset, mozete da koristite querydef objekat.

Koriscenje se sastoji iz pravljenja query-ja koji uzima jedan ili vise parametera, i definisanje querydef objekta u VBA kodu koji koristi zeljeni query kao source.

Primera radi, imamo query qdfUser_Details koji sluzi da pokaze detalje korisnika, i koji prima parametar "ID" kako bi izvukao detalje za zeljenog korisnika (pogledaj sliku).

Da pokrenemo query i vratimo rezultat u recordset koristimo sledeci kod:

Code:

    Dim qdf As QueryDef
    Dim rs As Recordset
    
    Set qdf = CodeDb.QueryDefs("qryUser_Details")
    With qdf
        .Parameters("ID") = intUserID
        Set rs = .OpenRecordset(dbOpenForwardOnly, dbReadOnly)
    End With
    
    If rs.RecordCount > 0 Then
        Me.txtUserName = rs!UserName
        Me.txtPassword = rs!Password
        Me.cboUserGroup = rs!UserGroupID
    End If


Ako imate update / append / delete upit koje ne treba da vraca nazad rezultate, onda koristite .Execute metod querydef objekta.

Primer:

Code:

    Set qdf = CodeDb.QueryDefs("MyUpdateQuery")
    With qdf
        .Parameters("MyParam") = intParam
        .Execute
    End With

All beer is good. Some beer is better.
Prikačeni fajlovi
 
Odgovor na temu

Simke
Marko Simic
Sandfield Associates (Solution
Developer)
Novi Zeland

Član broj: 1158
Poruke: 751
*.dialup.xtra.co.nz.

ICQ: 71578686
Sajt: www.sandfield.co.nz


Profil

icon Re: Access - Tehnike programiranja29.11.2004. u 08:49 - pre 235 meseci
Recordsets

Recordset sluzi za manipulaciju podataka vracenih izvrsavanjem nekog upita ili cele tabele. Moguce je pomerati se kroz rekorde napred/nazad, editovati postojece, dodavati nove ili brisati ih.

Kao source je moguce postaviti query, tabelu, SQL string ili querydef (za koriscenje istih pogledajte inzad).

Osnovna upotreba
------------------

Code:

    Dim db As Database
    Dim rst As Recordset
    
    Set db = CurrentDb()
    Set rst = db.OpenRecordset("qryMyQuery")
    
    'Provera ima li vracenih rekorda
    If rst.RecordCount <> 0 Then
        With rst
            .MoveFirst 'Idi na pocetak
            'Prodji kroz sve rekorde
            Do Until .EOF
                MsgBox !Name 'Pokazi Name field iz qryMyQuery
                .MoveNext 'Predji na sledeci rekord
            Loop
        End With
    End If
    
    rst.Close
    Set rst = Nothing
    Set db = Nothing

All beer is good. Some beer is better.
 
Odgovor na temu

Simke
Marko Simic
Sandfield Associates (Solution
Developer)
Novi Zeland

Član broj: 1158
Poruke: 751
*.bitstream.orcon.net.nz.

ICQ: 71578686
Sajt: www.sandfield.co.nz


Profil

icon Re: Access - Tehnike programiranja23.03.2005. u 06:02 - pre 231 meseci
Recovery Opcije

Compact and Repair

Tools -> Database Utilites -> Compact and Repair Database
Prva opcija koju treba pokusati u slucaju da je fajl ostecen. U vecini slucajeva resava problem.

Import

Ako Compact and Repair ne uradi posao, sledeca stvar je import objekata u novi mdb / adp fajl.
File - > Get External Data -> Import ili desni klik object browser i opcija Import.
Prodjite kroz svaki tab (object type) i izaberite Select All.
Options dugme daje jos par dodatnih opcija, kao naprimer import relacija, menus & toolbars, itd.

Export / Import text files

Zadnja opcija je snimanje objekata u text fajlove iz ostecenog mdb / adp fajla i ucitavanje istih u novi mdb / adp fajl.

Snimanje objekta u text fajl – otvorite code editor i u immediate window pokrenite sledecu komandu:
SaveAsText acObject, "MyForm", "C:\MyForm.txt"
Gde je acObject tip objekta (form, report, itd), “MyForm” ime forme, i “C:\MyForm.txt” putanja gde ce text fajl biti snimljen.

Za ucitavanje slicna stvar, samo koristite LoadFromText (i novi mdb / adp fajl):
LoadFromText acObject, "MyForm", "C:\MyForm.txt".


Kako izbeci probleme

Par stvari koje mogu prouzrokovati probleme, i koje treba izbegavati.

Access 2000

Access 2000 se po meni pokazao prilicno nestabilan, tako da ga izbegavam koliko god mogu.
Takodje ima jedan gadan bug ako radite sa adp fajlovima – posle importa objekata u adp fajl, moze doci do korupcije istog. Kako izbeci – posle importa, otvorite code window I uradite Compile Project. Posle toga uradite save, i izadjite iz Accessa. Startuje ponovo adp fajl i uradite Compact & Repair.

Access XP / 2003

Generalno nisam naisao na neke probleme sa ove dve verzije, osim ako se ne radi sa 2000 fajl formatom. Tada svari mogu budu prilicno nestabilne, tako da izbegavajte ovaj format ako mozete.

Inace 2000 fajl format je default u obe verzije (XP i 2003). Da promeite ovo koristite Tools -> Options, Advanced Tab, i pod default file format izaberite Access 2002-2003.

Corrupt Microsoft Access MDBs FAQ

http://www.granite.ab.ca/access/corruptmdbs.htm
All beer is good. Some beer is better.
 
Odgovor na temu

[es] :: Access :: Access - Tehnike programiranja

[ Pregleda: 17550 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.