|
[ pmiroslav @ 20.11.2007. 06:29 ] @
| Pravim neku bazu za praćenje plana proizvodnje.
Napravio sam početnu tablicu PLAN koja ima polja ID_Plana; DatumPočetni; DatumZavršni.
Druga tablica je PLAN_DETALJI koja ima polja ID_Plana; ID_Proizvoda i polja za svaki mjesec u godini 1; 2; 3 i tako do 12. Polja za mjesece su numerička i u njih se unosi broj komada koji treba napraviti u tom mjesecu.
Napravio sam formu za unos kojoj je Record Source tablica Plan, a u njoj je Subform na temelju tablice Plan_detalji.
Sada me zanima dali netko ima ideju kako automatski puniti polja DatumPočetni i DatumZavršni, a na temelju upisanih podataka u polja za mjesece.
Zapravo na način ako je recimo kolona 1 i kolona 2 prazna, prvi unos u koloni 3 da mi se u poje DatumPočetni upiše 01/03/07., i ako je zadnji unos u koloni 10 da se u polje DatumZavršni upiše 31/10/07
|
[ Getsbi @ 20.11.2007. 10:56 ] @
Po meni bi trebalo postaviti jedno dugme na glavnoj formi, pa kad završiš sa unosom ili ispravkom detalja plana na to dugme pokrenuti VBA kod koji će da pretrči tabelu TblPlanUpis i u zavisnosti od toga koje su kolone popunjene, a koje ne za taj IDPlana, da to upiše u odgovarajuće datume u tabeli tblPlan. Na taj način ovi datumi ne trebaju da budu dostupni na glavnoj formi u modu za Unos ili Izmenu, već samo za Prikaz. Malo više koda ali trenutno ne vidim neko bolje rešenje.
[ pmiroslav @ 20.11.2007. 12:58 ] @
Getsbi
"VBA kod koji će da pretrči tabelu"
lako je to tebi reći...
[ Getsbi @ 20.11.2007. 14:44 ] @
Ažuriranje tabela smo elaborirali još u proleće koliko se sećam. Započni. Piši komentare unutar koda za ono što ne budeš znao da odradiš pa ćemo pomoći kad zagusti.
[ Zidar @ 20.11.2007. 14:48 ] @
Zidarev teorema, pretvorena u Chachkin aksiom: "The best code is no code at all"
Ako vec unosiš mesec kao redni broj, onda ti ne trebaju u tabeli kolone za DatumPocetni, datumZavrsni. Medjutim, to nije sve.
Ti dakle imas dve tabele:
PLAN (ID_Plana; DatumPočetni; DatumZavršni)
i Citat: PLAN_DETALJI koja ima polja ID_Plana; ID_Proizvoda i polja za svaki mjesec u godini 1; 2; 3 i tako do 12.
Dakle,
PLAN_DETALJI (ID_Plana, ID_Proizvoda, 1,2,3,4,5,6,7,8,9,10)
Iz ovoga sledi da je PLAN tabela "roditelj" a da je PLAN_DETALJI tabela "dete". Prvo mora da postoji PLAN, da bi se uopste nesto upisalo u PLAN_DETALJI. Kad vec moras da imas PLAN, zasto ne unesš DatumPočetni; DatumZavršni tada?
A ako unosiš prvo PLAN_DETALJI, pa ti iz toga slede (DatumPočetni; DatumZavršni) onda nesšto ne valja u dizajnu tabela.
Bolja konfiguracija bi bila:
PLAN_DETALJI (ID_Proizvoda, Godina, Mesec, PlaniranaKolicina) gde je PK = (ID_Proizvoda, Godina, Mesec)
ID_Proizvoda, Godina, Mesec, PlaniranaKolicina
1 2007 1 50
2 2007 1 38
1 2007 2 45
2 2007 2 35
Na ovaj nacin je sve jasno. Možeš tabelu da sosrtiraš po proizvodu i mesecima, možes po mesecu i svim proizvodima i slično.
A možeš lako i da dobiješ godišnji plan za svaki proizvod, najobičniji GROUP BY završava posao. Ako t baš trebaju DatumPočetni; DatumZavršni za određeni mesec možeš da ih dodš u kveri, nikako u tabelu.
I gde je ovde VBA kod? Nigde. Upravo smo pokazalz da važi teorema: The best code is no code at all.
Tvoj početni dizajn tabela je katastrofalno pogrešan na dva načina:
1. ponavljajuća polja u tabeli PLAN_DETALJI (nazivi meseca)
2. tabela koja liči da je roditelj, PLAN, nije roditelj uopšte nego neka vrsta agragatne tabele za tabelu PLAN_DETALJI
Deluje da si dizajn tabela preuzeo direktno iz Excela. Ako si student-učenik za ovo bi dobio slabu ocenu. Ako si profesionalac, mogao bi biti otpušten za ovakva rešenja
[ pmiroslav @ 20.11.2007. 19:05 ] @
Ne slažem se baš sa Zidarevim stavom po pitanju dizajniranja tabele za upis plana.
Ja sam tako i počeo ali sam odustao i napravio što on kaže kao Excell.
A evo zašto.
Ja recimo ako radim godišnji plan trebem upisati 100 proizvoda i za svaki proizvod kolićinu koja se treba napraviti u svakom mjesecu. To je 100 x 4 x 12 =4800 upisa da bi se napravio godišnji plan na temelju 100 proizvoda. A šta ako ih ima više?
Ovo bi bio velik napor za korisnika.
Zato ja mislim da je da je ovako sa poljem za svaki mjesec praktičnije jer je potrebno proizvod unositi samo jednom , a pokraj toga količine u nizu.
A što se tiče datuma sa kojim sam započeo temu to nije neki bitan podatak.
Ja njega sada unosim ručno i on mi treba da piše na početku izvještaja kao recimo
"Plan proizvodnje za razdoblje od 01/03/2007 do 31/11/2007."
pa sam htio da mi taj samoupis u ta polja djeluje malo šminkerski.
[ Zidar @ 21.11.2007. 18:34 ] @
Citat:
Ja sam tako i počeo ali sam odustao i napravio što on kaže kao Excell.
A evo zašto.
Ja recimo ako radim godišnji plan trebem upisati 100 proizvoda i za svaki proizvod kolićinu koja se treba napraviti u svakom mjesecu. To je 100 x 4 x 12 =4800 upisa da bi se napravio godišnji plan na temelju 100 proizvoda. A šta ako ih ima više?
Ovo bi bio velik napor za korisnika.
Ma ne moras da se slažes, tvoj program je tvoj program. Ne vidim jedino kako tvoj način smanjuje broj unosa. 100 x 12 = 1200 upisa vazi u svakom slucaju (odakle ti ono 4?). Za svaki proizvod mora se uneti 12 meseci, i na jedan i na drugi način. Jedino što drugačije izgleda na ekranu :-)
Ako ti baš treba da imas unos kao u Excelu, onda ga odradi u Excelu, pa importuj u Access i rasporedi u tabele onako kako treba. to ionako radiš jednom godisnje pa ne bi trebalo da je problem. Ne treba da žrtvuješ korektan dizajn baze zbog nezgodnog front enda. Slažem se da Excel izgleda "prirodnije" za unos ovakvih dokumenata. Dizajn baze nije isto što i dizajn front enda. Biće ti žao ako ne razmisliš o ovome šta sam ti rekao.
Srećan rad
:-)
[ pmiroslav @ 21.11.2007. 22:22 ] @
Nemoj me krivo razumjeti, ali ja pošaljem samo jedan mali segment svoje baze i ti po tome stvaraš zaključke o kvaliteti i daješ mi otkaz u firmi.
(odakle ti ono 4?).
(ID_Proizvoda, Godina, Mesec, Mesec)
1 x ID_Proizvoda
1 x Godina
1 x Planiranakoličina
1 x Mesec x 12
i sve to puta 100 proizvoda
[Ovu poruku je menjao pmiroslav dana 21.11.2007. u 23:32 GMT+1]
[Ovu poruku je menjao pmiroslav dana 22.11.2007. u 06:54 GMT+1]
[ Trtko @ 22.11.2007. 08:22 ] @
Pa nije problem sto se tiče upisati datume
ali ja sad ne kuzim u koju tablicu hoces da upise (tblplan)
u njoj imas samo Id_plana, planer, dat1, dat2, a gdje ti je siraproizvoda
jer koliko sam ja skuzio u nju hoces upisati datumod do datuma.
jel u tblplanupis imas za jedan idplana vise idproizvoda,
[ Zidar @ 22.11.2007. 14:07 ] @
Vidi ovako, ako tvoja tablica Plan, kloja je u stvari ovo:
Plan (ProizvodID, Kolicina za mesec 1, Kolicina za mesec 2, Kolicina za mesec 3....Kolicina za mesec 12)
nema nikakvu drugu ulogu osim da se u nju unesu kolicine, bas onako kako bi to uradio u Excelu, onda OK, moze kako god hoces.
Medjutim, za bilo sta drugo jednostavno nece ici, ne zato sto tako kaze Zidar i nije lepo teorijski nego zato sto fizicki ne moze.
Sto se tice unosa u propisno organizovanu tabelu
(ID_Proizvoda, Godina, Mesec, Kolicina)
ne ocekujes da poverujem da ce se podaci unositi direktno u tabelu? Onda bi bilo 4 podatka da se unese umesto 1. Verujem da znas sat su forme i subforme, pa kad su subforme bound, onda se vezni podaci sami od sebe 'upisuju', korisnik ne mora ni da ih vidi, i tako dalje. Jos jedan razlog da budem veoma zabrinut klvalitetom ponudjenog resenja.
Ostajem pri oceni kvaliteta i ponavljam - nacin na koji se cuvaju podaci u bazi i nacin na koji ih korisnik vidi ili unosi nisu identicni. U veoma prostim slucajevima mogu da izgledaju slicno, ali u realnom ziovotu nikad se ne desava tako nesto. Ako tabele dizajniras tako da su one ogledalna slika front enda ili nekakvih izvestaja, onda si promasio profesiju. Ovakva tabela plan je ekvivalentna jednoj tabeli koja bi cuvala podatke za recimo Fakturu, gde bi imao polja
Faktura (KupacID, FakturaID, Proizvod1, Kolicina1, proizvod2, Kolicina2,.....ProizvodN, KoliicnaN)
Tako nesto vec ne bi uradio. Ili cuvas fakture za kupca ovako:
FaktureKupca (KupacID, Faktura1, Faktura2, Faktura2,Faktura4... FakturaN)
gde su Faktura1,2,3...N ukupne vrednosti pojedinih faktura. Ne verujem da bi ti ikad palo na pamet da uradis tako nesto. A tvoja tabela Plan izgleda upravo tako, ako smao zamenis Faktura1 sa KolicinaZaMesec1.
Sev i da uradi tako, imena kolona poput '1','2','3' ne kazuju nista onom ko pogleda u tabelu. da li su '1','2','3' meseci? Ili su to radne ejdinice? Ili su to radnici koji ce proizvesti proizvode? Ili su to kupci? Ti znas da su u tvom slucaju '1','2','3' mesec, ali niko drugi to ne zna.
Nadam se da sad razumes gde gresis. Nemam nista licno prtotiv tebe i nije mi namera da vredjam ili bilo sta. Ne kazem da ti ne umes da radis. Kazem da si u ovom konkretnom slucaju napravio katastrofalnu gresku. Pokusavam da ti ukazem na gresku, a ti radi kako hoces. A moram da naglas kazem da ne valja, jer i drugi citaju ovaj forum, pa ako vide ovakvo resenje, i niko nema nista protiv, pomislice da se to tako zaista i radi. Ne radi se. A veruj mi da sam na ovom trulom zapadu imao priliku da vidim vise puta da se developer otpusti zbog neznanja. Ne odmah, ne u trenutku kad napravi katastrofalnu gresku u dizajnu, vec kasnije, kad sistem zariba u kriticnom momentu.
Kad sam nekad radio kao inzenjer, katastrofalne greske nisu bile toliko moguce, jer se sav rad podnosio na uvid nekome starijem i iskusnijem, po zakonu, i na kraju se radila nezavisna revizija projekta, gde je drugi inzenjer, iskusan i ovlascen (van nase firme) pokusavao na sve nacine da pronadje sta ne valja u projektu sta nije po zakonu i propisima i po pravilima struke. Nazalost, u IT industriji toga nema i svako radi sta hoce i svakome se veruje u pocetku. Ali se greske veoma skupo placaju. Kao sto inzenjeri moraju da postuju fizicke principe (inace kuce bi se rusile kao lude) tako i oni koji razvijaju informacione sisteme moraju da postuju logicka pravila o oragnizovanju podataka. Inace se sistemi ruse, bas kao i kuce i mostovi.
[ pmiroslav @ 22.11.2007. 18:02 ] @
Zidar veoma cijenim tvoje sugestije jer vidim da se razumiješ u problematiku.
Ja zapravo nisam pravi programer. Radim u maloj firmi koja nema sredstava za kupovanje gotovih baza podataka pa ja uz svoj posao radim Access baze koje olakšavaju posao meni i mojim kolegama. Nisam ni ja uvijek zadovoljan svojim rješenjima pa zato učestvovanjem na ovom forumu nastojim ih doraditi i popraviti.
Najčešće na forumu nastojim dobiti konkretan odgovor na konkretno pitanje i često ga i dobijem, na čemu sam zahvalan mnogima od kojih sam dobio odgovore koji su mi prosvijetlili vidike.
Moram priznati da baš i nisam vičan od početka pisati komplicirane codove već uglavnom koristim kodovima koje nađem u primjerima i pokušavam ih prilagoditi svojim potrebama.
Zato mi je problem kada dobijem odgovor od Getsbija (kome sam vrlo zahvalan na odgovorima kod nekih mojih prijašnjih tema)
VBA kod koji će da pretrči tabelu TblPlanUpis
U konkretnom primjeru o kojem se ovdje radi meni ovi podaci potrebni da bi iz baze koju sam već prije napravio izvukao zbirnik materijala koje je potrebno nabaviti za proizvode koji su obuhvaćeni planom i ništa više.
A ja to radim tako da u query-u zbrajam količine proizvoda po kvartalima jer se tako naručuje materijal.
1. kvartal = nz([1])+nz([2])+ nz([3])
2. kvartal = nz([4])+nz([5])+ nz([6]) ....itd.
I onda sa tim količinama množe količine materijala za 1 komad proizvoda koji već postoje u toj drugoj bazi te se pravi izvještaj za nabavu.
A rješenje koje sam napravio mi izgleda najjednostavnije i najbrže za unos tih količina.
I sada, ja sam samo pitao dali je moguće na temelju takovog unosa popunim polja za početni i završni datum na koji se plan odnosi i ništa više.
Ako je prva kolona u kojoj je postoji unos [3] da to bude 01/03/07.
Ako je zadnja kolona u kojoj postoji unos [10] da to bude 31/10/07.
P.S.
U prilogu šaljem primjer koji asm napravio po tvojim sugestijama i meni se još uvjek čini da je ovo puno kompliciranije za popunjavanje.
Molim komentar.
[Ovu poruku je menjao pmiroslav dana 22.11.2007. u 19:43 GMT+1]
[ Getsbi @ 22.11.2007. 19:14 ] @
Kad Getsbi kaže : “.......VBA kod koji će da pretrči tabelu TblPlanUpis“ onda misli da nisi sve zaboravio iz teme:
http://www.elitesecurity.org/t...odateke-iz-jedne-tablice-drugu
A kad kaže da započneš, pa ako ne bude išlo da napišeš u fusnote koda šta ne ide, a ti si zamislio da treba, onda tako i misli. Jer ako ti samo upeca ribu, a ne nauči te da pecaš, ti ćeš stalno dolaziti po još. :-)
Naravno da imam isto mišljenje o tabeli kao i Zidar i oko toga ne bih da se sporim ni sa njim ni sa tobom. Jednostavno za taj zadatak sa takvim "Excel uslovom" za unos koje si ti zahtevao ne vidim bolje rešenje. Možda eventualno umesto VBA koda nekoliko dobrih običnih upita i jedan akcioni.
Poznata mi je Zidareva teorema, pretvorena u Chachkin aksiom: "The best code is no code at all" . Vrlo simpatično. Podseća na onu kaubojsku: „Samo mrtav indijanac je dobar indijanac“.
VBA kod koristim kad god nemam bolje rešenje. I ne mislim uopšte da Bili plaća onoliku ekipu u MS-u uzaludno. Poštujem sve autoritet i na forumu i van njega što se Accessa tiče. Voleo bih da sam pametniji, ali eto nisam. :-)
U svakom slučaju pozdravljam odluku da prihvatiš Zidarevo rešenje oko modela jer bih i ja tako uradio.
[ pmiroslav @ 23.11.2007. 07:34 ] @
Evo konkretan pronlem.
Žalim da pri kopiranju podataka iz tablice u tablicu dobijem poruku nkojom ću kopiranje potvrditi ili odbaciti.
Međuti meni se podaci kopiraju bez obzira dali pritisnem OK ili Cancel
Private Sub Kopiranje_Click()
Dim Baza As Database
Dim Sl_Pocetna As Recordset
Dim Sl_Zavrsna As Recordset
Set Baza = CurrentDb()
Set Sl_Zavrsna = Baza.OpenRecordset("Zavrsna", dbOpenDynaset)
Set Sl_Pocetna = Baza.OpenRecordset("Pocetna", dbOpenDynaset)
MsgBox "podaci će biti kopirani", vbOKCancel
' Zelim da dugmetom Ok ili Cancel odlučim dali će se podaci kopirati
If vbOK Then
If Sl_Pocetna.RecordCount > 0 Then
Sl_Pocetna.MoveFirst
While Not Sl_Pocetna.EOF
With Sl_Zavrsna
.AddNew
![ID] = Sl_Pocetna![ID]
![Ime] = Sl_Pocetna![Ime]
.Update
End With
Sl_Pocetna.MoveNext
Wend
End If
Kraj:
Set Baza = Nothing
DoCmd.OpenTable "Zavrsna", acViewNormal, acEdit
Else
Exit Sub
End If
End Sub
[ Getsbi @ 23.11.2007. 11:15 ] @
U tom slučaju primeni sledeću strukturu:
If MsgBox("Dali ste sigurni da zelite da kopirate podatke", vbYesNo, "Paznja") = vbNo Then
Cancel = True
Else
' ovde je kod za brisanje
End If
ili
If MsgBox("Potvrdite knjizenje ?", vbYesNo, "Paznja") = vbNo Then
Exit Sub
End If
pa ovde iza radi kopiranje ako nije napustio proceduru.
[ pmiroslav @ 23.11.2007. 12:28 ] @
Hvala ovo sam rješio i radi.
Ali sad me opet pati drugi problem.
Sprečavanje unosa duplog podataka.
Znam da je ova teme več obrađivana ali a primjerima koje sam tamo našao nisam uspio.
Imama tablicu Trebovnice iz koje želim kopirati podatke u tablicu Rezervacije
Napravio sam kod za to i on radi , ali kako da spriječim da se upiše podatak koji ima isti broj trebovnice.
[ Getsbi @ 23.11.2007. 15:46 ] @
U žurbi nisam ni gledao šta hoćeš. Evo sad ću napisati kod.
Evo zakačio sam ispravljeno. Dodao sam tri sloga više (duplikate) u TblTrebovnice da vidiš da i dalje kopira samo 69.
[Ovu poruku je menjao Getsbi dana 23.11.2007. u 17:31 GMT+1]
[ pmiroslav @ 23.11.2007. 16:53 ] @
Zahvaljujem se.
[ Zidar @ 23.11.2007. 17:53 ] @
@Pmiroslav: dobro si poceo, ali sam morao da napravim neke sitne ispravke u mdoelu podataka.Pogledaj model pa uporedi sa onim od cega si poceo.
Napravio sam i deo interfejsa, mislim da ces razumeti ideju. Pazi kako je reseno da korisnici NE MORAJU da kucaju godinu i mesece kad unose plan. Kao i sto treba, kuca se samo kolicina. Ostalo se pripremi unapred. Obrati paznju na tabelu tblMeseci i kolonu Kvartal. Daja li ti to neku ideju kako da iz tabele tblDetaljiPlana dobijes na primer kvartalne planove, jednostavnim kverijem, bez funkcija i rekordseta?
Da ne bi nas sve izgledalo prosto i bez programiranja, i u mom resenju ima programiranja, ne mnogo, ali nije ni zanemarljivo.
Ako zaista moras da radis excel-like unos, ond apreporucujem da to zaista i odradite u Excelu, pa onda sve konvertuj u normalizovanu bazu. Mislim da obicna transpozicija u excelu moze ovo da odradi. Ako ne, 12 kveriaj ce odraditi posao u roku od 10 minuta sve skupa. Jednom godisnje. Nije los kompromis izmedju zgodnog unosa i pravilnog dizajna baze.
:-)
[ Getsbi @ 23.11.2007. 18:23 ] @
Odlično urađeno. Ja da sam na Miroslavovom mestu poslao bih gajbu piva putem pp. :-)
Najviše mi se dopada frmPlanskaGodina. Eventalno bih u konačnoj verziji na glavnom meniju za korisnike dodao ikonice za filtriranje, sortiranje kao i one za uklanjanje filtriranja i sortiranja.
[Ovu poruku je menjao Getsbi dana 23.11.2007. u 20:51 GMT+1]
[ pmiroslav @ 23.11.2007. 20:25 ] @
Zidar svaka čast na trudu.
Inpresionira sam sa uratkom.
Da sam ja znao to tako napraviti onda se ni ja ne bi zadržavo na onom mom Excel dizajnu.
Gdje da pošaljem pivo i koje piješ
[ Zidar @ 23.11.2007. 22:01 ] @
Citat: Da sam ja znao to tako napraviti onda se ni ja ne bi zadržavo na onom mom Excel dizajnu.
Ko pita, ne skita  Zato postoji forum da unapredimo znanje i podelimo iskustvo.
Ponekad nam se neka ideja učini dobrom, pa pođemo u tom pravcu, napravimo nekoliko koraka i zaglavimo se. Često se ispostavi da nije greška u koraku na kome ti se čini da si se zaglavio, nego negde ranije. U našem poslu greška je običnu u dizajnu tabela. Ako je model podataka (dizajn baze) dobar, onda se nemogući zahtevi retko pojavljuju. Čim imaš problem koji ti nisu majstori na forumu rešili u dva poteza, pogledaj ponovo u dizajn baze.
Kao što rekoh, ništa lično, samo ponekad moram da se razgalamim ako mi se učini da je odstupanje od dobre prakse preveliko, zbog ostalih koji posmatraju šta se dešava na froumu. Ponekad, ako odeš predaleko u pogrešnom pravcu, teško je ili čak nemoguće vratiti se natrag. A toga ima toliko da se ne da opisati.
Ti radiš praćenje neke fabričke proizvodnje kako mi izgleda. Imaćeš problema sa hijerarhijama (to smo već videli  ali to je drugačije, zbog slabosti Accessa u radu sa hijererhijama. Ako imaš prilike da pređeš na neki SQL sitem (Oracle, MS SQL, Firebird, Postgress) bilo bi ti lakše u tom delu.
Srećan rad, nastavi sa pitanjima jer ti je tematika interesantna i nekako ćemo ti već pomoći.

[ pmiroslav @ 24.11.2007. 14:00 ] @
Pitanje za Getsbija.
Ja sam pokušao u kodu za kopiranje iz tablice u tablicu doadati MsgBox sa porukom da neki pdaci nisu kopirani jer taj broj trenovnice več postoji ali me ne uspjeva jer ne znam u kojem djelu koda da ga stavim.
Pokušao sam na par mjesta gdje sam je mislio da bi poruka mogla ići ali mi uvjek ona ostane u petlji pa se ne može ugasiti.
[ Getsbi @ 24.11.2007. 15:02 ] @
Zaustaviće se onoliko puta u petlji i pokazati poruku koliko nađe duplih Izdatnica. Ako nećeš da se svaki put zaustavi već samo na kraju, onda bi umesto koda koji sam dodao iza klauzule Else trebalo napuniti neku privremenu tabelu sa brojevima duplih Izdatnica i nakon izlaska iz petlje While Not ......Wend prikazati tu tabelu.
[ pmiroslav @ 24.11.2007. 15:33 ] @
Hvala stvarno si brz.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|