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

Pocetnicki projekat za ucenje

[es] :: Access :: Pocetnicki projekat za ucenje

[ Pregleda: 3020 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

_Mrgud_
Uros Todorovic
Novi Beograd

Član broj: 129681
Poruke: 21
*.vektor.net.



Profil

icon Pocetnicki projekat za ucenje20.04.2008. u 08:20 - pre 195 meseci
Prvo & pre svega - pozdrav svima.

Pocetnik sam sa Accessom i bazama uopste, pa sam resio da kroz neki konkretan projekat naucim ponesto i o jednom i o drugom (da ostavimo sada po strani komentare da bi neki drugi DBMS mozda bolje posluzio za ucenje baza uopste :).

Ideja koju sam resio da realizujem je potekla od kolege koji radi kao HR manager u jednoj kompaniji. Zadatak se sastoji u sledecem: napraviti Access bazu u kojoj ce se cuvati podaci o dodatnim edukacijama zaposlenih koje placa kompanija - kursevi, usavrsavanja, team buldings, itd. Baza takodje treba da omoguci kreiranje izvestaja po prakticno svim podacima koji su u njoj: po zaposlenima, po odeljenjima u kojima rade, po kompanijama tj. pravnim licima (posto se cela firma sastoji od nekoliko pravnih lica), po vremenskim periodima, po cenama...

U prilogu je moj dizajn baze - tabele i relationships. Trudio sam se, to the best of my knowledge & abilities, da taj dizajn odradim kako treba, ali su misljenja iskusnijih itekako pozeljna.



Najveci problem mi je u samom dizajnu modela pravio zahtev da se cene mogu unositi u dinarima i u evrima, i da izvestaji moraju biti u stanju da prikazu troskove i u dinarima i u evrima. Najjednostavnije resenje bi, naravno, bilo da u tabelu Edukacije idu i cena u dinarima i cena u evrima, ali to bi bilo u suprotnosti sa 1. NF (ako sam dobro zapamtio ;), pa sam stoga odlucio da u bazu idu samo minimalni podaci iz kojih se mogu rekonstruisati i jedna i druga cena, dakle: iznos, valuta i kurs evra. Izvestaji ce sami racunati "onu drugu" cenu, koja god da je. Interesuje me, konkretno ovde, da li sam dobro postupio i da li mozda postoji jednostavnije ili cisto pametnije resenje.

Sto se same realizacije baze tice, zamislio sam da se pri otvaranju baze otvara jedan Form, kao nekakav "main switchboard", sa cetiri osnovne opcije:

1) Unos/izmena podataka o edukacijama;
2) Unos/izmena podataka o radnicima;
3) Kreiranje izvestaja;
4) Unos/izmena podataka o organizacionoj strukturi kompanije.

Svaka od ovih opcija otvara novi form, koji "radi posao". E tu sam se susreo i sa prvim konkretnim problemom:

Zamislio sam da se na formi za unos/izmenu podataka o edukaciji izbor kategorije radi pomocu Combo Boxa iz kojeg ce se prosto izabrati kategorija. Problem je sto sam vezu izmedju tabela Edukacija i Kategorije izveo preko polja Kategorija_ID. Moje pitanje: kako izvesti da korisnik iz Combo Boxa bira naziv kategorije koji odgovara odredjenom Kategorija_ID a ne neki kripticni AutoNumber broj koji mu nista ne znaci?

Moja ideja resenja (koja ne radi ;) izgleda ovako: za Control Source tog Combo Boxa je postavljeno "ID_Kategorija", Row Source Type je "Table/Query", a Row Source je:

Code:

SELECT Kategorije.ID, Kategorije.Naziv FROM Kategorije;


To, naravno, prikazuje samo "kripticni AutoNumber" ID iz tabele Kategorije, ali ne i polje Naziv iz iste tabele. Svaka druga varijanta (prvo Kategorije.Naziv pa ID, ili samo Naziv), logicno, ne prolazi zbog type mismatch polja. Kako srediti to?

Unapred hvala svima koji pomognu, i ocekujte jos pitanja i poTpitanja, pogotovo kad krenem u izradu queryja za izvestaje. :)))

Pozdrav
 
Odgovor na temu

Getsbi

Moderator
Član broj: 124608
Poruke: 2831



+45 Profil

icon Re: Pocetnicki projekat za ucenje20.04.2008. u 09:35 - pre 195 meseci
Bez konkretnih poslovnih zahteva koji predstoje samom modelovanju vrlo je teško komentarisati model. Ovako sa aspekta mog oskudnog poznavanja tvog poslovnog problema meni model izgleda dosta pristojno. Pogotovo što je model podataka "živuća" stvar i nije jednom za uvek data.

Problem oko cena u tabeli Edukacija je korektno postavljen. Uvek ćeš moći na osnovu srednjeg kursa recimo da cenu na izveštaju izraziš u drugoj valuti od one u kojo je unešena. Ovo svakako ne rešava fluktuaciju kursa i promene koje idu uz to.

Za problem Combo Box-a pogledaj ovu skorašnju temu: http://www.elitesecurity.org/t...-combo-boxa-neradi-molim-pomoc i moj komentar u njoj. To što ti je Bound Column postavljen prema polju Kategorije.ID je u redu. Samo u Column Count postavi 2 i Colum Widths postavi recimo 1;3 ako želiš da vidiš i kategoriju i naziv ili 0;3 ako želiš da vidiš samo naziv kategorije.
 
Odgovor na temu

_Mrgud_
Uros Todorovic
Novi Beograd

Član broj: 129681
Poruke: 21
*.vektor.net.



Profil

icon Re: Pocetnicki projekat za ucenje20.04.2008. u 10:29 - pre 195 meseci
Savrseno, to je to. :)

Malo sam se i ja igrao & eksperimentisao i dosao do tog Column Width, ali, verovao ili ne - nije mi uopste palo na pamet da postavim sirinu prve kolone na nula. :) Well, live & learn, hvala puno. :)

Sto se tice samog modela... Xm, citao sam tutorijale & knjizice na tu temu, pa je ovo najadekvatniji odraz onoga sto sam tamo procitao u odnosu na ono sto mi je postavljeno kao zahtev. Kao sto si i sam rekao, to nije "isklesano u kamenu", sasvim je moguce da ce dalji rad na ovome da ponudi neka mozda bolja resenja.

Jos jednom hvala, pa se vidimo kod narednog problema. ;)
 
Odgovor na temu

_Mrgud_
Uros Todorovic
Novi Beograd

Član broj: 129681
Poruke: 21
*.vektor.net.



Profil

icon Re: Pocetnicki projekat za ucenje20.04.2008. u 14:13 - pre 195 meseci
Okej, moja sreca nije dugo trajala, here's another one :)

Trenutno se bakcem oko dizajna forme za unos/izmenu podataka o edukacijama. Jedan deo podataka sam asocirao sa kontrolama (Text Boxovi, Combo Boxovi, DTPicker), a podatke koji su vezani za radnike koji su odredjeni za te edukacije, kao i za organizatore i predavace sam smestio na tabove jedne Tab Control, i to kao subforms. Dakle - tri taba, na svakom jedan subform: Radnici, Organizatori i Predavaci.

Realizacija toga je bila malo glavobolna, al' sam nekako uspeo. Problem je u sledecem: obzirom da u dizajnu postoji polje Tip_cene, koje oznacava da li je u pitanju cena po coveku ili ukupna cena edukacije, potrebno mi je da na toj formi imam i jedan TextBox u kojem ce se prikazivati broj radnika na toj edukaciji. Za sada - ne uspeh ovo da izvedem.

Pokusaji su bili:

1) Poseban COUNT query koji ce biti Control Source za Text Box:

Code:
SELECT COUNT(ID_radnik) FROM Radnik_na_edukaciji WHERE ID_edukacija = Forms!frmEdukacije!ID


2) Varijanta istog:

Code:
SELECT COUNT(ID_radnik) FROM Radnik_na_edukaciji WHERE ID_edukacija = [Forms]![frmEdukacije]![ID]


3) Igranje sa Expression Builderom u stilu:

Code:
=Count([Forms]![Radnik_na_edukaciji subform]![ID_radnik])


Sve rezultuje #NAME? ili #ERROR greskama... A sada... Gde gresim? :/

 
Odgovor na temu

Getsbi

Moderator
Član broj: 124608
Poruke: 2831



+45 Profil

icon Re: Pocetnicki projekat za ucenje20.04.2008. u 15:58 - pre 195 meseci
Kad se u formi pojavi #Name? , verovatno je da naziv kolone na formi ne odgovara nazivu kolone iz Control sorce tabele ili upita. Pojava #Error je najčešće vezana za promašaj u tipu podatak, mada ima i drugoh razloga. Rešenje je u pažljivijem pisanju. Ako je referenciranje na podformu u pitanju onda se mora navesti i forma kojoj podforma pripada. Pogledaj pravila za referenciranje ovde: http://www.elitesecurity.org/t221799-0#1601903
Možda pomogne.

 
Odgovor na temu

_Mrgud_
Uros Todorovic
Novi Beograd

Član broj: 129681
Poruke: 21
*.vektor.net.



Profil

icon Re: Pocetnicki projekat za ucenje23.04.2008. u 19:20 - pre 195 meseci
Prvo: nisam se igrao par dana sa Accessom, pa se ne zahvalih na odgovoru. Dakle - hvala. :)

Ali... Problem i dalje stoji. :) Ne uspevam nikako da nateram Access da prebroji recorde.

Nastavio sam da se vrtim sa istim idejama, jerBo nisam uspeo da smislim bolje:

1) Naterati Access da prebroji recorde izlistane u Subformu pomocu funkcije Count() - svaka od varijanata referenciranja koje si naveo u onom drugom postu rezultuje #Error greskom. To ocito znaci da nije problem u nacinu referenciranja (tada bi mi prikazao #Name?, ako sam ja dobro shvatio tvoj post, tutorijale i MSov online help), vec u rezultatu koji funkcija vraca ili u parametrima koje prosledjujem funkciji ili necem trecem. Sta je tacno od svega toga problem? I kako ga srediti?

2) Napraviti "rucno" query sa SQL aggregate COUNT funkcijom. Sam query kad se pokrene rucno radi k'o zmaj - otvoris formu (posto query referencira polje ID_edukacije sa forme - ona mora biti otvorena), otvoris query - u Expr1000 stoji prava brojka. Ali kad kao Control Source za text box stavim BrojRadnikaNaEdukaciji!Expr1000 dobijam #Name? DakleM, ovde problem JESTE u referenciranju. Moje pitanje je: posto si u onom postu naveo pravila referenciranja za forme, da li cinjenica da ja ovde "gadjam" query menja stvari? Po onome sto sam ja do sada video - rekao bih da sam odradio kako treba, ali ovo cudo i dalje ne radi, a pomalo cak pocinje i da me nervira. :)

Molio bih vas za neko pojasnjenje ili uput u pravom smeru, posto sam malo fresh out of ideas. :)

U medjuvremenu, dosao sam do nove kvake, koju sa svojim oskudnim znanjem ne mogu da objasnim (samim tim ni da resim):

Napravio sam formu za unos/izmenu podataka o zaposlenima. U header sam stavio samo jedan ComboBox u kojem se vrsi izbor departmenta u kojem se nalazi zaposleni. Combo box ima za control source SELECT koji vraca dva polja, ID i Naziv departmenta, ID za povezivanje a naziv radi lakse upotrebe. U Form details je subform sa spiskom radnika u izabranom departmentu. Stavio sam da Default view za taj subform bude Datasheet view, zbog preglednosti i lakog dodavanja/brisanja zaposlenih.

E, sad: uneo izvesnu kolicinu test podataka. Krenuo onako redom (zaposleni sa ID 1-6 u dept sa ID 1, itd.) po fiktivnim departmentima, dodavao neke fiktivne zaposlene. Zatvorio formu. Ponovo otvorio formu. Combo box za izbor departmenta je sadrzavao vrednost poslednjeg departmenta po kojem sam brljao pre nego sto sam zatvorio formu, sto je okej. Ali... Iznenada se zaposleni sa ID=1 pojavio u tom departmentu. Kapiram da je cim otvorim formu prvi zapis nekako selektovan i da je promena vrednosti komboa dovela do njegovog mrdanja u drugo odeljenje. Ono sto me buni jeste cinjenica da se to desava samo sa prvim zapisom ukupno (Radnici.ID = 1), ali ne i sa ostalim zapisima. Npr. probao sam da rucno selektujem ceo jedan red iz subforma, zatim promenim department i zatvorim formu. Ocekivao sam da ce i taj record biti prebacen u drugi department, ali jock. Sve u svemu, prilicno sam zbunjen pa bi neko pojasnjenje prijalo. :)

S druge strane... Jos jedno pitanje (znam da sam dosadan, ali tako je puno pitanja a tako malo znanja...): kako najlakse izvesti (pri formi za edit zaposlenih ovakvoj kakvu sam opisao) mogucnost da se radnik prebaci iz jednog departmenta u drugi? Idealna varijanta sa aspekta koriscenja bi bila kombo za izbor "ciljnog" departmenta i dugme u stilu "Go!". Kako to izvesti bez diranja datasheet prikaza zaposlenih u departmentu? Kombo i dugme u footeru? Da li to znaci da bi trebalo u datasheetu da se selektuje ceo record, pa onda izbor ciljnog departmenta pa klik na dugme? Ili kako?

Imam nekako utisak da ce odgovori i sugestije za ovo biti vezane za prethodno pitanje, pa sam zato i postavio zajedno. :)

Anyway, sorry na smaranju i hvala unapred za svaku trunku pomoci. :)
 
Odgovor na temu

Getsbi

Moderator
Član broj: 124608
Poruke: 2831



+45 Profil

icon Re: Pocetnicki projekat za ucenje23.04.2008. u 22:12 - pre 195 meseci
Bilo bi mnogo lakše da zakačiš primer i konkretno pitanje. Ali hajde da probamo da pomognemo.
1. Ako je prebrojavanje na subformi u pitanju, onda je predpostavka da nije izlistana cela tabela "dete", već samo oni slogovi koji zadovoljavaju osobinu Link Master Fields i Link Child Fields. Broj slogova ne moraš da prebrojavaš. On je prikazan ako uključiš Navigation Butons subforme na Yes.
Ali recimo da ti nećeš da se to vidi i hoćeš sopstveno prebrojavanje. Tad na podformi dodaš unbound polje sa sledćim kodom u Control Source =Count([NekoPoljeSaSubforme]) i nazoveš ga recimo Brojac. Na glavnoj formi dodaš novo unbound polje i u njegov Control Source =[NazivSubforme].Form!Brojac.
Ako si pokušavao da staviš =Me![NazivSubforme].Form!Brojac, onda neće da radi, jer se referenciranje sa Me! koristi u VBA kodu i to ne u globalnim modulima.
Ovo mora da radi. Dalje ne vredi da pišem ako ne proradi.
 
Odgovor na temu

_Mrgud_
Uros Todorovic
Novi Beograd

Član broj: 129681
Poruke: 21
*.vektor.net.



Profil

icon Re: Pocetnicki projekat za ucenje23.04.2008. u 23:29 - pre 195 meseci
Auuu... Koliko glup mogu da budem? Nije mi uopšte palo na pamet... :(

Elem, rešenje radi, baš kao što i treba. Hvala do neba.

Citat:
Ako si pokušavao da staviš =Me![NazivSubforme].Form!Brojac, onda neće da radi, jer se referenciranje sa Me! koristi u VBA kodu i to ne u globalnim modulima.


I opet - guilty as charged... :( Niti čitam post do kraja, niti uključujem mozak... :( Šta reći... Potrudiću se da ovakve gafove više ne pravim... Ovo se pre može pripisati nepažnji i nemaru nego neznanju.

Što se tiče primera... Sačekaće do sutra. Za danas sam dovoljno "ispao glup u društvu", da odspavam pa kačim konkretan problem.

Hvala na odgovoru i hvala na strpljenju da se bakćeš sa prilično elementarnim i prilično glupavim pitanjima.
 
Odgovor na temu

_Mrgud_
Uros Todorovic
Novi Beograd

Član broj: 129681
Poruke: 21
*.vektor.net.



Profil

icon Re: Pocetnicki projekat za ucenje30.04.2008. u 21:04 - pre 195 meseci
Nekoliko dana tisine - i opet ja.

Vecinu problema sam ispeglao i baza funkcionise kako je i zamisljena.

Problem je - nije zamisljena kako valja. Danas sam u razgovoru sa drugom koji je inicirao celu pricu dosao do velike konceptualne greske: model ovakav kakav jeste ne dozvoljava da zaposleni menjaju organizacione jedinice. Odnosno, mogu ih promeniti ali se menja i smisao podataka, pa samim tim i izvestaji postaju manje-vise beskorisni.

To, naravno, znaci da aplikacija treba da prati i "istoriju" za svakog radnika - veza izmedju Radnika i Departmenta nije prosto many-to-one, vec mora biti many-to-many, i uz to vremenski zavisna. Odnosno - Petar Petrovic je radio od tog-i-tog do tog-i-tog datuma u Racunovodstvu a zatim je presao u, recimo, Nabavku.

Resenje koje nameravam da primenim jeste - dodatna tabela u kojoj ce biti parovi RadnikID i DepartmentID kao i vreme pocetka, odnosno, vreme zavrsetka rada u tom departmentu. To mi podosta komplikuje izradu izvestaja (posto se, ovakvi kakvi su sada - ne mogu koristiti), ali mi je veci problem kako definisati u takvoj tabeli datum zavrsetka rada u org. jedinici za nekog radnika koji je jos uvek u toj org. jedinici. Ostaviti to polje null? Da li ce to doneti neke probleme kasnije? Ili staviti neki datum koji je "dovoljno daleko u buducnosti al' se vidi da nije 'pravi'", npr. 1.1.2200. godine? Nijedno od ovih resenja mi ne deluje dovoljno "inteligentno" i fleksibilno... Kako to resiti?

Hvala unapred
 
Odgovor na temu

Getsbi

Moderator
Član broj: 124608
Poruke: 2831



+45 Profil

icon Re: Pocetnicki projekat za ucenje30.04.2008. u 22:31 - pre 195 meseci
Null vrednost je sasvim uredu za takav podatak jer se nezna unapred dokle će radnik raditi. Druga stvar. Za izveštaje gde trba dužina staža računa se do današnjeg dana. Za izveštaj o tome koji radnici trenutno rade u Department-u X, takođe je korektno (svi koji imaju polje DoDatuma sa vrednošću Null, a polje OdDatuma popunjeno).
Ako radiš istorijat i prošiuješ model onda je to svakako bolji način od fiktivnih datuma.
 
Odgovor na temu

_Mrgud_
Uros Todorovic
Novi Beograd

Član broj: 129681
Poruke: 21
*.vektor.net.



Profil

icon Re: Pocetnicki projekat za ucenje20.05.2008. u 03:51 - pre 194 meseci
Pre svega - hvala na dosadasnjim odgovorima, bili su od koristi.

Ali - saga se nastavlja. Stigao sam do pravljenja izvestaja, koji su se pokazali kao u najmanju ruku nocna mora, iz nekoliko razloga. Da krenemo prvo od najveceg problema pa kad/ako uspem da ispeglam ovo nastavicu i sa "sitnijim".

Dakle, obzirom na sve o cemu sam vec pisao, model je promenjen i sada izgleda ovako:



Pokusavam da napravim izvestaj, koji bi bio manje-vise po sistemu "sve zajedno". Grouping ide otprilike: Kompanija -> Department -> Radnik -> Edukacije koje je pohadjao sa svim detaljima (vreme, mesto, cene, sati... itd) + summary za svakog radnika, department i kompaniju. Imam posebnu formu sa koje pokrecem generisanje izvestaja na kojoj takodje imam i komada dva DTPicker kontrole kojima selektujem za koji vremenski period zelim izvestaj. Na osnovu vrednosti tih DTPicker kontrola pravim string koji cu proslediti kao filter za DoCmd.OpenReport.

Zelim da filtriram report tako da mi prikaze samo Edukacije koje su se u potpunosti dogodile unutar definisanog vremenskog perioda - dakle, Edukacija.Datum_pocetka >= pocetakIzvestaja AND Edukacija.Datum_zavrsetka <= zavrsetakIzvestaja. To je laksi deo price.

Takodje zelim i da filtriram recorde koji se prikazuju tako da svaki radnik koji je u tom periodu bio na edukaciji bude prikazan u sklopu odgovarajuceg departmenta, u skladu sa njegovom istorijom zaposlenja - ukoliko je radnik menjao department unutar perioda za koji pravim izvestaj treba da bude prikazan u onom departmentu u kojem se nalazio u trenutku kada je pocela edukacija. To i jeste moj glavni problem - kako postaviti uslov za to?

Uslov sastavljen od gorenavedenog uz dodatak AND (RDRel.DatumPocetka >= pocetakIzvestaja AND ((RDRel.DatumKraja <= zavrsetakIzvestaja) OR (RDRel.DatumKraja = NULL))) je prvo sto mi je palo na pamet, ali posle neuspele probe i malo dodatnog mudrovanja i analize - ocito je da je busan.

Postoji li jednostavan nacin da se ovo resi? Da li je uopste filter najbolje resenje za ovo?

Da proverim prvo moju logiku, pre nego sto krenem da brljam sa queryima i SQLom. Logika kaze: selektovati sve edukacije koje prolaze kroz filter - pocinju posle pocetka "izvestajskog" perioda i zavrsavaju se pre njegovog kraja. Selektujemo i sve radnike koji su bili na tim edukacijama. Sad je zadatak da se utvrdi "pripadnost" tih radnika departmentima - pretrazuje se tabela RDRel iz koje se vade svi redovi koji imaju ID_radnika koji je bio na edukaciji. Odbacujemo sve one redove u kojima je RDRel.DatumKraja < pocetakIzvestaja, posto su to "stari" rasporedi po departmentima i oni sigurno nisu validni za odredjivanje "pripadnosti". Problem predstavljaju oni radnici koji su imali "prekomandu" unutar perioda za koji radimo izvestaj. Posto zelim da znam kojem departmentu je pripadao radnik u trenutku pocetka edukacije izabracu onaj red za koji je Edukacija.Datum_pocetka izmedju RDRel.DatumPocetka i RDRel.DatumKraja ili je Edukacija.Datum_pocetka >= RDRel.DatumPocetka a RDRel.DatumKraja = NULL.

Da li uopste ispravno razmisljam il' da bataljujem ovo? :)

Btw, tako smo dosli do ispravke onog busnog dela uslova za filter: RDRel.DatumKraja >= pocetakIzvestaja OR RDRel.DatumKraja = NULL, ali jos uvek nisam najsigurniji kako celu pricu sprovesti u delo... :/

Elem, ja se raspisah i raspalih sa pitanjima... Ali, zelja mi je da budem jasan oko toga gde skripi.

Svaka pomoc je vise nego dobrodosla i hvala unapred.
 
Odgovor na temu

Getsbi

Moderator
Član broj: 124608
Poruke: 2831



+45 Profil

icon Re: Pocetnicki projekat za ucenje20.05.2008. u 06:22 - pre 194 meseci
Ako sam dobro shvatio na brzinu pročitan zahtev, ja bih prvo napravio podupit (Depts, RDRel, Radnici) koji se odnosi na pripadnost radnika departmentima u određenom vremenskom razdoblju. Onda bih taj podupit uvukao u glavni upit sa tabelama (Edukacija i radnikNaEdukaciji) takođe koristeći pomenuti period.
Bilo bi verovatno lakše da si zakačio model podataka sa malo testnih zapisa. Ali do večeras neću moći da se ozbiljnije pozabavim ovim, pa ako možeš, ti to prikači.
 
Odgovor na temu

[es] :: Access :: Pocetnicki projekat za ucenje

[ Pregleda: 3020 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

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