|
[ reiser @ 22.01.2005. 13:28 ] @
| Imam nekoliko pitanja oko DBGrid-a i baza uopste, napisite ovde kako vi to radite plz.
Korisnik treba da unosi podatke u jedan DBGrid i da se posle ti podaci snime u bazu.
- Prva kolona u DBGrid-u treba da bude redni broj unosa, tj. treba da se povecava od 1 pa nadalje, zavisi koliko ima unosa. Kako ovo napraviti ?
- U drugoj koloni korisnik treba da ima jedan combobox koji ce sadrzati imena svih artikala recimo. Artikli se cuvaju u posebnoj bazi. Btw, ako artikal ne postoji u bazi, korisnik ce samo ukucati novi naziv u combobox i artikal ce se automatski dodati u bazu, tako da ce prilikom sledeceg unosa postojati u combobox-u. Kako ovo napraviti (tj. kako ucitati artikle iz artikli.db baze u combobox koji se nalazi u dbgrid-u koji je povezan sa bazom baza1.db recimo) ?
Hvala i poz |
[ matory @ 23.01.2005. 02:53 ] @
Mozes postaviti ovakav dogadjaj na samu tablu:
Object Inspector-Events-AfterInsert.
procedure TForm1.Table1AfterInsert(DataSet: TDataSet);
begin
Table1.FieldByName('RedniBrojKnjizenja').AsInteger:=Table1.RecordCount+1;
end;
Ovo bi treebalo da radi, probaj.
Sto se tice boksova u samom gridu negde na ovom forumu sam procitao da je to neko vec uradio. Pregledaj ga malo. U svakom slucaju komponente DBLookUp ti omogucuju citanje iz jedne i upis u drugu tabelu.
[ sasas @ 24.01.2005. 09:05 ] @
Citat: matory: Mozes postaviti ovakav dogadjaj na samu tablu:
Object Inspector-Events-AfterInsert.
procedure TForm1.Table1AfterInsert(DataSet: TDataSet);
begin
Table1.FieldByName('RedniBrojKnjizenja').AsInteger:=Table1.RecordCount+1;
end;
Ovo bi treebalo da radi, probaj.
Ovo ovako napisano je loshe - sta ako obrises 1 rekord? Brojevi ce se duplirati. Ako nije bas neophodno brojanje od 1...x koristi AutoNumber polja u bazi. Em sto nema dodatnog kooda, em sto su brojevi garantovano jedinstveni.
Za ovo lookup, mozes pogledati PickList property kolone u DBGridu. A ako koristis JVCL mozes uzeti komponentu UltimDBGrid, koja za svako polje u Gridu moze imati poseban editor (npr. lookup combo box) pa ces tako bez ijedne linije kooda postici to sto zelis.
ss.
[ matory @ 24.01.2005. 16:02 ] @
Citat: sasas: Ovo ovako napisano je loshe - sta ako obrises 1 rekord? Brojevi ce se duplirati. Ako nije bas neophodno brojanje od 1...x
E pa neophodno je. Posto u knjigovodstvu nema brisanja sloga. U zakonu stoji da je dozvoljeno storniranje ali ne i brisanje nekog zapisa.
Tacno, ako neko obrise neki slog, pri novom unosu desice se KEY VIOLATION i program necedalje raditi. Vrati obrisani slog i program ce raditi.
Zamisli neko poslovanje sa oko 3000 faktura godisnje i neko obrise bilo koju fakturu, a tvoja baza sa AutoNumber poljima sve to preslozi napravi nove kljuceve i radi, a na toj fakturi je satjala vrednost recimo od par stotina hiljada dinara ??? Robija brate.
[ sasas @ 25.01.2005. 09:19 ] @
Citat:
Tacno, ako neko obrise neki slog, pri novom unosu desice se KEY VIOLATION i program necedalje raditi. Vrati obrisani slog i program ce raditi.
Jel ima neko bolje resenje od ovoga? Meni se pre nekog vremena javila takva potreba za takvim brojanjem recorda, i nisam smislio pametno resenje.
ss.
[ _v!rus_ @ 26.01.2005. 01:44 ] @
Evo dva moguca resenja
1. Globalna promenljva koja cuva broj poslednjeg unetog sloga i OnNewRecord upisuje broj u odgovarajuce polje(nema dupliranja ali mogu se pojavirti rupe posle brisanja recorda - 1 2 4 6 8 9 10) RecNum je zeznut jer ne reaguje na filtere;
2. procedura Renumber koja ce prenumerisati stavke od prve do zadnje posle svakog novog recorda ili brisanja tako sto pre numeracije pamti RecNo trenutnog, prenumerise, i opet postavi aktivnim zapamceni record (sigurno nema rupa, ali mali overhead sa vecim brojem recorda).
U stvari moze kombinacija ova dva, prvi posle unosa, drugi posle brisanja.
Koliko sam ja shvatio ovde su u pitanju redni brojevi stavki faktura, a ne brojevi samih faktura tako da nema problema sa robijom, ne narusavaju se same fakture, moze da samo lezi za utaju jedne stavke :)
I ko kaze da su redni brojevi artikala Keyed? Jedino ako se svaka faktura pamti u svojoj tabeli, generalno takve stvari se rade sa 2 tabele - 1. tabela svih faktura sa brojem, datumom, kupcem, ukuonim iznosom, itd., i 2. tabela sa svim stavkama svake fakture gde je prvo polje broj fakture, a drugo redni br. stavke, trece sifra artikla (npr.), itd... Kad se otvara faktura iz tabele faktura se cita broj, datum itd., a na tabelu stavki se postavlja filter (npr. [BrojFakture = '001/2005']).
Ako je i potreban Key onda bi to bio neki jedinstveni broj nevezan za broj fakture ili rbr. stavke.
[ reiser @ 26.01.2005. 06:34 ] @
Hvala momci, samo nastavite ako imate jos nesto da dodate
Jos jedno pitanje - imam u bazi artikli.db polje 'JedMere', i ono je tipa Integer. U drugoj bazi se skladisti naziv Jedinice Mere i svaka ima svoj redni broj. Kako da, ako mi se u artikli.db nalazi recimo 'JedMere' = 4, kako da iscitam naziv iz druge baze sa rednim brojem 4 ?
[ sasas @ 26.01.2005. 08:01 ] @
Imas par mogucnosti za to:
1. Ako koristis query objekat za pristup podacima mozes da uradis inner join.
2. Mozes da hendlujes evente OnGetText i OnSetText za polje JedMere
3. Mozes da napravis novo lookup polje u tabeli/upitu - ovo ti je najjednostavnije, nema dodatnog kooda, i performanse su sasvim pristojne.
ako ti treba neka konkretnija pomoc oko ovoga, reci.
ss.
[ Riste Pejov @ 26.01.2005. 08:53 ] @
Ako neko zeli apsolutno uzastopne vrednosti, onda kao prvo treba zabraniti brisanje slogova u toj tabeli, samo postavis jedno polje status koje kaze jeli slog validan ili ne. Kao drugo broj fakture ne mora biti PK, vec PK moze biti autonum a da se broj faktura presmeta drugacije. Posto paradox (koliko se ja secam) moze da radi sa pessimistic locking i kada jedan user zakljuca tabelu onda moze ladno da uradi:
SELECT MAX(FACT_NO) FROM TABLE;
INSERT INTO TABLE VALUES (max_val+1, bla, bla);
Kada imas pessimistic locking u PDX onda nista te ne sprecava da imas uzastopne vrednosti.
Ali ako se radi o fakturama i sl, ja to ne bi radio na paradox-u. PDX sam ostavio davne 1998 jer je pucao kao lud sa vise od 300K slogova, a da ne govorim sta se moze desiti paradoxu kad nestane struju ili neko izcupa power cable. Sreca sto se radilo o nekim glupim podacima i da su ljudi cuvali bekap.
[ _v!rus_ @ 26.01.2005. 11:07 ] @
Citat: Marko Paunovic: Hvala momci, samo nastavite ako imate jos nesto da dodate
Jos jedno pitanje - imam u bazi artikli.db polje 'JedMere', i ono je tipa Integer. U drugoj bazi se skladisti naziv Jedinice Mere i svaka ima svoj redni broj. Kako da, ako mi se u artikli.db nalazi recimo 'JedMere' = 4, kako da iscitam naziv iz druge baze sa rednim brojem 4 ?
Mislim da bi (ako koristis lookup polja) trebalo da postavis ref. integrity izmedju JedinicaMere i Artikala(pod uslovom da u tabeli artikala imas string polje [JM], a tabela JediniceMere da ima polja RBr i JM): postavis primary key na tabelu [JediniceMere] na polje Rbr, i onda dodas da ti je
[Artikli->JM = JediniceMere->JM]
Postavku radis u DatabaseDesktopu ili sl. Kao UpdateRule izaberes Cascade (sve promene na tebeli JediniceMere automatski menjaju odgovarajuce recorde u tabeli Artikli) ili Prohibit (zabrana izmene tabele JediniceMere ukoliko se recordi za izmenu "koriste" u nekim stavkama tabele Artikli). Prednost ref. integrity-a je sto ti ne treba nikakav dodatni kod (sve BDE radi pod haubom).
Pazi ako koristis Cascade da zabranis brisanje iz tabele JM jer brisanje jedinice mere ce obrisati sve referencirane recorde u tabeli Artikli, ali zato svaka izmena ce se odraziti na iste (Npr. prepravis 'komad' u 'KOMAD' i automatski si izmenio sve ref. artikle). Jos mozes i na tabelu artikala da postavis PrimaryKey na polje sifra pa onda isto lookup + ref.integr. primenis na fakture...
[ matory @ 26.01.2005. 16:23 ] @
Citat: Riste Pejov:
Ali ako se radi o fakturama i sl, ja to ne bi radio na paradox-u. PDX sam ostavio davne 1998 jer je pucao kao lud sa vise od 300K slogova, a da ne govorim sta se moze desiti paradoxu kad nestane struju ili neko izcupa power cable. Sreca sto se radilo o nekim glupim podacima i da su ljudi cuvali bekap.
Moj PDX ima 3000 pacijenata (glavna tabla) 11000 izvestaja (detaljna tabla), 17000 i vise dijagnoza itd itd i sve radi vec dve godine kako treba. Jedino sto nisam koristio DBTable (delphi 6) nego MBTable. Problem je bio sto je DBTabla pamtila u memoriji do gasenja programa, a ako bi u tom trenutku racunar iz nekog razloga bio prisilno iskljucen knjizenja bi bila bespovratno izgubljena. MBTabla je upisivala stavarno u bazu: MBTable.Post;
Ova komponenta je izvedena:
unit MBTable;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, DBTables, dbiProcs;
type
TMBTable = class(TTable)
private
{ Private declarations }
protected
{ Protected declarations }
procedure DoAfterPost; override;
public
{ Public declarations }
published
{ Published declarations }
end;
procedure Register;
implementation
Procedure TMBTable.DoAfterPost;
begin
inherited DoAfterPost;
dbiSaveChanges(Self.Handle);
end;
procedure Register;
begin
RegisterComponents('CSA', [TMBTable]);
end;
end.
Gde se uopste postavlja polju da bude AutoNum???
[ _v!rus_ @ 26.01.2005. 19:29 ] @
@matory:
1.Nije tacno da pdx ne upisuje u tabelu stvarne podatke, samo treba da stavis TTable.Active := False ili TTable.Close. Trebalo mi je 2 godine da to provalim... ;-).
Ta izvedena komponenta MBTable je u stvari cracker, komponenta koja sluzi samo da bi se pristupilo zasticenom metodu dbiSaveChanges koji je dostupan samo descendatima klase TTable. dbiSaveChanges se standardno u TTable-u poziva pri zatvaranju tabele (TTable.Close).
A i kada bi posle SVAKOG post-a tabela praznila kes, bilo koja jaca operacija na malo vecoj bazi bi trajala vekovima. Nego gledam malo postove to db temama, izgleda da cu da batalim pdx kompletno i da se prebacim na Firebird... ;-)
2. Autonum se u stvari zove autoincrement (bar u pdx-u). Postavlje se u DatabaseDesktopu prilikom design-a tabele.
[ matory @ 27.01.2005. 17:53 ] @
OK!
Citat: _v!rus_:Nego gledam malo postove to db temama, izgleda da cu da batalim pdx kompletno i da se prebacim na Firebird... ;-)
Slazem se sa tobom. Vrati se ponekad na PARADOX da pomognes nas obicne smrtnike.
Moze to sa DBTablama ali me nervira sto svaki put pre upisa treba da je aktiviras pa da je zatvoris da bi ona stvarno nesto upislala. Nisu bas uvek jednostavni upisi. Cesto sam morao nesto da upisujem u toku rada programa (Znaci ne ono samo ukucaj u DBGrid i potvrdi). Ovu komponentu mi je neko preporucio bas sa ovog Foruma, i do sada je sve radilo OK.
[ reiser @ 28.01.2005. 17:38 ] @
Da ne otvaram novu temu, jedno brzo pitanjce :
Kako da sortiram pomocu SQL-a neke podatke iz baze, ali da je case-insensitive ?
SELECT blabla ORDER BY Name... i sta ovde ide ?
[ reiser @ 29.01.2005. 00:47 ] @
@sasas
Kazes da UltimDBGrid ima mogucnost dodavanja lookupcombobox-a za bilo koje polje u gridu... Ali kako, ne vidim nista specificno osim PickList property-a ?
[ sasas @ 29.01.2005. 10:13 ] @
Ima property 'Edit controls' gde za svaku kolonu biras kontrolu koja ce biti editor.
Ili jos bolje, pogledaj primer u <JVCL root>\examples\JvUltimDBGrid\ADO, u kom imas to i jos nekih zanimljivih featurea.
Mada, nisam siguran koliko je pametno dozvoliti korisnicima da kuckaju po gridu. Mislim da je pametnije praviti posebne forme (sa edit-ima, combobox-ovima...) koje ce ti sluziti za unos i edtovanje, a eventualno grid koristiti za pregled. Komplikovan je za korisnike unos u grid.
ss.
[ reiser @ 29.01.2005. 12:33 ] @
Hvala, sad cu da probam
Citat: Kako da sortiram pomocu SQL-a neke podatke iz baze, ali da je case-insensitive ?
SELECT blabla ORDER BY Name... i sta ovde ide ?
[ reiser @ 29.01.2005. 18:13 ] @
OK, DBSearchComboBox radi perfektno.
Samo... kad ja unesem neki text u njega i predjem u sledecu kolonu, kako da napravim da mi se text iz combobox-a prenese u njemu odgovarajuce polje u dbgrid-u i da se posle toga sa ostalim unosima postuje u bazu ? Mislim, nesto ne stima, kad predjem u novi red, onaj unos iz combobox-a se izgubi....
Poslacu primer ako hocete
Hvala unapred
[ sasas @ 29.01.2005. 18:53 ] @
Citat: OK, DBSearchComboBox radi perfektno.
Zar tu ne bi trebao ici koliko te ja razumem DBLookupComboBox?
Inace, upisace se 'samo od sebe' :) Samo treba da postavis DataSource i DataField DBLookupComboBox-a na odgovarajuce vrednosti.
ss.
[ reiser @ 30.01.2005. 00:20 ] @
DBLookupComboBox mi ne odgovara nikako... :(
Zato sto ne mogu da u njemu ukucam neki proizvoljan string vec mogu samo da izaberem iz vec postojece liste....
DBSearchComboBox radi super, medjutim nema DataSource i DataField property-e...
[ reiser @ 30.01.2005. 00:38 ] @
U stvari, DBSearchComboBox ima DataSource i DataField propertye ali nema ListSource itd...
Da ne tupim, moze li se ovo nekako izvesti sa DBSearchComboBox ili nekom drugom kontrolom koja dozvoljava proizvoljan upis ?
[ sasas @ 30.01.2005. 00:56 ] @
Jesi li pogledao JvDBLookupComboEdit?
On ima i LookupSource/Field/Display i DirectInput...
ss.
ps. lepo je videti da jos neko programira u ova doba :)
[ reiser @ 30.01.2005. 00:59 ] @
Hehe, sta ces mora se :)
Sad cu da probam ovo
[ sasas @ 30.01.2005. 01:18 ] @
Citat: Hehe, sta ces mora se :)
ipak sam ja najgori :) ja ne moram ;)
ss.
[ reiser @ 30.01.2005. 01:18 ] @
I ovo zavrsava posao, samo imam jedan problem :)
LookupSource DBLookupComboEdit-a sam povezao sa bazom artikala i odatle on vadi nazive artikala (naziv je tipa alphanumeric). DataSource property sam povezao sa bazom kalkulacija, sa poljem 'Artikal', tipa integer. U tom polju treba da se zapise ID artikla koji je korisnik izabrao.
Kako da napravim da se u bazu kalkulacija zapisuje ID artikla, posto ovako mogu da unosim samo brojke u DBLookupComboBox...
[ reiser @ 30.01.2005. 12:20 ] @
To bi trebao da bude LookupField property ali nesto ne funkcionise...
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|