[ erekoz @ 13.10.2003. 20:23 ] @

Pozdrav svima,

Imam jedan problem oko pretrazivanja baze i unosenja rezultata u dbgrid. Naime, treba da pretrazim bazu sa nekoliko reci ciji broj svaki put varira. Kako da rezultate pretrazivanja apendujem na DBgrid? Sada, ja pretrazim bazu prvom reci, dbgrid pokaze rezultate, i onda kada pretrazi bazu drugom recju, izbrise prethodne rezultate. Meni treba da svi rezultati ostanu u DBgridu...

Hvala unapred, erekoz
[ Nub.Saibot @ 14.10.2003. 08:45 ] @

Ja za takve stvari koristim komponentu iz Jedi VCL paketa, zove se JvMemoryData i predstavlja tabelu u memoriji. Nju mozes da punis rezultatima, a ostalo sve ostaje isto osim sto DBGrid koristi ovu tabelu, a ne query koji je do sada korstio. Inace jvMemoryData se koristi potpuno isto kao obicna komponenta TTable.

Pozdrav

P.S. Ovo moze da se izvede i sa nekim standardnim komponentama ali nisam to ranije radio pa zato pominjem resenje za koje znam kako radi. :)
[ erekoz @ 14.10.2003. 11:16 ] @

Ej, Nub, hajde malo pojasni kako se radi sa ovim Tjvmemorydata, malo sam zbunjen. Kako da ga povezem sa rezultatima SQL upita? Ima li nekog uputstva za koriscenje na sajtu? U help fajlu se ne pojavljuje...

[ bogiboy @ 15.10.2003. 00:25 ] @
Druga varijanta ti je da kreiras novu tabelu u kojoj ces da cuvas rezultate pretrage a umesto TTable koristi TADODataSet komponentu ako koristis ADO ili TQuery ako ides preko BDE.
E sad ovako:
recimo tabelu nazoves TSearches i ona ima sledeca polja:
1. Record_id kao kljuc
2. Original_id - id rekorda iz tabele koju pretrazujes
3. Original_type - flagovi 1...n ako hoces ovde da trpas rezultate pretrage iz raznih tabela, recimo da ovu za koju pitas nazovemo 1

Umesto da pretragu radis klasicno ti kazes (kreiraj ADOComand ili TInsertSQL) :"INSERT INTO TSearches Original_id, Original_type
SELECT Record_id, 1 from TrazenaTabela WHERE (<tvoj serach kriterij);
Exacute; -- ovo treba da insertuje rezultate pretrage (ID-ove u TSearches tabelu)

a DBGrid vezes za TQuery ili TADODataset kao "SELECT DISTINCT TrazenaTabela.* from TrazenaTabela INNER JOIN TSearches ON (TTrazenaTabela,Record_id = TSearches.Original_id AND TSearches.Original_type = 1),

Na ovaj nacim mozes da rezultate pretrage cuvas kad se user sledeci put loguje (u tom slucaju dodaj u TSearches jos jedno pole :USERID gde cuvas user-dependent rezultate) a mozes i da obrises pri zatvaranju forme.
[ Nub.Saibot @ 15.10.2003. 10:37 ] @
Citat:
erekoz:

Ej, Nub, hajde malo pojasni kako se radi sa ovim Tjvmemorydata, malo sam zbunjen. Kako da ga povezem sa rezultatima SQL upita? Ima li nekog uputstva za koriscenje na sajtu? U help fajlu se ne pojavljuje...



Ajde sad cemo detaljnije:

1. Spustis komponentu TjvMemoryData na form :)

2. Dupli klik na komponentu da bi otvorio field properties. Desni klik na trenutno praznu listu polja i izaberes New field. Tu uneses podatke za potrebno polje. (popunjavas jedino name, Type i Size po potrebi) npr:
Name: SIF
Type: Integer
Kliknes na OK i time si dodao jedno polje.

3. Ponavljaj korak 2 dok ne dodas potrebna polja.

4. Sad u nekoj proceduri namestis prebacivanje rezultata upita u TjvMemoryData.
Code:

  Query1.Open;                              //Otvaramo upit

 if not MemData.Active Then MemData.Open;  //Ako nije tabela otvorena otvaramo je

 Query1.First;
 While not Query1.Eof do
 Begin
  MemData.Append;                          //Dodajemo jedan red u tabelu
  MemDataSIF.AsInteger := Query1SIF.AsInteger; //Upisujemo vrednosti iz query1 u MemData
  ...
  ...
  MemData.Post;
  Query1.Next;                             //Prelazimo na sledeci red rezultata
 End;

 Query1.Close;                             //Posto nam vise nije potreban upit zatvaramo ga


To je otprilike to, koriscenje je gotovo isto kao koriscenje TTable.


Pozdrav
[ erekoz @ 15.10.2003. 11:20 ] @

Hej Nub, hvala, sad cu da probam tvoj kung fu...
[ silverglider @ 15.10.2003. 12:36 ] @
Ne razumem potrebu za novim komponentama?

Svaka komponenta koja moze da primi SQL komande moze to da uradi i vrati rezultujuci set izabran po vise kriterijuma. Stavis samo da ti je za taj dbgrid osnova tipa "select * from mojatabela" i samo dodajes uslove - prvi ce biti "where kriterijum1", pa od drugog do kraja idu "and kriterijum-n" (na kraj dodas ukoliko ti treba sortiranje ili grupiranje rezultata). One komponente koje prihvataju tu SQL komandu kao jedan string formiras prostom konkatenacijom stringova (imas i lepu Format komandu za printf stil popunjavanja stringova), a one komponente koje primaju SQL skripte kao tstringlist, formiras jednostavno takvu varijablu:

slSQLcommand.add('SELECT * FROM moja_tabela');
if trt-mrt then
slSQLcommand.add(Format('WHERE id > %d', [mojindex]));
(itd).
myQuery.SQL := slSQLcommand;

Stavis prepare na false i uradis open/close queryja. Kako ti se uslovi i broj kriterijuma menjaju, insertujes ili brises linije u tom stringlistu i ponovo refreshujes query. To ce cesce raditi brze nego da se vadi jedan dataset, pa se onda radi petlja (until eof) i onda u svakom loopu radi append/post. Pogotovo kada lepo biras i kombinujes vec postojece standardne komponente; neke su brze, jer kesiraju u memoriji (ali se koriste za manje rezultantne datasetove), druge mogu da prime mnogo veci dataset kao rezultat, ali ne kesiraju, pa mozes da ih kombinujes, uvedes dataprovidere, itd.
[ xkolja @ 16.10.2003. 06:55 ] @
Prvo, nisi naveo dali "reci" sa kolima pretrazijes tabelu pripadaju istom polju u tabeli ili razlicitim poljima u tabeli.

Evo ti jednog primera gde jednu tabelu pretrazujem po dva polja i trazim dali na nekom od tih polja postoji slicnost.


procedure TObvForm.Edit1Change(Sender: TObject);
begin
obv.Close;
obv.Params[0].AsString:=Edit1.Text;
obv.Open;
end;

obv je ime SQLClientDataSet-a

upit izgleda ovako:

Select polje1, polje2, polje3 from MojaTabela
where (polje2 containing :pin) or (polje1 starting with :pin)


u ovom slucaju polje jedan i polje dva treba da budu istog tipa (ovde je to string).
i rezultati se preko svega sto treba prikazuju u jednom DBGrid-u.

a mozes i kada ti se povacava broj reci po kojima pretrazujes naprimer jedno polje da menjas tekst upita:

pretrazivanje sa jednom recju:

Select polje1, polje2, polje3 from MojaTabela
where polje2 containing :pin


pretrazivanje sa dve reci:

Select polje1, polje2, polje3 from MojaTabela
where (polje2 containing :pin1) and (polje2 containing :pin2)

tako ces dobiti sve slogove (recorde) u kolima se reci nalaze pin1 i pin2 bez obzira na rdosled.

pin, pin1 i pin2 su parametri, a upiti su parametarski upiti.
[ Nub.Saibot @ 16.10.2003. 09:49 ] @

Totalno sam prevideo jednostavno resenje koje je naveo silverglider jer sam u prvom odgovoru erekozu imao na umu da njemu treba neki rezultat koji nije moguce vratiti jednim upitom pa sam zbog toga pomenuo MemoryData komponentu.

Pozdrav
[ silverglider @ 16.10.2003. 11:38 ] @
Samo jedna napomena glede dodatnih komponenti; generalni stil programiranja bi trebao da bude takav da stvari resava sa postojecim, standardnim komponentama frameworka (i njihovim nasledjivanjem, naravno), a koliko-toliko izbegavati externe male komponente - ukoliko je to moguce, naravno. Pogotovo ako se radi o programu koji ce nastaviti da se razvija i planira se novija verzija kad-tad. Uglavnom zbog deploymenta - prvo, covek koji je razvijao neku komponentu moze sutra da prestane da je razvija, a bio je na raspolaganju samo njen binarni oblik (ne i source) i ne radi dobro pod novim razvojnim alatom; moze dalje da se desi da covek/firma promene prava koje se odnose na tu komponentu, pa zatreba placanje licenci, itd. Osim ako se sa komponentom ne dobija source i prava da se sa time radi svasta (i u komercijalne svrhe), naravno. Sorry na off-topicu.