|
[ itf @ 06.12.2007. 14:16 ] @
| Radi bržeg selektiranja podataka i određenih računanja treba mi filtriranje tablice, ali svaki put različito. Primjerice,
Code: void __fastcall TForm1::TRijeciFilterRecord(TDataSet *DataSet, bool &Accept)
{
Accept = Edit1->Text[1] == TRijeci->FieldByName("Rijec")->AsString[1];
}
Ovo mi je ok, ali već sljedeći put uvjet filtriranja se mijenja. Stoga, zanima me kako da primjerice ovo gore prevedem u izraz filter:
Code: TRijeci->Filter = ???
a da bude ekvivalent ovom gore... Naravno, problematičan je ovaj drugi izraz...
|
[ X Files @ 06.12.2007. 17:58 ] @
itf, nisam bas najbolje razumeo pitanje.
Filter osobina je (ako se dobro secam) jako primitivna i ne dozvoljava da se prave slozeniji upiti za filtriranje. Uglavnom <, >, LIKE i sl. Nisam siguran da je moguć pristup pojedinačnim karakterima (ne pada mi ništa na pamet). OnFilterRecord pretpostavljam da i postoji da prosiri mogucnosti flitriranja.
Citat:
Ovo mi je ok, ali već sljedeći put uvjet filtriranja se mijenja.
Sta je to konkretno kod OnFilterRecord sto ne odgovara? Na primer, mozes reci:
Code:
void __fastcall TForm1::ADOTable1FilterRecord(TDataSet *DataSet,
bool &Accept)
{
Accept = MojUslov();
}
bool TForm1::MojUslov()
{
// ovde štagod
return ( ADOTable1->FieldByName("Rijec")->AsString.Length() < Edit1->Text );
}
Sigurno može i pointer na funkciju, ma šta na ona pokazivala.
[ itf @ 07.12.2007. 08:54 ] @
Radim za faks jedan program baziran na križaljki za testiranje brzine određenih algoritama, no to je sad ovdje nebitno. Ono što meni treba jest da filtriram tablicu za svaki mogući znak (karakter) koji se nalazi u nekoj riječi (i na točno određenoj poziciji). Uglavnom... tih filtriranja ima jako mnogo i sva su varijabilna tj. uvjet nije fiksni. Npr.:
Code: Za I = 1 do DuljinaRijeci
Filtriraj tablicu... // Accept = Edit1->Text[I] == TRijeci->FieldByName("Rijec")->AsString[I];
// izvrši traženi algoritam nad podacima
Sve u svemu, sad se mislim da je za ovu komplikaciju najbolje možda upotrijebiti ADOQuery pa direktno SQL-om to riješiti...
[ X Files @ 07.12.2007. 09:45 ] @
Citat:
Sve u svemu, sad se mislim da je za ovu komplikaciju najbolje možda upotrijebiti ADOQuery pa direktno SQL-om to riješiti...
Upravo.
Ja podavno ne koristim filtriranje tabela, sem kada se radi o nekom bas jednostavnom sifarniku bez ikakve nade da ce trebati neka ozbiljnija funkcionalnost. Navikao sam se na TADOQuery i ne menjam ga.
Ipak, mislim da kod koji si gore dao za TADOTable jeste dobar i pravi put. Jednostavno, napravis neki kod u OnFilterRecord gde figurisu samo parametri (cak ako treba i pointeri na TEdit i na TDataSet) i imas sve sto ti treba. Mozda bi i filtriranje bilo brze nego sa Querijima, ne znam.
Pozdrav.
[ itf @ 07.12.2007. 10:12 ] @
Citat: Mozda bi i filtriranje bilo brze nego sa Querijima, ne znam. Koliko znam, sve je u pozadini SQL, tako da bi trebalo biti isto. Samo je pitanje što je jednostavnije realizirati (u ovisnosti o situaciji).
Pozdrav
[ savkic @ 07.12.2007. 14:59 ] @
> Koliko znam, sve je u pozadini SQL, tako da bi trebalo biti isto. Samo je pitanje što je jednostavnije realizirati (u ovisnosti o situaciji).
Ako pišeš OnFilterRecord ili koristiš Filter onda se prenose svi podaci iz baze i filtiranje obavlja na klijentu, a ako filtriranje obaviš preko SQL upita onda se filtriranje obavlja na serveru što je uglavnom efikasnije. Da budem iskren ne razumem najbolje šta ti tačno želiš ali nema tog filtriranja koje ne možeš postići u Delphi kodu.
[ itf @ 07.12.2007. 15:35 ] @
Citat: Ako pišeš OnFilterRecord ili koristiš Filter onda se prenose svi podaci iz baze i filtiranje obavlja na klijentu, a ako filtriranje obaviš preko SQL upita onda se filtriranje obavlja na serveru što je uglavnom efikasnije.
Zaista? Baš bi volio pročitati malo više o tome (stavi link) jer nekako baš i sumnjam... Primjerice, ja cijeli dataset imam isključivo u memoriji i tek se na server (bazu) spajam samo u trenutku update-a (post, delete), dok sve operacije (pa i SQL upite) vršim isključivo nad zapisima iz dataset-a u memoriji, a ne sa servera. Niti jedan SQL upit me nije tražio spajanje na server.
[ savkic @ 08.12.2007. 02:22 ] @
> Zaista? Baš bi volio pročitati malo više o tome (stavi link) jer nekako baš i sumnjam... Primjerice, ja cijeli dataset imam isključivo u memoriji i tek
> se na server (bazu) spajam samo u trenutku update-a (post, delete), dok sve operacije (pa i SQL upite) vršim isključivo nad zapisima
> iz dataset-a u memoriji, a ne sa servera. Niti jedan SQL upit me nije tražio spajanje na server.
Onda ne znam koje komponente koristiš, a ni bazu, možda SQLite? Nisam shvatio u koji deo sumnjaš, da je efikasnije izvršiti upit nad bazom? Tako je u opštem slučaju u client/server okruženju. Postoji li neki poseban razlog zašto sve prevlačiš na klijent i tu obrađuješ?
[ darko_sudarov @ 10.12.2007. 08:05 ] @
Koliko sam ja razumeo -a ti me ispravi ako gresim,ti zelis da iz neke tabele filtriras reci koje sadrze odredjeno slovo?
Znaci imas bazu jos nam reci koja je?
mislim da ti je najbrzi nacin da to dobijes preko SQLQueri-ja
Naprosto ukucas sta zelis-recimo
Code: SELECT IME FROM TBLIMENA WHERE IME CONTAINING :NEKOSLOVO
Ovo ti sigurno resava posao ,ako je to bio cilj:-)
I to je poenta price koju ti je sackic rekao -server ce to brze da odradi.
[ X Files @ 10.12.2007. 08:25 ] @
Citat:
Koliko sam ja razumeo -a ti me ispravi ako gresim,ti zelis da iz neke tabele filtriras reci koje sadrze odredjeno slovo?
... na tačno određenoj poziciji.
koliko sam ja razumeo.
[ darko_sudarov @ 10.12.2007. 08:39 ] @
I to moze baza da uradi samo jos da znamo koja je.
Na primer u firebirdu bi bilo
substr (TBLIMENA.IME,1,1)
to je na TACNO prvom mestu.
[ itf @ 10.12.2007. 08:56 ] @
Citat: Onda ne znam koje komponente koristiš, a ni bazu, možda SQLite? Nisam shvatio u koji deo sumnjaš, da je efikasnije izvršiti upit nad bazom? Tako je u opštem slučaju u client/server okruženju. Postoji li neki poseban razlog zašto sve prevlačiš na klijent i tu obrađuješ?
ADO komponente. Uvijek radim sve na klijentu jer server ne opterećujem konekcijom, a time i ne dovodim se u situaciju da prekoračim broj konekcija tj. da dođem do limita. Ovako je konekcija samo u trenutku zahtjeva i to je vrlo kratko vrijeme. Isto tako, na ovaj način mi je puno lakše analizirati da li je update uspio ili ne.. Riječ je o Access bazi.
Za sve ostale....
Želim napraviti da mi se u tablici prikaži samo riječi koje zadovoljavaju
Prva[N] == Druga[M], za svaki N i M >=0... da se izražim matematički... Ako postoji kakav SQL upit za ovo bio bi zahvalan...
[ darko_sudarov @ 10.12.2007. 09:10 ] @
Pojasni jos malo sta zelis da dobijes.
Citat: Prva[N] == Druga[M], za svaki N i M >=0... da se izražim matematički... Ako postoji kakav SQL upit za ovo bio bi zahvalan...
Ja ovo nisam razumeo :-(
[ itf @ 10.12.2007. 09:26 ] @
Primjerice, želim filtrirati sve riječi koje na poziciji N imaju znak 'X' i na poziciji M imaju znak 'Y'. Logički AND
[ X Files @ 10.12.2007. 10:24 ] @
Citat:
I to moze baza da uradi samo jos da znamo koja je.
Znam da može sa SQL-om:) Valjda postoje i oni džoker znaci _ koji su kao "čuvari mesta" za bilo koji drugi karakter unutar LIKE i sl.
Zapravo ja sam mislio na onaj slučaj sa osobinom Filter gde je tek ponešto od SQL arsenala dostupno.
Što se tiče onoga sa OnFilterRecord i Accept-a, ja bih išao na ovu varijantu (ako je to i dalje aktuelno):
Code:
bool ukrstenica( char *rec, char *sablon )
{
bool rezultat = true; // optimisticki
if ( strlen(rec) != strlen(sablon) )
return ( false );
for ( int i=0; i<strlen(rec); i++ )
if ( sablon[i] != ' ' )
if ( sablon[i] != rec[i] )
{
rezultat = false;
break;
}
return ( rezultat );
}
int main(int argc, char *argv[])
{
printf ( "%d\n", ukrstenica( "kalkulator"," a or" ) );
printf ( "%d\n", ukrstenica( "kalkulator"," a o " ) );
printf ( "%d\n", ukrstenica( "kalkulator"," " ) );
printf ( "%d\n", ukrstenica( "kalkulator"," a r " ) );
system("PAUSE");
return EXIT_SUCCESS;
}
... odnosno u kontekstu BCB-a:
Code:
// ...
char sablon[MAX];
// ... ovo dinamicki kreirati, po potrebi
strcpy(sablon, " a o ");
// ...
void __fastcall TForm1::ADOTable1FilterRecord(TDataSet *DataSet,
bool &Accept)
{
Accept = ukrstenica( ADOTable1->FieldByName("Rijec")->AsString.c_str(), sablon );
}
(dakle, kod unutar OnFilterRecord je isti, treba samo ispravno formirati sablon)
[Ovu poruku je menjao X Files dana 10.12.2007. u 11:52 GMT+1]
[ itf @ 10.12.2007. 11:17 ] @
Ne izgleda loše. Još samo nadopisati funkciju koja vraća šablonu u ovisnosti o tome što se traži i to je to. Hvala
[ savkic @ 10.12.2007. 12:29 ] @
> ADO komponente. Uvijek radim sve na klijentu jer server ne opterećujem konekcijom, a time i ne dovodim se u situaciju da prekoračim broj konekcija
> tj. da dođem do limita. Ovako je konekcija samo u trenutku zahtjeva i to je vrlo kratko vrijeme. Isto tako, na ovaj način mi je puno lakše
> analizirati da li je update uspio ili ne.. Riječ je o Access bazi.
Sa Accessom je tako jedino i moguće raditi (osim ako nema još neki sloj), sve se obavlja na klijentima i u onda u fajl baze koji se nalazi na serveru upisuje rezultat, tu nema klasičnog RDBMS client/server rada.
> Primjerice, želim filtrirati sve riječi koje na poziciji N imaju znak 'X' i na poziciji M imaju znak 'Y'. Logički AND
Mislim da i Access SQL podržava džoker karaktere u LIKE izrazu, konkretno to što tebi treba bi pisao kao:
WHERE POLJE LIKE '???X????Y????'; ili bolje '???X????Y*' (ako posle Y nema drugih slova koja se traže). Znači ? zamenjuje jedno bilo koje slovo, a * proizovoljan broj slova.
[ itf @ 10.12.2007. 13:40 ] @
Citat: Sa Accessom je tako jedino i moguće raditi (osim ako nema još neki sloj), sve se obavlja na klijentima i u onda u fajl baze koji se nalazi na serveru upisuje rezultat, tu nema klasičnog RDBMS client/server rada.
Po defaultu ADO komponente i rade stalnu konekciju s bazom i odmah svaku obradu spremaju direktno u nju. Ovaj način rada na klijentu je samo jedna opcija, a ne jedina mogućnost. Malo miješaš SQL server i Access jer Access je obična datoteka tj. mrežni resurs i jedino na osnovu toga pruža višeklijentsku mrežnu komunikaciju, dok SQL server je već druga priča i može raditi i pomoću TCP protokola i cijevi (pipes). Dakako, puno bolja stvar, no kompliciranija za realizaciju na klijentu i zato ga i ne koristim osim ako baš nije nužno.
[ savkic @ 10.12.2007. 17:24 ] @
> Po defaultu ADO komponente i rade stalnu konekciju s bazom i odmah svaku obradu spremaju direktno u nju. Ovaj način rada na klijentu je samo jedna
> opcija, a ne jedina mogućnost. Malo miješaš SQL server i Access jer Access je obična datoteka tj. mrežni resurs i jedino na osnovu toga
> pruža višeklijentsku mrežnu komunikaciju, dok SQL server je već druga priča i može raditi i pomoću TCP protokola i cijevi (pipes).
Ti si nešto izmešao ;) Govorim o Accessu, zato sam i napisao "sa Accessom je tako jedino i moguće..."
[ itf @ 11.12.2007. 08:39 ] @
Citat: Ti si nešto izmešao ;) Govorim o Accessu, zato sam i napisao "sa Accessom je tako jedino i moguće..." To uopće nije istina.
Malo potraži na googlu o modelima komunikacije između baza i klijenata pa pročitaj. Pozdrav
[ savkic @ 11.12.2007. 10:20 ] @
> To uopće nije istina.
> Malo potraži na googlu o modelima komunikacije između baza i klijenata pa pročitaj. Pozdrav
Ovo već prelazi izvan granica tehničke diskusije. Mislim da nisi shvatio šta sam napisao, jer si ti zapravo rekao isto što i ja. Access je file based baza, što znači da server nema aktivnu ulogu, sve se obavlja na klijentu bez obzira kako se pristupa, koje komponente ili vid komunikacije se koristi.
[ itf @ 11.12.2007. 10:59 ] @
Vjerujem da smo došli do nesporazuma glede pojma "server" pa je u tome nastao problem ;) NHF
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|