|
[ Miloš Baić @ 24.06.2006. 20:37 ] @
| Pozdrav,
radim jedan projekat za ispit, pa mi treba stručna pomoč iskusnih delphi programera. Naime, projekat mora biti poslovnog sadržaja, pa sam odabrao vođenje magacina. Ništa strašno, ali ipak mi treba pomoć. Ovako:
imam dva dokumenta koji imaju svoje šifre:
1) Prijemnica - šifra 10
2) Izdatnica(trebovanje) - šifra 20
U istu tabelu bi trebalo da se unose podaci iz Prijemnice i Izdatnice. Otprilike bi to trebalo da izgleda ovako:
šifra dokumenta | redni broj
10 | 001
10 | 002
10 | 003
20 | 001
10 | 004
20 | 002
20 | 003
Znači, kad pokrenem formu za Prijemnicu treba da mi se generiše prvi sledeći slobodan broj iz kolone "redni broj" u zavisnosti od šifre dokumenta. Kako to da odradim, ispravno i efektivno?
Za početak...
Hval unapred... |
[ Whois @ 24.06.2006. 22:36 ] @
imas vise nacina
1.mssql upitom (ako je access baza)
SELECT TOP 1 from tabela WHERE sifra_dokumenata='10' ORDER BY redni_broj DESC
2. cuvanjem broja zadnjeg dokumenta u ini fajlu
Code:
uses inifiles;
function getNextID(sifra: String): Integer;
var
i: tinifile
begin
i:= Tinifile.create('id.ini');
try
Result:=i.readinteger('ID',sifra,0)+1;
finally
i.free;
end;
posle uspesnog unosa u bazu mora da se pozove save koji bi isao nekako ovako:
procedure Save(sifra: String);
var
i: tinifile
id: integer;
begin
i:= tinifile.create('id.ini');
try
i.writeInteger('ID',sifra,i.readinteger('ID',sifra,0)+1);
finally
i.free;
end;
U celoj ovoj prici se postavlja pitanje, sta ces da radis sa izbrisanim dokumentima. Da li njihovi brojevi trebaju da ostanu prazni, ili se i oni popunjavaju. Ako je odgovor 'da' onada sve ovo ne vazi. :). U takvom slucaju selektujes u bazi sve stavke sa sifrom koja ti treba, pretrazujes tabelu i trazis rupe .
[ pstojanovic @ 25.06.2006. 09:15 ] @
Kao što reče WhoIs, jedan od načina je SQL upit koji traži prvi sledeći slobodni broj. Ini datoteka je ok, ako je stavljena na mrežu pa joj imaju svi korisnici pristup. Ako je definisana za lokalnog korisnika, imaš konflikt. Slično, nije loše ni da se napravi tabela koja definiše tipove dokumenata + brojače za svaki tip, tako da se prilikom _upisa_ novog dokumenta povećava brojač po tipu. Pri tome treba imati u vidu da korisniku ne treba biti garantovan novi broj dokumenta sve do trenutka upisa u bazu, da se ne bi stvarale nepotrebna preskakanja.
[ Miloš Baić @ 25.06.2006. 12:12 ] @
Pozdrav,
za početak, hvala za pomoć... Dalje, u pitanju je Access db, a lično mislim da treba to baza da generiše, odnosno da proveri kolonu i vidi koji je najveći broj zadnji upisan i potom odradi +1 i dobijem broj. Tako da sam iskoristio SQL upit i to ovako:
Code:
with ADOQuery do begin
Close;
SQL.Clear;
SQL.Add('SELECT TOP 1 BROJPRIJEMLISTA AS[BROJPRIJEMLISTA] FROM PRIJEMNICAKARTICA');
SQL.Add('WHERE SIFRADOKUMENTA=10');
SQL.Add('ORDER BY BROJPRIJEMLISTA DESC');
Open;
end;
Znači, dobijam najveći broj, sad ga treba odraditi na formu, recimo OnCreate,:
Code:
...
var rb,novi: integer;
...
rb:= StrToInt(ADOQuery1.FieldByName('BROJPRIJEMLISTA').AsString);
novi:=rb+1;
Edit1.Text:=IntToStr(novi);
Voleo bih da ovo malo prokomentarišete, jer verovatno se može bolje napisati, pošto ste iskusniji?!
[ mzarko @ 25.06.2006. 16:32 ] @
Mozda nije lose da prvo izvrsis proveru da nije baza prazna pa da onda vrsis uvecavanje broja za 1:
ADOTable1.Sort := 'BROJPRIJEMLISTA ASC';
ADOTable1.Last;
if ADOTable1.RecordCount<1 then
Edit1.Text := '1'
else
Edit1.Text := IntToStr(StrToInt(ADOTable1.FieldByName('BROJPRIJEMLISTA').AsString)+1);
[ Miloš Baić @ 25.06.2006. 16:55 ] @
Pozdrav,
da baš to mi je trebalo, da, ako je tabela prazna, stavi vrednost na 1... Hvala...
Odradio sam to, ali sa ADOQuery, pa to izgleda ovako:
Code:
...
var rb:integer;
novi:integer;
...
begin
if ADOPRIJEMNICA.RecordCount=0 then
EditBrojPrijemnice.Text := '1'
else begin
with ADOPRIJEMNICA do begin
Close;
SQL.Clear;
SQL.Add('SELECT TOP 1 BROJPRIJEMLISTA AS[BROJPRIJEMLISTA] FROM PRIJEMNICA');
SQL.Add('WHERE SIFRADOKUMENTA=10');
SQL.Add('ORDER BY BROJPRIJEMLISTA DESC');
Open;
end;
rb:= StrToInt(ADOPRIJEMNICA.FieldByName('BROJPRIJEMLISTA').AsString);
novi:=rb+1;
EditBrojPrijemnice.Text:=IntToStr(novi);
...
Ako ima grešaka, slobodno mi recite, da ih uočim i ispravim...
Dalje, treba mi savet kako da odradim ULAZ i IZLAZ - tabele. Zamislio sam, naravno bez
znanja kako to baš treba da izgleda, da napravim dve tabele, jedna za ulaz, druga za izlaz.
Pa, na nekoj tamo formi postaviti dva DBGrid-a, gde bih napravio Master-Detail strukturu
i po filtriranju šifre nekog artikla(sirovine), dobijem u dbgrid1 ULAZ a u dbgrid2 IZLAZ.
Istovremeno, po završetku filtriranja artikla, računa se zbir kolone ULAZ za taj artikl
(dbgrid1) i zbir kolone IZLAZ za taj artikl(dbgrid2). Razlika će tako predstaviti STANJE?!
Napominjem da radim s SQL upitima...
Dakle, trebam mišljenja kako to da odradim ispravno...
[ Whois @ 25.06.2006. 18:50 ] @
Koliko ja vidim na prvi pogled ovo nece dobro da ti radi. Trebalo bi nesto ovako:
Code:
...
var rb:integer;
novi:integer;
...
begin
with ADOPRIJEMNICA do begin
Close;
SQL.Clear;
SQL.Add('SELECT TOP 1 BROJPRIJEMLISTA AS[BROJPRIJEMLISTA] FROM PRIJEMNICA');
SQL.Add('WHERE SIFRADOKUMENTA=10');
SQL.Add('ORDER BY BROJPRIJEMLISTA DESC');
Open;
if sql.recorscount=0 then
rb := 1
else
rb:= StrToInt(sql.FieldByName('BROJPRIJEMLISTA').AsString)+1;
end;
EditBrojPrijemnice.Text:=IntToStr(rb);
...
[ Miloš Baić @ 25.06.2006. 19:40 ] @
Pozdrav,
hvala na ispravkama... Neki savet u vezi:
Citat:
kako da odradim ULAZ i IZLAZ - tabele. Zamislio sam, naravno bez
znanja kako to baš treba da izgleda, da napravim dve tabele, jedna za ulaz, druga za izlaz.
Pa, na nekoj tamo formi postaviti dva DBGrid-a, gde bih napravio Master-Detail strukturu
i po filtriranju šifre nekog artikla(sirovine), dobijem u dbgrid1 ULAZ a u dbgrid2 IZLAZ.
Istovremeno, po završetku filtriranja artikla, računa se zbir kolone ULAZ za taj artikl
(dbgrid1) i zbir kolone IZLAZ za taj artikl(dbgrid2). Razlika će tako predstaviti STANJE?!
Napominjem da radim s SQL upitima...
Dakle, trebam mišljenja kako to da odradim ispravno...
[ Whois @ 25.06.2006. 20:20 ] @
Pa MOZE kao sto si sam napisao, ali mislim da bi ti bilo bolje, brze i sigurnije da to odradis sa sql upitom.
kao: SELECT SUM(IZNOS) AS UK_IZNOS FROM ULAZ WHERE BLABLA...
[ Miloš Baić @ 25.06.2006. 23:26 ] @
Da, kao što sam rekao, koristiću SQL upite. Znači, šta je ispravnije, da ULAZ punim u jednu
tabelu a IZLAZ u drugu. Onda da isfiltriram neki artikl i da u jednom DBGridu bude ULAZ
a u drugom IZLAZ?! Ili da na osnovu SQL upita i IZLAZ i ULAZ predstavim u jednoj tabeli (dbgrid)
pa onda sumiram jednu kolonu i drugu, a razlika te dve je trenutno stanje u magacinu koje
će biti predstavljeno u nekom TEdit-u?!
[ Whois @ 25.06.2006. 23:37 ] @
Ne ne... Filtriraj ti i prikazuj tabele kako ti odgovara (i sta ti naravno treba), samo iznos uzmi direktno iz baze pomocu novog sql upita, da ne bi prolazio kroz sve slogove (a njih jelte moze da bude jako puno) i sabirao pojedinacno.
[ grebenar @ 04.07.2006. 14:30 ] @
1. interni broj dokumenta koji zajedno sa tipom dokumenta cini ID (key) se u principu ne pojavljuje korisniku. Cijena za to je da korisnik mora unijeti svoj - externi - broj dokumente , sto je u praksi i zahtjev. Dakle interni broj dokumenta mozes u potpunosti prepustiti auto-inkrementiranju.
2. u jednoj tabeli drzis zaglavlja svih dokumenata (key ID broj), u drugoj stavke svih dokumenata (id, NoStv). Zavisni atributi u prvoj su magacin, tip dokumenta T, ext.broj dokumenta, datum, destinacija/odrediste i sl. a u drugoj artikal (sifra), kolicina, jed. cijena,...
3. u trecoj tabeli drzis opise tipova dokumenta: tip, naziv, i flagove (0,1) za ulaz i izlaz
4. Entry (unos) rjesavas kroz odg. upite (requestLive = True) gdje u NewRecord eventu ev.postavis potrebne vrijednosti, ovisno da li je dokument primka, trebovanje, otpremnica/izdatnica ili nesto stoto...
5. sve izvjestajne f-je zasnivas na view-u koji povezuje zaglavlje, tijelo dokumenta i tip tako da napravi kolone ulaz i izlaz na osnovu tipa dokumenta i kolicine (ili kolicina * cijena)
Code:
select z.mag, z.ext_br, z.TipDok, s.artikal_id, d.ulaz * s.kol as ul_kol, d.izlaz * s.kol as izl_kol, ...
from Stavke s left join
Zaglavlje z on (s.id = z.id) left join
Dokumenti d on (z.dok = d.dok)
....
where z.datum ....
s.artikal_id ...
6. Ako u referncijalnim tabelama za magacine, artikle, poslovne partnere i dokumente uvedes klasifikaciju, na osnovu nje mozes postavljati veoma mocne upite bazirena na gornjem uzorku a na osnovu filtera po pripadnosti entiteta odredjenim podklasama.
[ Miloš Baić @ 04.07.2006. 15:43 ] @
Hvala na odgovorima, za sad mi je ovo dovoljno...
[ IgorMedo @ 13.07.2006. 08:15 ] @
Probaj ovako
with ModulBazePrijemServisa do
begin
UpitIncijalizacija.Close;
UpitIncijalizacija.Prepare;
UpitIncijalizacija.Open;
BrKupca:=UpitIncijalizacijaBrKupca.Value+1;
BrUredjaja:=UpitIncijalizacijaBrUredjaja.Value+1;
BrPrijema:=UpitIncijalizacijaBrPriServisa.Value+1;
BrKvara:=UpitIncijalizacijaBrKvara.Value+1;
BrNaloga:=UpitIncijalizacijaBrRadNaloga.Value+1;
end;
Ovo je primjer iz jednog mog projekta gdje je potrebna nesto slicno da se primarni kljucevi uvecavaju za jedan
a sada evo SQL kod od upita:
SELECT max(Prijemservisa.BrPriServisa), max(Uredjajinapopravci.BrUredjaja), max(Kupci.BrKupca),max(Kvar.BrKvara),max(BrRadNaloga)
FROM "Kupci.DB" Kupci, "UredjajiNaPopravci.DB" Uredjajinapopravci, "PrijemServisa.DB" Prijemservisa,"Kvar.db" Kvar,"RadniNalog.db" RadniNalog
Kao sto mozes da vidis ovo uzima trenutno najvecu vrijednost ovih polja koji su postavljeni u bazi.
Modifikuj si ovaj kod i moces vrlo lako da ga iskoristis.
Ovo je bolje rjesenje nego koristenje polja tipa autoincrement
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|