U prethodnom postu imas za pitanja 1) i 2). Da vidimo sad
Citat:
3) nacin dovodjenja na ekran zapisa knjige koju treba razduziti (rijeseno preko
combo-boxa, ali mislim da nije bas zgodno da se na formi vidi AutoNumber zapisa
posto mi on odredjuje odredjeno zaduzivanje knjige.
Umesto "dovodjenja na ekran zapisa knjige koju treba razduziti", meni se vise svidja sledece. Zamisli kveri koji lista sve rekorde iz tebele Poslovanje, za zadati Brc. Taj kveri ce da pokaze sve knjige koje je ikada uzeo clan Brc. Tebe zanimaju nerazduzene, pa ces da ubacis WHERE u kveri i tako dobijes samo nerazduzene knjige za datog Brc. Dakle,
Citat:
qryNerazduzeni =
"SELECT IDZAPISA,Brc,InvBr,DatZad,DatRazd WHERE DatRazd IS NULL".
Mozes da dodas JOIN na Knjige pa da ubacis i naslov knjige. Napravis datasheet formu baziranu na ovom kveriju, naprimer frmNerazduzeni_DS. Sad ovu formu stavis kao subformu na frmClanovi, a isto tako i na formu frmKnjige. Kad god se pozicioniras na nekog clana, vidis njegove nerazduzene knjige. Kako niko nema stotine nerazduzenih knjiga, verovatno je da ces ih sve videti na jednom ekranu. Onda lepo pogledas knjigu koju je tvoj Brc doneo da razduzi i pogledas na ekran i vidis koja je to knjiga u pitanju. Kako da je razduzis? Razduzivanje ima dva koraka:
1) Upisi DatRazd u odgovarajuci zapis u tabeli Poslovanje
2) U tabeli knjige postavi Stanje=Stanje+1
Hoces ovo da "Undo"? prosto,
1) Postavi DatRazd=NULL [bold](tvoja procedura Command53_Click() kaze DatRazd="" sto NE VALJA, DatRazd je DateTime podatak i ne moze da primi "")[bold]
2) U tabeli knjige postavi Stanje=Stanje-1
Samo razduzenej bi mogao da uradis direktno u subformi - jednostavno upises datum razduzenja. Odustajes? Obrisi datum razduzenja. Problem je promena stanja. Ovo su vezane operacije i moraju da se izvrse ili obadve ili ni jedna. Razduziti knjigu a ne promeniti stanje nema smisla. Zato se mora raditi TRANSAKCIJA, koja sadrzi obe ove operacije i ako se negde desi greska, obe operacije se ponistavaju (ROLLBACK).
Trebaju ti dve funkcije, koje ces da pozoves po potrebi sa tvoje forme ili subforme. prvo funkcije. Kod pisem napamet, direktno u poruku, pa moze da zapne, ali tro ti je ideja:
Code:
public function Razduzi(lngIDZAPISA as long, lngBrknjige as long, datDatRazd as Date) as boolean
ON ERROR goto ERROR_CODE
dim db as DAO.database
dim rs as DAO.recordset
dim rsStanje as DAO.recordset
dim strSQL as string
dim strSQLstanje as string
dim flgInTransaction as boolean
set db=currentdb()
strSQL = "SELECT IDZAPISA, DatRazd FROM Poslovanje WHERE IDZAPISA=" & lngIDZAPISA
strSQLstanje="SELECT Stanje FROM Knjige WHERE InvBr=" & lngBrknjige
set rs=db.openrecordset(strSQL )
set rsStanje=db.openrecordset(strSQLstanje)
Begin Transaction
flgInTransaction = TRUE
'razduzimo knjigu
rs.edit
rs!DatRazd = datDatRazd
rs.update
'promenimo stanje
rsStanje.edit
rsStanje!Stanje=rs!Stanje+1
rsStanje.Update
Commit Transaction
EXIT_HERE:
OnError resume next
rs.close
rsStanje.close
set db=nothing
Exit function
ERROR_CODE:
if flgInTransaction then
Rollback Transaction
endif
select case err.number
case else
MsgBox Error.description, Title:="Error " & err.number & " in Razduzi()"
resume EXIT_HERE:
end select
end function
Funkcija "PonistiRazduzenje" izgleda isto, sem sto ide
Code:
rs.edit
rs!DatRazd = NULL
rs.update
'promenimo stanje
rsStanje.edit
rsStanje!Stanje=rs!Stanje-1
rsStanje.Update
Ove funkcije pozivas na neki zgodan nacin i saljes im parametre. Na primer, u subformi frmNerazduzeni_DS, mozes da pozivas funRazduzenje posto uradis DoubleClick() na DatRazd, a funPonistiRazduzenje mozes da pozivas sa DoubleClick na DatZad.
Toliko o ucenju nekih novih nacina da se rese problemi. Sto se tice dizajna baze, o tome detaljnjie neki drugi put. Ovo je OK za vezbu ali u praksi bi bilo katasrofa, posle samo nedelju dana rada. Dobar dizajn bi te oslobodio razmisljanja o brojanju knjiga i azuriranjustanja kad god se knjiga uzneme ili vrati. A sta ces kad ti neko ostavi kjigu na stolu i ode kuci. Ko je razduzio knjigu? Znamo da je Stanje=Stanje+1, ali koga da razduzimo? O tome drugi put, za sada imas dovoljno zabave, a ja moram da nesto i radim da zaradim platu.
:-)