|
[ Mr. Rejn @ 19.01.2007. 13:54 ] @
| Da li moguće uneti slog u DBGrid a ne postovati odmah podatke na server, tj.
unositi više stavki, pa tek onda sve to postovati odjednom? Drugim rečima,
može li se zaobići onaj Post() odmah po unosu sloga direktno u DBGrid. |
[ X Files @ 19.01.2007. 17:30 ] @
Koliko je meni poznato (nisam 100% siguran), tako nešto nije moguće na direktan način. Naime,
TDBGrid je data-aware komponenta, koja *mora* da poštuje pravila o indeksima, ključevima i sl.,
koji su prosleđeni od baze. Drugim rečima, ne može se ići dalje dok trenutni slog ne ispuni uslov
o projektovanoj ispravnosti. Kada bi to bilo moguće, onda bi to značilo da se privremeno narušava
intergritet, što je van pameti.
Zaobilazno rešenje je moguće. Na primer, uvek možeš napraviti privremenu (lažnu) tabelu istog
formata, koja bi služila za unos. Možeš da iskoristiš (pretpostavljam) isti DBGrid, koji ćeš usmeriti
na drugi DataSource.
Dakle, stisneš neki EDIT koji kopira stvarne podatke iz prave tabele u privremenu. Grid usmeriš
na taj novi DataSource. Lažna tabela ima npr manje provera, i sl.
Kada je sve završeno, nekim tasterom Save, možeš pokušati da snimiš (preneseš) redom sve slogove
iz privremene tabele/grida. Ono što se uspešno Post()uje, neka se ukloni, a ono što ne može neka
ostane u tom privremenom gridu za proveru.
Ukoliko su svi upisi bez izuzetka bitni, onda koristi sesije/transakcije.
[ aleksandarpopov @ 19.01.2007. 18:06 ] @
Ako koristis TClientDataset i dbExpress,TAdoQuery i ostale ADO komponente tada je moguce 100%.
Za ado queryje stavi da ti je zakljucavanje bacth optimistic, to mozes u dizajneru. Kada okines upit,tada prevlacis podatke na klijenta, on menja podatke i zatim postuje promene serveru. Pogledaj metodu UpdateBatch kod Ado datasetova i njegovih naslednika - sluzi za postovanje promena.
Pozdrav.
[ IDE @ 19.01.2007. 20:42 ] @
hmmm... meni batch optimictic i UpdateBatch nije radilo valjano...
Jedino sto mi se pokazalo elegantno i 100% kvalitetno je zapocinjanje transakcije i njen commit ili rollback...
Mr. Rejn , Moj je prijedlog da se tako odradis ovo...
[ Mr. Rejn @ 19.01.2007. 21:17 ] @
Citat: aleksandarpopov: Ako koristis TClientDataset i dbExpress,TAdoQuery i ostale ADO komponente tada je moguce 100%.
Ne, ja furam IBX ..
Citat: IDEJedino sto mi se pokazalo elegantno i 100% kvalitetno je zapocinjanje transakcije i njen commit ili rollback...
Ma tako i sada radim,u dve faze, nego u kakvoj je to vezi sa unošenjem više slogova u dbgrid pre commit-ovanja?
Jer situacija je zeznuta: podaci koji se unose preko dbgrid-a su podaci iz Detail tabele, a podaci u prvom delu forme su podaci iz Master tabele..
što znači da podatke iz dbgrida (Detail) ne možeš uneti ako nemaš ID Master zapisa, ali njega nemaš jer ga još nisi ni napravio-to mu dođe kao problem
kokoške i jajeta (na oko).
Ovo je postupak:
1) Unose se podaci koji pripadaju Master tabeli u formu, bez Post()
2) Zatim se unose podaci koji pripadaju Detail tabeli u dbgrid, ali više slogova bez Post()-a (zato sam pitao o unosu stavki bez post-a u dbgrid jer bi to i
omogućilo celu ovu stvar)
3) U jednoj akciji (npr. dugme Potvrdi ili sl.) zatim procedura vraća ID Master zapisa koje onda koriste one stavke koje su unesene u dbgrid i koje sada
bivaju Post()-ovane (Master podaci su već post-ovani jer je vraćen ID).
[ IDE @ 19.01.2007. 21:44 ] @
pa imao sam jedan slican problem kao ti jednom...
I meni je trebalo da se sve unese u DBGrid i onda se sve odjednom sacuva...
Problem sam rijesio tako sto sam radio onaj Post(), ali sa prethodno zapocetom transakcijom, i dodje ti na isto...samo na kraju potvrdis unos sa commit....
Ja nisam sve pojedinosti ni shvatio koje su tebi problem, samo kazem da, ako ima sanse da to uradis na ovaj nacin, da o tome razmislis....
[ aleksandarpopov @ 19.01.2007. 21:53 ] @
Sa ibx nisam nikada radio....ali mora da ima neku varijantu kesiranog update-a...
Koliko dugo ti traje jedna transakcija? Sve dok korisnik menja podatke ili ... ? Mislim da ti to bas nije najsrecnije resenje... trudi se uvek sto krace da drzis konekciju otvorenom...samo toliko da okines upit ili postujes izmene...
Ti podatke ne unosis u grid, ti ih unosis u dataset preko grida :).
Programski onemoguci korisnika da unosi podatke detalja ako nema unetog sloga u glavnom queryju...nema tu bas mnogo filozofije sa kokom i jajetom - jednostavno onemoguci unos detalja ako nema glavnog sloga,naravno kesirano, sve ovo bez posta. Nakon unosa korisnik snima ili otkazuje izmene.
Nisam bas primetio neke probleme sa ovakvim pristupom do sada...mada u zadnje vreme vise koristim C#.net, malo sam se manuo bcb i delphija...u .NET u ako koristis datasetove, sve radi na uglavnom na ovaj fazon.
[ Mr. Rejn @ 19.01.2007. 23:30 ] @
Citat: aleksandarpopov:
Koliko dugo ti traje jedna transakcija? Programski onemoguci korisnika da unosi podatke detalja ako
nema unetog sloga u glavnom queryju...jednostavno onemoguci unos detalja ako nema glavnog
sloga,naravno kesirano, sve ovo bez posta. Nakon unosa korisnik snima ili otkazuje izmene.
U tome i jeste stvar, ne počinje se transakcija već korisnik samo unosi podatke na formu, pa se
zatim u jednom koraku sve postuje...(pri tome procedura mora da vrati ID master zapisa kako bi ga
iskoristili oni slogovi uneti u dbgrid, ali se to sve dešava jedno za drugim kao što rekoh,
pritiskom na digme 'Potvrdi' ili sl.). Ti Detail slogovi moraju da koriste neki event tipa BeforePost
ili sl. kako bi uzeli taj ID pre nego što se postuju..
Inače IBQuery ima keširani update, pa ću videti nešto tu da izmuvam, moram još i onaj database_
guide .pdf za BCB da proučim, sad idem da spavam..
[ aleksandarpopov @ 20.01.2007. 08:31 ] @
Ja dodeljujem id cim korisnik krene da unosi novi slog, ja mu tada dodelim vrednost za ID koju citam iz tabele brojac(u njoj cuvam ime tabele i privi sledeci id za tu tabelu - vrednost inkrementiram odmah nakon citanja) ne koristim ugradjena auto inkrementirajuca polja. Kod ovog resenja sa tabelom brojac mogu da se jave rupe ako korisnik odustane od unosa ako program radi u mrezi, ali uglavnom mi radi ok.
[ Mr. Rejn @ 20.01.2007. 17:32 ] @
Budući da stvari počinju da se komplikuju u vezi sa ovim, naročito oko tog problema sa
dodelom ID-ova Detail zapisima mislim da ću se zadovoljiti nekom alternativom, tj. odvojenim
unosom za Master i Detail, kako ne bih smarao ljude ovde..
Pozdrav.
[ Mr. Rejn @ 25.01.2007. 15:29 ] @
Evo rešenja koje radi za unos master-detail zapisa iz jedog klika (bez keširanog
update-a a možda može i sa njim nisam probao),koliko da zatvorimo ovu temu, možda
je slično nečemu što je gore napisano ali me sad mrzi da čitam a ide ovako:
1) napravi se "kontrolni" master zapis koji ima samo ID,bez drugih podataka
2) unose se detail stavke u dbgrid ali se ostavlja ID null (generator na serveru
inkrementira ID) i stavi se ID "kontrolnog" master zapisa, ove vrednosti se
dodeljuju DataSet-u u OnNewRecord eventu
3) pritiskom na dugme npr. "Potvrdi" ili sl. prvo se pokreće snimljena procedura
koja vraća ID novog master zapisa i koja se odmah commit-uje
3a) odmah zatim glavni upit (koji unosi detail stavke) ucitava iz .sql fajla update SQL
za detail tabelu koji sadrži parametar za ID master zapisa i njemu se dodeljuje
vrednost koju je vratila procedura, tako da se prepisuje vrednost onog kontrolnog
zapisa i sad imamo tačnu vrednost ID master zapisa u detail zapisu
3b) Commit-uje se transakcija za glavni DataSet.
Loša strana je to što transakcija glavnog DataSet-a (koji unosi detail zapise) stoji
otvorena odmah po otvaranju DataSet-a i dok traje unos stavki,a zatvara se tek po potvrdi
svih unosa (mada se ovde može staviti neki timeout za transakciju,npr. OnIdleTimer event, pa
se stavi neka ljubazna poruka korisniku da ne gnjavi sa unosom,posle čega mora da ponovi
celu stvar).
U mreži drugi korisnik (valjda) ne može promeniti moj zapis iako mogu imati isti ID "kontrolnog"
zapisa zato što se sve odigrava unutar moje i njegove transakcije.Izgleda da IBX ne može
da drži DataSet otvorenim ako transakcija nije aktivna.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|