@Neznanac_: Lepo napredujes

A i dobra ekipa te savetuje.
Ideja da se sve odradi na formi koja je unbound nije losa i neke dobre knjige o Accessu je veoma preporucuju. S jednom ogradom: radi samo akd unosis tacno jedan slog u neku tabelu. Prosto, napravis unbound formu, stavis polja koja ti trebaju, uneses vrednosti i onda korisnik treba da pritisne dugme "Save" da bi sve otislo tabelu. E, to "Save" je veoma kompleksna stvar. Tu se vrsi validacija. Koja polja nedostaju, koja imaju nepravilne vrednosti, medjusobni odnos pojedinih polja i slicno. Znaci, cmdSave bi pozivalo neku validacionu funkciju kojoj bio poslali polja od interesa kao parametre.Onda bi se aktivirala funkcija koja izracunava ili pravi PK, ukoliko PK nije autonumber. Tu je mali problem u visekorisnickomradu. kako napraviti PK da ska stanica moze u svakom momentu da generise jedinstveni PK. O tom enecemo sada, ali ti to moras da resis. Ako ti je PK neki autonumber, naoko je lakse, o tome brine Access. jedino sto ti u momentu snimanja rekorda ne znas koji ce ti biti PK, pa ti treba kod da ti kaze koji je to PK Access dodelio ovo rekordu koji si upravo snimio. Ovo sve podrazumeva manipulaciju rekorsetima, ADO ili DAO, svejedno. Za nekoga ko dolazi iz VB to je prirodan nacin rada.
Medjutim, ako ti treba unos neceka kao sto je Faktura, ond se bavis sa dve tabele u istom omentu. Tada gore opisani nacin nije vise praktican, mnogo se komplikuje. Ono sto se radi jeste Forma-<Subforma kombinacija. Tabele Faktura i StavkeFakture su u vezi jedna faktura vise stavki (mora biti bar jedna stavka). Lukeguy je preporucio ono sto ja radim za slucajeve Faktura-Stavke. DA krenemo od pocetka.
Imas datasheet (moze i continious form = zgleda kao datasheet), koji je read only i prikazuje postojece fakture (bez detalja). Za pregled ili editovanje postojece uradis kao sto rece Lukeguy: double click na neko polje u datasheetu (cont. formi), obicno PK polje, ostvarads master formu u read only rezimu. mAster forma pokazuje relevantne podatke iz tabele Fakture a subforma na master formi prikazuje stavke. Naravno da je subforma bound, to jest povezana sa master formom. Uoci kako su master forma i subforma u relaciji 1: vise, bas kao i tabele fakture i Stavkefakture. Znaci, relaciju izmedju tabela preslikas u fromu sa subformom. Negde u form header sekciji datasheeta stavis tri dugmeta: cmdView, cmdEdit i cmdAddNew. sve tri pozivaju master formu, ali na malo drugaciji nacin. Kod iz a dugmadi izgleda otprilike ovako:
Code:
Sub cmdView_Click()
'Ovo otvara formu sa subformom u Read Only rezimu
DIM stDocNaAme as string
stDocNaAme ="TvopjaFormaSaSUbformom"
'Pretpostavimo da je PK numerckog tipa, zbog jednostavijeg WHERE uslova
DoCmd.OpenForm FormName:=stDocName, datamode:=acFormReadOnly, WhereCondition:="TvojPK = " & Me!TvojPk
end sub
Sub cmdEdit_Click()
'Ovo otvara formu sa subformom u EDIT rezimu
DIM stDocNaAme as string
stDocNaAme ="TvopjaFormaSaSUbformom"
'Pretpostavimo da je PK numerckog tipa, zbog jednostavijeg WHERE uslova
DoCmd.OpenForm FormName:=stDocName, datamode:=acFormEdit, WhereCondition:="TvojPK = " & Me!TvojPk
end sub
Sub cmdDodajNovi_Click()
'Otvara master form u rezimu za dodavanje:
DIM stDocNaAme as string
stDocNaAme ="TvopjaFormaSaSUbformom"
'ovde vise name WHERE, obrati paznju na datamode!
DoCmd.OpenForm FormName:=stDocName, datamode:=acFormAdd
End SUb
Da bi ovo lepo radilo, pozeljno je eliminisati Accessove navigation buttons i jos ponesto, pa setujte za master formu:
properties.format.navigation buttons = no (ne zelite da vas zbunjuju Accessovi dugmici, jer se tako moze kreirati i novi rekord, a vi zelite potpunu kontrolu)
properties.Other.Cycle = current record (ne zelite da posle poslednjeg polja odete na 'sledec' rekord jer on ne postoji u slucaju readOnly i Edit, zbog Where condition)
dakle, ideja je ovao:
1) datsheet (contin.) forma kontrolise kretanje kroz tabelu sa fakturama. Kretanje i samo kretanje, ne i edit/deleet/add za fakture, pa i tu treba taviti da je cela forma ili datsheet read only
2) ako zelite da menjate ili gledate detalje za neku odredjenu fakturu, nekako je pronadjite (Sort, filter, Right Click Filter By) i onda kliknite cmdView ili cmdEdit. Otvorice vam se tacno taj rekord (faktura) u tacno zelejnom rezimu. Necete moci da doadjete nove rekorde niti da vidite neke druge, znaci na neki nacin ostajete zakljucani u tom rekordu. zato smo menajli one properties.
3) ako zelite da dodate novu fakturu, kliknete cmdDodajNovi i otvorice se ista master forma, ali prazna i ocekivace da unesete podatke. PK ce se automatski preneti u child tabelu, tako subforme rade. U stvari, PK ne mora ni da se vidi na subformi, ne mora cak da bude na subformi ako kontrola uopste, ali to blesavo izgleda. Stavite na subformu sva polja potrebna za povezivanje sa glavnom formom, pa ih ond aucinite nevidljivim. Korisnik ne treba da ih vidi na subformi, od njih nema nikakvu vajdu.
Posto smo ukinuli Access navigation buttons, ne moze se lako dodati jos neki novi rekord posto smo uneli jedan. Znaci, ako iam da se unese vise od jedne fakture, za sada je to moguce ovako: Klikni cmdDodajNovi, unsei fakturu i stavke, zatvori formu, klinki ponovo cmdDodajNovi i sve u krug. Za mnoge slucajeve ovo je dovoljno.
Ako ocekujemo da se unese 50 faktura jedna z adrugom, ne treba nam korak vracanja na datsheet pa ponovo klik na cmdDodajNovi. Dobro bi nam doslo dugme na samoj formi, za dodavanje jos faktura. Ali nam to dugme smeta kad otvorimo formu u ReadOnly ili Edit rezimu. Barem dva resenja su moguca:
1. napravite formu specijalno za unos, kao kopju forme za view/edit, plus dugme. Nije lose ukoliko ste sigurni da ce forma ostati stabilna na duze vreme. Ako dodate novo polje ili promenite logo, moracete da odrzavata dve forme.
2. U komandi Docmd.OpenForm upotrebite OpenArgs parametar. Imali bi nesto kao:
Code:
Sub cmdView_Click()
'Ovo otvara formu sa subformom u Read Only rezimu
DIM stDocNaAme as string
stDocNaAme ="TvopjaFormaSaSUbformom"
'Pretpostavimo da je PK numerckog tipa, zbog jednostavijeg WHERE uslova
DoCmd.OpenForm FormName:=stDocName, datamode:=acFormReadOnly, WhereCondition:="TvojPK = " & Me!TvojPk, OpenArgs:="VIEW"
end sub
Sub cmdEdit_Click()
'Ovo otvara formu sa subformom u EDIT rezimu
DIM stDocNaAme as string
stDocNaAme ="TvopjaFormaSaSUbformom"
'Pretpostavimo da je PK numerckog tipa, zbog jednostavijeg WHERE uslova
DoCmd.OpenForm FormName:=stDocName, datamode:=acFormEdit, WhereCondition:="TvojPK = " & Me!TvojPk,OpenArgs:="EDIT"
end sub
Sub cmdDodajNovi_Click()
'Otvara master form u rezimu za dodavanje:
DIM stDocNaAme as string
stDocNaAme ="TvopjaFormaSaSUbformom"
'ovde vise name WHERE, obrati paznju na datamode!
DoCmd.OpenForm FormName:=stDocName, datamode:=acFormAdd, OpenArgs:="NEW"
End SUb
Sada vam treba da form zna koji ste openargs poslali i da reaguje na odgovarajuci nacin. Mozete da na FormOpen event master forme stavite nesto kao:
Code:
Private Sub Form_Open(Cancel As Integer)
'Na master formi postoji dugme cmdAddMore koje treba da se pojavi
'samo kad je u pitanju dodavanje
'
If me.openargs = "NEW" then
me!cmdAddMore.visible = TRUE
Else
me!cmdAddMore.visible = FALSE
Endif
End Sub
Sub cmdAddMore_Click()
'Ovo je dugme na master formi koje sluzi za dodavanje novog rekorda
DoCmd.GoToRecord objecttype:=acDataForm, objctname:=Me.Name, record:=acNewRec
'uocite nov izgled DoCmd, nema vise DataMode
Docmd.
End Sub
Uocite kako se DoCmd promenilo. DoCmd sa pocetka je govorilo Accessu u kom rezimu da otvori master formu. DoCmd na master formi govori Accessu sta da uradi - da doda novei rekord (da 'ide' na novi rekord)
U formOpen mozete da radite i druge stvari, ako ste poslali OpenArgs. Mzete na primer da promenite form.Caption tako da napisete "Faktura broj 123456, EDIT" ili "fakture 12345 READ ONLY" ili "Fakture - Doavanje Novih Faktura"
Ostavljam ti da sam pokusas da resis ovo sa Form.Caption.
Eto, svi saveti sus e skupili u jedan. I savet od Lukeguy (datasheet za pretragu plus dugmad za otvaranje master forme) i ono sto je Gatsbi rekao "Docmd.gortOrecord...". A ima i programiranja. Znaci, za svakog ponesto.
I na kraju, ako ne postoji validacija an nivou tabela, treba upotrebiti Form BeforeUpdate event da se sve proveri (da li su prisutni svi podaci koji se traze, da li je njihov medjusobni odnos korektan, da li su vrednosti u dozvoljenim granicama i sve ostalo sta vam treba) dobra je ideja da sto vise data validation bude na nivou tabela. isto tako, before update je dobra ideja u svakom slucaju, jer ponekad poruke o narusavanju validacionih pravila na nivou tabela nisu bas jasne prosecnom korisniku. A mozete da koristite i Form_Error event, ako sto smo pre neki dan opisali.