Skyhighatrist Posted January 21, 2012 Author Posted January 21, 2012 Još se rvemo, ali shvatio sam da ne mogu sve da nakrljam u jednu tabelu u momentu kad sam dobio poruku "property value is too large" Onda sam izdelio (još delim) sve u onih pominjanih osam tabela, čini mi se da sam (za sad) uspešno napravio relaciju one to many sa ID-jem, i tako...Kad napucam sve u tabele, onda ću da mozgam o query-jima, i već osećam blagu nervozu
salerokada Posted January 22, 2012 Posted January 22, 2012 Dobro izmodelirana baza štedi mnogo muke kod upita. A ako si došao do poruke o višku polja to ne zvuči dobro.Onaj opis što si dao deluje poprilično komplikovano.Palo mi je na pamet jedno rešenje, ne znam da li baš odgovara poslovnom procesu:Imaš tabelu lice, sa polima lice_id, ime, prezime...Šifarnike tabele test1. Polja test1_id, odgovor test2. Polja test2_id, odgovor test3. Polja test3_id, odgovorI tabelu testiranje sa poljima: testiranje_id, lice_id, datum, test1_id, test2_id,..., test25_id, napomena
Aion Posted January 22, 2012 Posted January 22, 2012 Tabele u bazi obicno sadrze nekoliko, do par desetina polja (kolona). U protivnom najcesce nesto nije u redu sa modelom.Evo kako bi model mogao da izgleda. Ako ovde ima eksperata za baze, verovatno ce mi zameriti sto ovaj model nije normalizovan - cini mi se da je ovakav (nenormalizvan) laksi za implementaciju u access-u.Plave tabele sa duplim okvirom najcesce se implementiraju tako da nemaju svoj id, neho im se primarni kljuc sastoji od kluceva tabela na koje se referisu. Recimo PK za uradjen_test je (lice_id, test_id). Ovo su zapravo agregacije kojima se realizuju relacije vise-u-vise (namerno nisam koristio simbol za agregacije da ne bih komplikovao).
Skyhighatrist Posted January 22, 2012 Author Posted January 22, 2012 So far so good.Noćas ću da završim sa pravljenjem tabela i formova, pa ću da unesem desetak recorda, i da vidim kako se sve ponaša.Accessov database checker za sad kaže da nema primedbi. :)
Shan Jan Posted January 22, 2012 Posted January 22, 2012 Za svakog čoveka unosim SVE parametre, razlikuju se rezultati, otud one drop down liste.Pošto se testovi ne rade u isto vreme, kad neko od njih kasnije uradi još neki od testova, uneće se još rezultata.Recimo, imam mogućnost da osoba radi 25 kratkih testova u jednom danu (mada se uglavnom radi do 8), i svaki test ima 10 rezultata, koji se biraju iz drop down listi od ukupno 50 mogućih varijacija. Sve to valja pomnožiti sa 8 dana testiranja. (Meni) to izgleda kao gomila podataka, a možda je to za database zmajeve sitnina, ne znam.Jašta, bataljujem i ja za danas, jutro podne je pametnije od večeri...Ako sam dobro razumeo... (ovako bih ja uradio u db2 ali pretpostavljam da je slicno i u accessu)jedna tabela za ljude sa poljima za razne podatke i ID poljem (npr. ID_ispitanik)druga tabela sa testove (razna polja za pitanja i jedno ID) (npr. ID_test)treca tabela koja povezuje ljude i testove koje su primenili, zavisno od SQL upita mozda i ne mora imati ID (primarni kljuc se sastoji od ID_test, ID_ispitanik), ostala polja su odgovori tog konkretnog ispitanika. Ako ti treba i kog dana je primenjen test na tom ispitaniku onda dodas polje i za broj dana. SQL upit bi trebao iz tabele testova da random bira 10 od 50 pitanja (ako sam dobro razumeo). Sad, mozes imati i u okviru sql upita uslove koji proveravaju da li je taj ispitanik tog dana vec imao testova (ili koliko je imao pa izbacuje broj) itd... Budi do kraja precizan pa cemo da napravimo resenje ;) Sto rece sale, koliko vas je dbovaca, majkumu...
JozoMujica Posted January 22, 2012 Posted January 22, 2012 U nekom sam velikom poslu, pa na brzinu preleteh pitanje i odgovore...Koliko sam shvatio, tebi će biti dovoljne tri tabele:Ispitanik1. ID Ispitanika (primarni ključ)2. Ime i prezime3. JMBG4. Adresa...Test1. ID Testa 2. Naziv testaRezultati1. ID (ja uvek stavljam ID, i obično ga postavim da bude AutoNumber, osim ako zbog nečega ne moram da ga koristim kao redni broj, u tom slučaju ne stavljam AutoNumber zboh obrisanih recorda)2. ID_Ispitanika3. ID_Testa4. OcenaE, sad, ako barataš bar malo sa Access-ovim VBA, ja bih ti preporučio da izbegneš povezivanje polja na formi i tabela, već da sve radiš slanjem SQL upita iz VBA Accessovom engineu, tako mnogo više stvari imaš pod kontrolom... Opet, to je stvar ukusa, meni više leži programiranje od, hm, makroovanja. :)
I*m with the pilots Posted February 3, 2012 Posted February 3, 2012 Ne znam da li je bas odgovarajuca tema, ali potrebna mi je mala pomoc oko upita, ako bi neko bio voljan da pogleda problem.Treba da proverim da li neke tabele imaju primarne i foreign kljuceve, i u SQLu sve ide glatko, koristim IF NOT EXISTS i ALTER TABLE ADD CONSTRAINT blanpr if not exists ( SELECT f.name AS ForeignKey FROM sys.foreign_keys AS f INNER JOIN sys.foreign_key_columns AS fc ON f.OBJECT_ID = fc.constraint_object_id WHERE OBJECT_NAME(f.parent_object_id) LIKE 'PDBT_Project' AND COL_NAME(fc.parent_object_id, fc.parent_column_id) LIKE 'P_DevGroupClassID') ) BEGIN ALTER TABLE PDBT_Project ADD CONSTRAINT FK_PDBT_Project_SDBT_DeviceGroup_Class_Profiles FOREIGN KEY (P_DevGroupClassID) REFERENCES SDBT_DeviceGroup_Class_Profiles (ProfileID) END problem nastaje kada hocu da napravim MS ACCESS dvojnika, ne ide nikako. probala sam nesto ovakvo ALTER TABLE PDBT_Project ADD CONSTRAINT FK_PDBT_Project_SDBT_DeviceGroup_Class_Profiles FOREIGN KEY (P_DevGroupClassID) REFERENCES SDBT_DeviceGroup_Class_Profiles (ProfileID) when not exists ( select * from MSysRelationships where szObject = 'PDBT_Project' and szColumn = 'P_DevGroupClassID' and szReferencedColumn = 'ProfileID' and szReferencedObject = 'SDBT_DeviceGroup_Class_Profiles') jer bi trbalo da WHEN NOT EXISTS zameni IF NOT EXISTS iz T-Sqla, ali se buni kao da je sintaksna greka u ALTER TABLEprobala sam jos neke varijacije, nista nije bilo uspesno.(sto se tice primarnog kljuca, posto nikako nisam uspela shvatiti u kojoj tabeli u MSA se to i nalazi, uradila sam taj deo kroz kod)mozda je neko imao susrete sa ovim pa bi mogao dati koji savet..pretrazila sam moja uobicajena mesta za pomoc, Code Guru izmedju ostalog, ali izgleda da ne mogu lepo da ubodem kako da pretrazim problem.
Skyhighatrist Posted February 3, 2012 Author Posted February 3, 2012 Ne znam dal' će ti nešto značiti, SQL formatter za Access prijavljuje: ALTER(1,1) expected token:; ( SELECT INSERT DELETE UPDATE CREATE DROP
I*m with the pilots Posted February 6, 2012 Posted February 6, 2012 Ne znam dal' će ti nešto značiti, SQL formatter za Access prijavljuje:ALTER(1,1) expected token:; ( SELECT INSERT DELETE UPDATE CREATE DROP nije to, obelezi mi WHEN, ocito da nece tako a ja nemam ideja vise kako da ga zaskocim. moram na neki nacin proveriti da li kljuc vec postoji.
radisa Posted February 6, 2012 Posted February 6, 2012 (edited) nije to, obelezi mi WHEN, ocito da nece tako a ja nemam ideja vise kako da ga zaskocim. moram na neki nacin proveriti da li kljuc vec postoji.Napišeš u VBA rutinu(ili funkciju, ako ti je bitno šta se desilo), u njoj uradiš count po tom ključu i onda, ako je count 0, uradiš alter... Rutinu pozoveš, odakle ti već treba...Ovo pišem iz glave, pa će verovatno biti grešaka, ali se malo pomuuči... :) NIsam davno pisao ništa u Accessovom VBA, pa sam možda nešto pobrljavio... Private function Check_FK() as boolean Dim string_SQL As String Dim string_SQL2 as String string_SQL = "select count(*) from MSysRelationships where szObject = 'PDBT_Project' and szColumn = 'P_DevGroupClassID' and szReferencedColumn = 'ProfileID' and szReferencedObject = 'SDBT_DeviceGroup_Class_Profiles'" With CurrentDb.OpenRecordset(string_SQL) If .Fields(0) = 0 Then string_SQL2="ALTER TABLE PDBT_Project ADD CONSTRAINT FK_PDBT_Project_SDBT_DeviceGroup_Class_Profiles FOREIGN KEY (P_DevGroupClassID) REFERENCES SDBT_DeviceGroup_Class_Profiles (ProfileID) " DoCmd.RunSQL string_SQL2 Check_FK=true else Check_FK=false End If End With End Sub Edited February 6, 2012 by radisa
I*m with the pilots Posted February 6, 2012 Posted February 6, 2012 @radisamislim da nesto tog tipa ne mogu zvati iz programa? (trebalo bi da se izvrsi u pozadini kada korisnik startuje nas program)
radisa Posted February 6, 2012 Posted February 6, 2012 @radisamislim da nesto tog tipa ne mogu zvati iz programa? (trebalo bi da se izvrsi u pozadini kada korisnik startuje nas program)Čekaj bre, u čemu ti pišeš to? Jel' ti sve u Accesu, ili imaš program u C#, VBu ili tako nečemu, a samo baza u accessu?Ako je ovo drugo, primeni istu logiku, samo za odgovarajući programski jezik...A ako ti je sve u Accessu, tek onda nema problema...
I*m with the pilots Posted February 6, 2012 Posted February 6, 2012 (edited) Kod programa mi je u C++u, i radimo tako da napisemo .sql upite i njih pozivamo po potrebi u kodu, odvojeno za SQL i MSAccess korisnike, posto su oni koji koriste MSA nazalost u vecini. Nije meni uopste problem da ja napisem u kodu sve ovo - nego je fora sto imam da odradim za 20-30 tabela pa ce to biti smaranje, htela sam da vezem sve u jedan upit i da vozim - kao sto je slucaj sa SQLom. Zakljucujem da nema druge nego kroz kod - i to je za ljude.svakako - radisa, historian - hvala ;] Edited February 6, 2012 by I'm with the pilots
radisa Posted February 6, 2012 Posted February 6, 2012 Kod programa mi je u C++u, i radimo tako da napisemo .sql upite i njih pozivamo po potrebi u kodu, odvojeno za SQL i MSAccess korisnike, posto su oni koji koriste MSA nazalost u vecini. Nije meni uopste problem da ja napisem u kodu sve ovo - nego je fora sto imam da odradim za 20-30 tabela pa ce to biti smaranje, htela sam da vezem sve u jedan upit i da vozim - kao sto je slucaj sa SQLom. Zakljucujem da nema druge nego kroz kod - i to je za ljude.svakako - radisa, historian - hvala ;]Acess, koliko znam, stvarno dugo, dugo nisam radio u njemu, ne podržava takvu sintaksu, kakvu bi ti želela u sql kodu...Možeš ti napisati subroutine u Accessu(kao ono moje gore) pa je pozivati iz C++(definišeš Acces objekat, otvoriš ga i pozoveš rutinu) ili napisati u finkciju u C++ koja radi to isto... To već znaš, nije lepo, ali će poslužiti... I ovo drugo je, po meni, bolje...
Skyhighatrist Posted February 6, 2012 Author Posted February 6, 2012 Glupo (pretpostavljam) pitanje:Imam 10 tabela, 10 odgovarajućih formova, svi spakovani zajedno u Navigation form.Prvi form su ime, prezime, adresa, etc, ostalih devet su nekakvi rezultati.Kako da kažem Accessu da kad dodam prvi record (ime, prezime...), doda prazne recorde i u ostalih 9 tabela, bez obzira da li ću ih unositi odmah, kasnije ili nikad?Moram da dodajem kontrole, jel? (jer očigledno kad na status baru čuknem New (blank) record, on dodaje record samo za prvu tabelu, a ne i za ostale)Sve tabele su povezane one-to-one relacijom preko ID fielda.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now