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

azuriranje zapisa u tabeli. Veoma pocetnicko pitanje.

[es] :: Access :: azuriranje zapisa u tabeli. Veoma pocetnicko pitanje.

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

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

aburnaby
Staniša Avdalović
Subotica

Član broj: 49743
Poruke: 43
*.vojvodinaput.co.yu.



+22 Profil

icon azuriranje zapisa u tabeli. Veoma pocetnicko pitanje.21.03.2005. u 11:35 - pre 232 meseci
Interesuje me kako da azuriram polje kolicina u tabeli kartica_materijala.
Imam tri povezane tabele. Prva je tabele kartica_materijala i ona ima sledeca obelezja: id_materijala, naziv, jm, kolicina. Druga je tabela primka koja ima sledeca obelezja: idprimka, datum, id_materijala, kolicina. Treca je tabela izdatnica koja ima sledeca obelezja: idizdatnica, datum, id_materijala, kolicina.
Kada magacioner izda primku onda se smanjuje kolicina materijala u tabeli kartica_materijala za onoliko za koliko je izdao. Kada magacioner zaprimi materijal preko primke onda dolazi do porasta kolicine tog materijala u tabeli kartica_materijala.

Molim za pomoc kako da ovo izvedem u Accessu. Napominjem da mi je potrebno crtati:)
 
Odgovor na temu

Zidar
Canada

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



+79 Profil

icon Re: azuriranje zapisa u tabeli. Veoma pocetnicko pitanje.21.03.2005. u 14:03 - pre 232 meseci
Polje 'Kolicina' u tabeli Kartica materijala ti uopste ne treba. Tabele Primka i Izdatnica imaju sve podatke koji ti trebaju. Kolicina na kartici materijala kao prikazuje trenutno stanje u magacinu. To se stanje moze izracunati u svakom momentu, sumiranjem kolicina u tabelama Primak i Izdatnica. Teorijski, imas ovo:

Stanje= SUM(Primka.Kolicina)-SUM(Izdatnica.Kolicina)

Prakticno, trebaju ti kveriji:

qrySuma_Primka: SELECT id_materijala, SUM(Kolicina) AS SumPrimka FROM Primka

qrySuma_Izdatnica: SELECT id_materijala, SUM(Kolicina) AS SumPrimka FROM Izdatnica

qryStanje: SELECT M.Id_Materijala,
FROM Kartica_Materijala AS M
LEFT JOIN Primka AS P ON P.id_materijala=M.id_materijala
LEFT JOIN Izdatnica AS I ON I.id_materijala=M.id_materijala

Polje Kolicina u tabeli Kartica_Materijala je greska u dizajnu baze. Kad se radilo samo sa papirima, to polje je imalo svrhu na stvarnoj, papirnoj kartici, jer je olaksavalo brojanje, uz uslov da se redovno azurira. Kad se dizajnira baza, ne treba 100% bukvalno preslikati sve dokumenta koji postoje u sistemu pre baze ('paper bases system'). Kad bi radio u MS SQL ili Oracle, jos i nekako bi se moglo prihvatiti polje koje je rezultat proracuna baziranih na drugim tabelama. U Accesu se to debelo ne preporucuje, jer je prakticno nemoguce obezbediti da ne dodje do gresaka. Kroz forme i event procedure bi morao da azuriras tabelu, sto nije 100% pouzdano, a na kraju krajeva je NEPOTREBNO. Ako te zanima koliko kog materijala ima na lageru, startuj kveri qryStanje i procitaj ga za trazeni materijal. Ako usvojis ovaj pristup, tvoja aplikacija postaje veoma jednostavna - unos u tabele Primka i Izdatnica. Sve ostalo radi kompjuter.

Cilj tvoje Access aplikacije i baze podataka je da odgovori na pitanje Koliko materiajla ima trenutno na skladistu', a ne da azurira polja po tabelama. Na ovo pitanje se moze odgovoriti i bez uvodjenja polja koje se izracunava na osnovu vrednosti u nekim drugim tabelama. Posto za odgovor na ovo pitanje aplikacija mora da negde zabelezi sta je uslo i izaslo iz magacina, naravno da ti trebaju tabele koje cuvaju podatke o ulazu i izlazu i neki interfejs za unos tih podataka. Ni u kom slucaju nije svrha tvoje aplikacije 'da omoguci unos podataka o ulazu i izlazu u magacin'. Ne, glavno pitanje je 'pracenje stanja u magacinu', sve ostalo je samo nacin, mehanizam koji omugucuje odgovor na glavno pitanje.

Usput, 35 godina sam ziveo u staroj YU, mnogo vremena proveo u Hrvatskoj i Bosni i nikad nisam cuo reci kao 'primka', 'izdatnica', kad ih bre pre izmisliste :-)))
 
Odgovor na temu

aburnaby
Staniša Avdalović
Subotica

Član broj: 49743
Poruke: 43
*.vojvodinaput.co.yu.



+22 Profil

icon Re: azuriranje zapisa u tabeli. Veoma pocetnicko pitanje.22.03.2005. u 08:45 - pre 232 meseci
Hvala na zaista iscrpnom i ekspresivnom odgovoru.
Prva dva query-ja rade savrseno, medjutim zadnji query prikazuje gresku.
Prva dva reda prikazanog query-ja (select m.id_materijala from materijal as m
left join primka as p on p.id_materijala = m.id_materijala) rade medjutim kada dodam drugi spoj:
left join izdatnica as i on i.id_materijala = m.id_materijala dobijam za rezultat gresku u sintaksi. Osim toga query prikazuje samo id_materijala ali ne i nazive materijala i kolicine.

select m.id_materijala from materijal as m
left join primka as p on p.id_materijala = m.id_materijala
left join izdatnica as i on i.id_materijala = m.id_materijala

Zahvaljujem se unapred za svu pomoc.
 
Odgovor na temu

aburnaby
Staniša Avdalović
Subotica

Član broj: 49743
Poruke: 43
*.vojvodinaput.co.yu.



+22 Profil

icon Re: azuriranje zapisa u tabeli. Veoma pocetnicko pitanje.22.03.2005. u 09:35 - pre 232 meseci
Evo probao sam sledeci upit za dobijanje stanja zaliha:

select m.naziv, p.kolicina-i.kolicina as "stanje zaliha"
from materijal m, primka p, izdatnica i
where m.id_materijala = p.id_materijala
and m.id_materijala = i.id_materijala

Problem sa ovim upitom je sto ne dobijam grupisane podatke po nazivu artikla/materijala.
Probao sam sa GROUP BY m.naziv klauzulom medjutim ne funkcionise:)
 
Odgovor na temu

Zidar
Canada

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



+79 Profil

icon Re: azuriranje zapisa u tabeli. Veoma pocetnicko pitanje.22.03.2005. u 14:09 - pre 232 meseci
OOPs, izvinjavam se za qryStanje, kucao sam direktno u poruku i upotrebio MS SQL sintaksu. Access trazi zagrade oko prvog JOINa. Pokusaj sam da napravis qryStanje. Postavi tabelu Kartica_Materijala i dva dobra kverija u query design window, pa spoji tabeli Kartica_Materijala po polju Materija_ID sa obadva kverija. Onda klikni na svako ud veza i izaberi kveri koji ti pokazuje 'sve iz Kartica_Materijala i samo postojece iz drugog kverija'.

Ako ti ne ide, pogledaj attachment.

Uoci da svuda postojo PK, i da su mnoga polja indeksirana. Uoci isto tako da su postavljene relacije izmedju tabela (Relationships window). Indeksi i postavljene relacije ti stede ogroman posao u programiranju. Ne moras da brines od duplikatima, ne moras da brines da li je neko uneo u tabelu Primka Id_materijal koji ne postoji i slicno. Jeste da su poruke o greskama na engleskom, ali su bar greske sprecene.

Prikačeni fajlovi
 
Odgovor na temu

aburnaby
Staniša Avdalović
Subotica

Član broj: 49743
Poruke: 43
*.vojvodinaput.co.yu.



+22 Profil

icon Re: azuriranje zapisa u tabeli. Veoma pocetnicko pitanje.01.04.2005. u 08:32 - pre 231 meseci
Zidar,

sa manjim zakasnjenjem, zelim da Vam se zahvalim na velikodusnoj pomoci oko mojih pocetnickih pitanja o Access-u.
 
Odgovor na temu

aburnaby
Staniša Avdalović
Subotica

Član broj: 49743
Poruke: 43
*.vojvodinaput.co.yu.



+22 Profil

icon Re: azuriranje zapisa u tabeli. Veoma pocetnicko pitanje.04.04.2005. u 11:46 - pre 231 meseci
Sve prethodno receno radi sjajno (qrystanje, qry_primka, qry_izdatnica...) medjutim sada imam sledeci problem:) Ako magacioner zaprimi odredjeni broj artikala on moze (sto je nelogicno i nesme biti dozvoljeno) da izda vise stavki nekog artikla nego sto je ima na zalihi), npr. ako ima 100 jabuka, prethodno resenje programa mu dozvoljava da izda vise od 100 jabuka. Interesuje me kako da napravim proceduru koja bi proveravala stanje zaliha pre operacije izdavanja.
 
Odgovor na temu

Kiro
Akir Žalić
BiH

Član broj: 19085
Poruke: 114
*.as54.bi.bih.net.ba.

Sajt: www.icentar.ba


Profil

icon Re: azuriranje zapisa u tabeli. Veoma pocetnicko pitanje.04.04.2005. u 14:37 - pre 231 meseci
Vjerovatno imaš formu (broj izlaza, datum itd na osnovu nekog upita ili tabele) i
SubFormu (artikal, količina, cijena, iznos itd. na osnovu upita u kome izračunavaš iznos)
Ja bih tu ubacio polje stanje iz upita qrystanje (mislim da može biti Visible=No) i na polje količina stavio na AfterUpdate proceduru:

Code:
Private Sub količina _AfterUpdate()
If Me. količina > Me. stanje Then
    MsgBox "Unijeli ste vecu kolicinu od stanja koje imate u skladistu!", vbAlert, "Prodaja nije moguca ili neki drugi tekst.."
    DoCmd.CancelEvent
    Me. količina = 0 ' ili = Me.stanje – ne znam radi li ovo pogledaj
End If
End Sub


Nadam se da će ti pomoći
Kiro
 
Odgovor na temu

aburnaby
Staniša Avdalović
Subotica

Član broj: 49743
Poruke: 43
*.vojvodinaput.co.yu.



+22 Profil

icon Re: azuriranje zapisa u tabeli. Veoma pocetnicko pitanje.05.04.2005. u 08:25 - pre 231 meseci
Hvala na pomoci.
Na zalost nisam resio, jos uvek, problem.

Inace imam query qry_ukupno(intMaterijalID, chrNaziv, sumPrimka, sumIzdatnice) i form frmIzdatnice(intIzdatnicaID, intOdelenjeID, dtmDatum) i subform fsubIzdatnice(intIzdatnicaID, intMaterijalID, intKolicina, intRadniNalog).

 
Odgovor na temu

Zidar
Canada

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



+79 Profil

icon Re: azuriranje zapisa u tabeli. Veoma pocetnicko pitanje.05.04.2005. u 18:12 - pre 231 meseci
mala korekcija Kirinog odgovora - umesto AfterUpdate, upotrebi BeforeUpdate za formu fsubIzdatnice. beforeUpdate moze da se kanceluje ako je ispunjen neki uslov, ato je ono sto tebi treba. nesto kao ovo (kucano direktno u poruku, upotrebi samo kao ideju, moe da bude sintaksnih gresaka)

Code:

Private Sub form _BeforeUpdate()

dim intSumPrimka int  'mozda je bolje long nego int ?
dim intSumIzdatnica int
dim intStanje int

'Izracunaj koliko si do sada primio i izdao robe
intSumPrimka = DSUM("Kolicina","Primka","MaterijalID=" & me!IntmaterijalID)
intSumIzdatnica = DSUM("Kolicina","Izdatnica","MaterijalID=" & me!IntmaterijalID)
'evo ti stanje za tekuci materijal:
intStanje = intSumPrimka - intSumIzdatnica 
'intStanje je stanje PRE nego se tekuci rekord doda u tabelu

'proveri da li imas dovoljno robe da izdas:
if me!intKolicina > intStanje then
Cancel=TRUE   'ako izdajes vise nego sto ima, e ne moze
MsgBox "Na lageru ima " & intStanje & " komada. ne mozete da izdate " & me!intKolicina 
end if
End Sub


Kveriji iz jedne od prethodnih poruka (obrati paznju na qryStanje, prvi put sam zaboravio najvaznije polje - Stanje)
Code:

qrySuma_Primka: SELECT id_materijala, SUM(Kolicina) AS SumPrimka FROM Primka

qrySuma_Izdatnica: SELECT id_materijala, SUM(Kolicina) AS SumIzdatnica FROM Izdatnica

qryStanje: SELECT M.Id_Materijala, SumIzdatnica, SumPrimka , 
[SumPrimka] - [SumIzdatnica] AS Stanje
FROM Kartica_Materijala AS M
LEFT JOIN Primka AS P ON P.id_materijala=M.id_materijala
LEFT JOIN Izdatnica AS I ON I.id_materijala=M.id_materijala


Umesto Dsum funkcija mozes da citas stanje za zadati MateriajlId iz qryStanje. Napisi funkciju koja otvori rekordset za zadati materiajlID i vrati qryStanje.Stanje.

Bilo sta da uradiis, glavna caka je u tome da PRE snimanja rekorda proveris da li je uneta kolicina OK, tako sto ces odnekud da procitas satanje za tekuci materijal. Ako je OK, pusti da prodje transakcija, ako nije, obustavi postupak.

Posto imas formu sa subformom, imaces uvek jedan potencijalni problem. moze se desiti da imas rekord u tabeli Isdatnica i ni jedan rekord u tabeli IzdatnicaDetalji. To nazalost ne moze da se spreci. Mozes ili da povremeno pronadjes sve Primke/Izdatnice koje namju nijednu stavku, pa da vidis sta ces, ili da menjas strukturu aplikacije - imas temp tabelu za main form, i temp tabelu za subform, pa kad sve napravis lepo, kliknes dugme i sve se prepise u glavne tabele. Ja bih radio ono prvo - kveri koji pronalazi sve primke.izdatnice bez stavki, jednostavnije je.

 
Odgovor na temu

Kiro
Akir Žalić
BiH

Član broj: 19085
Poruke: 114
*.as54.bi.bih.net.ba.

Sajt: www.icentar.ba


Profil

icon Re: azuriranje zapisa u tabeli. Veoma pocetnicko pitanje.05.04.2005. u 19:11 - pre 231 meseci
Ma znao sam da ce od Zidara doci pravi odgovor. Nije vezano za ovu temu ali htio bih Ti se zahvaliti jer sam od tvojih postova puno naucio a skoro cijeli forum sam pregledao.
Kiro
 
Odgovor na temu

Zidar
Canada

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



+79 Profil

icon Re: azuriranje zapisa u tabeli. Veoma pocetnicko pitanje.05.04.2005. u 21:57 - pre 231 meseci
Hvala ti Kiro za pohvale, ali opet sam dao pogresne kverije:
Ne valja:
Code:

qrySuma_Primka: SELECT id_materijala, SUM(Kolicina) AS SumPrimka FROM Primka

qrySuma_Izdatnica: SELECT id_materijala, SUM(Kolicina) AS SumIzdatnica FROM Izdatnica

qryStanje: SELECT M.Id_Materijala, SumIzdatnica, SumPrimka , 
[SumPrimka] - [SumIzdatnica] AS Stanje
FROM Kartica_Materijala AS M
LEFT JOIN Primka AS P ON P.id_materijala=M.id_materijala
LEFT JOIN Izdatnica AS I ON I.id_materijala=M.id_materijala


Treba ovako:
Code:

qrySuma_Primka: 
SELECT id_materijala, SUM(Kolicina) AS SumPrimka FROM Primka GROUP BY id_materijala

qrySuma_Izdatnica: 
SELECT id_materijala, SUM(Kolicina) AS SumIzdatnica FROM Izdatnica GROUP BY id_materijala


qryStanje: 
SELECT M.Id_Materijala, SumIzdatnica, SumPrimka , 
NZ([SumPrimka],0) - Nz([SumIzdatnica],0) AS Stanje
FROM Kartica_Materijala AS M
LEFT JOIN qrySuma_Primka AS P ON P.id_materijala=M.id_materijala
LEFT JOIN qrySuma_Primka AS I ON I.id_materijala=M.id_materijala


qrySuma_Primka - pokaze ti koliko si materijala ukupno primio
qrySuma_Izdatnica - koliko si materijala izdao
qryStanje - prikaze razliku od primljenog i izdatog jer je
Stanje=SUM(Ulaz)-SUM(izlaz)
i to vazi za magacin, za blagajnu, za sve slicne slucajeve.

LEFT join je za slucaj kad imas samo ulaz a jos nemas izlaz. Kad ne bi bio LEFT join, rekord za koji nema ulaza ili izlaza bi bio preskocen. Funkcija Nz pretvara potencijalne NULL vrednosti u numericke nule (zero, 0.00)

Izvinjavam se za muke prouzrokovane kopiranjem mojih traljavo napisanih kverija.

:-)



 
Odgovor na temu

[es] :: Access :: azuriranje zapisa u tabeli. Veoma pocetnicko pitanje.

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

Postavi temu Odgovori

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