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

Pitanje u vezi BP, za malo iskusnije programere!?

[es] :: Pascal / Delphi / Kylix :: Pitanje u vezi BP, za malo iskusnije programere!?

[ Pregleda: 3384 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Miloš Baić
Miloš Baić
ERP (Dynamics NAV) programer
Beograd

Član broj: 72468
Poruke: 1155
*.neobee.net.



Profil

icon Pitanje u vezi BP, za malo iskusnije programere!?24.06.2006. u 20:37 - pre 185 meseci
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...
Someone's sitting in the shade today because someone planted a tree a long time ago.
 
Odgovor na temu

Whois

Član broj: 92214
Poruke: 37
*.panet.co.yu.



Profil

icon Re: Pitanje u vezi BP, za malo iskusnije programere!?24.06.2006. u 22:36 - pre 185 meseci
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 .
 
Odgovor na temu

pstojanovic
Petar Stojanović

Član broj: 64071
Poruke: 3
*.nat-pool.po.sbb.co.yu.



Profil

icon Re: Pitanje u vezi BP, za malo iskusnije programere!?25.06.2006. u 09:15 - pre 185 meseci
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.


 
Odgovor na temu

Miloš Baić
Miloš Baić
ERP (Dynamics NAV) programer
Beograd

Član broj: 72468
Poruke: 1155
*.neobee.net.



Profil

icon Re: Pitanje u vezi BP, za malo iskusnije programere!?25.06.2006. u 12:12 - pre 185 meseci
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?!

Someone's sitting in the shade today because someone planted a tree a long time ago.
 
Odgovor na temu

mzarko

Član broj: 33636
Poruke: 80
*.bisinter.net.



Profil

icon Re: Pitanje u vezi BP, za malo iskusnije programere!?25.06.2006. u 16:32 - pre 185 meseci
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);

 
Odgovor na temu

Miloš Baić
Miloš Baić
ERP (Dynamics NAV) programer
Beograd

Član broj: 72468
Poruke: 1155
*.neobee.net.



Profil

icon Re: Pitanje u vezi BP, za malo iskusnije programere!?25.06.2006. u 16:55 - pre 185 meseci
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...
Someone's sitting in the shade today because someone planted a tree a long time ago.
 
Odgovor na temu

Whois

Član broj: 92214
Poruke: 37
*.panet.co.yu.



Profil

icon Re: Pitanje u vezi BP, za malo iskusnije programere!?25.06.2006. u 18:50 - pre 185 meseci
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);
...
 
Odgovor na temu

Miloš Baić
Miloš Baić
ERP (Dynamics NAV) programer
Beograd

Član broj: 72468
Poruke: 1155
*.neobee.net.



Profil

icon Re: Pitanje u vezi BP, za malo iskusnije programere!?25.06.2006. u 19:40 - pre 185 meseci
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...

Someone's sitting in the shade today because someone planted a tree a long time ago.
 
Odgovor na temu

Whois

Član broj: 92214
Poruke: 37
*.panet.co.yu.



Profil

icon Re: Pitanje u vezi BP, za malo iskusnije programere!?25.06.2006. u 20:20 - pre 185 meseci
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...
 
Odgovor na temu

Miloš Baić
Miloš Baić
ERP (Dynamics NAV) programer
Beograd

Član broj: 72468
Poruke: 1155
*.neobee.net.



Profil

icon Re: Pitanje u vezi BP, za malo iskusnije programere!?25.06.2006. u 23:26 - pre 185 meseci
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?!
Someone's sitting in the shade today because someone planted a tree a long time ago.
 
Odgovor na temu

Whois

Član broj: 92214
Poruke: 37
*.panet.co.yu.



Profil

icon Re: Pitanje u vezi BP, za malo iskusnije programere!?25.06.2006. u 23:37 - pre 185 meseci
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.
 
Odgovor na temu

grebenar
Pavle Grebenar
IT manager
Zavidovici

Član broj: 86758
Poruke: 8
*.dlp277.bih.net.ba.



Profil

icon Re: Pitanje u vezi BP, za malo iskusnije programere!?04.07.2006. u 14:30 - pre 185 meseci
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.
 
Odgovor na temu

Miloš Baić
Miloš Baić
ERP (Dynamics NAV) programer
Beograd

Član broj: 72468
Poruke: 1155
*.neobee.net.



Profil

icon Re: Pitanje u vezi BP, za malo iskusnije programere!?04.07.2006. u 15:43 - pre 185 meseci
Hvala na odgovorima, za sad mi je ovo dovoljno...
Someone's sitting in the shade today because someone planted a tree a long time ago.
 
Odgovor na temu

IgorMedo
Igor Madjeric
Doboj

Član broj: 101335
Poruke: 30
81.93.74.*



Profil

icon Re: Pitanje u vezi BP, za malo iskusnije programere!?13.07.2006. u 08:15 - pre 185 meseci
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
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Pitanje u vezi BP, za malo iskusnije programere!?

[ Pregleda: 3384 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

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