Šta je novo?

Potrebna Delphi 5 pomoc!

Filo

Čuven
Učlanjen(a)
28.12.2001
Poruke
3,703
Poena
710
Dakle ovako. U pitanju je Delphi 5.
Imam jednu formu.Na njoj ima par Edit polja i par combobox-ova.
Napravio sam i jedan SQL upit koji bi trebao zvuci ovako
'select * from tabela where tabela.polje1=edit1.text and tabela.polje2 like "%nesto%"....
(pa tako dok se ne izredaju svi editi); gdje je to nesto iz nekog od ostalih comboboxova ili edit-a - znaci pretrazivanje neke tabele po vise kriterijuma koji se unose na formi.
Kako to da uradim najbezbolnije? Jel moze neko da mi pomogne ili bar da me uputi na neki sajt na kom ima rjesenje?Neki primjer koji bi mi pomogao?
Moze i na mail!
Nesto sam cackao ali mi uglavnom prijavi 'type mismatch' ili tako nesto veselo!
Pomoc,ljudi!!!!!
 
Posto koristis peticu i ne razumes se izgleda mnogo u DB ovde, hajde da napravimo to sto jednostavnije za pocetak.

1. Kreiras novi DataModule (meni File/New)

2. Spustis na taj DataModule komponentu TDatabase (Data Access tab). Tu podesis parametre baze, u prvom redu database driver (interbase, foxpro, paradox, access, excel, etc) i DatabaseName ili AliasName. AliasName i DatabaseDriver su medjusobno iskljucivi, a DatabaseName se ponasa razlicito u odnosu na to da li je specifikovan Driver ili Alias. Pod aliasom se misli na BDE alias i mozes ga kreirati iz programa kao sto su SQL explorer, Database Desktop, itd .. koje ionako dobijas uz Delphi/CppBuilder.
- kada specifikujes alias, onda zadas samo proizvoljno databaseName (tipa "MyDatabase"); svi ostali parametri se preuzimaju iz definicije aliasa
- kada specifikujes samo DatabaseDriver, onda se pod DatabaseName navodi path do tvoje baze (zavisi od tipa, kod nekih [npr Paradox] je baza direktorijum, a svaka tabela posebni fajl, a kod drugih [npr Interbase] je baza samo jedan fajl). Najcesce treba definisati i ostale parametre. Najbolje da u tom slucaju izaberes "database explorer" iz popup menija iz desno-klika na TDatabase komponenti. Kod parametara izaberes "defaults", pa izbacis one koji ti ne trebaju (npr "roles" ako nisi definisao role u bazi). Treba ti minimum "User name" i "Password" ukoliko to ne zelis da prikazes login dijalog, niti da to uradis kroz code.

3. Stavis kontrolu koja iz baze obezbedjuje dataset - TTable ili TQuery. U oba slucaja specifikujes Database property na TDatabase komponentu iz tacke 2. U zavisnosti od toga da li si koristio TTable ili TQuery, rezultat ces dobiti:

3.a) TTable: subset dobijas formiranjem filtera; dakle nesto tipa:

[code:1]
var NewFilter: string;
...
NewFilter := Format('polje1=%s and polje2 > %s', [edit1.text, edit2.text]);
myTable.Close;
myTable.Filter := NewFilter;
MyTable.Open;
...
[/code:1]

3.b) TQuery; subset dobijas direktno na SQL upit. Sam SQL script mozes da specifikujes na vise nacina:

I) koristeci Format funkciju kao sa TTable:
NewQuery := Format('SELECT * FROM tabela1 WHERE polje1 = %s ...', [edit1.text, ...]);

II) koristeci SQL parametriranje (ovo bi trebalo biti SQL by the book). Uneses prvo SQL property:
...
MyQuery.SQL := 'SELECT * FROM tabela WHERE polje1 = :pPolje1 AND polje2 = :pPolje2 ...';

Nakon ovoga, TQuery komponenta ce sama pokupiti parametre (koji pocinju sa :, dakle pPolje1, pPolje2, ...) i smestiti ih u Params property, a sve sta ti treba da radis, jeste da ih menjas, tipa:

MyQuery.Params.ParamByName('pPolje1').AsString := edit1.Text;


4. Za svaku Dataset komponentu spustis na DataModule po jedan TDataSource, te u dataSet propertyju specifikujes odakle dobija podakte (iz koje TTable ili TQuery komponente). Sada mozes na svoju formu da stavljas data-aware komponente iz DataControls tab-a i pod DataSource navodis ove koje si kreirao u tacci 4.



Ovo je generalno uputstvo za najjednostavnije podesavanje. Tehnicki, moglo bi i bez dataModula i TDatabase komponente, ali cemu dirty programming ? Ako nesto nije jasno, vici.
 
OK
Stavio sam Ttable i filter na njoj i dobije podatke iza baze.Stavio sam i TDatasource i jedan DBGrid koji bi trebao da dobija podatke od TDatasource(koliko se sjecam).
Kada sve pokrene trebalo bi da se prikaze tabela iz baze ali "izfiltrirana",koliko sam razumeo.
Medjutim nije tako.DBGrid prikaze citavu tabelu(sve kolone) ali bez podataka a prema filteru bi trebalo da ima bar 3 reda.U cemu je sad problem?
 
Da se nisi mozda igrao sa sledecim:
- TTable, desno-dugme, FieldsEditor ili
- TDBGrid, desno-dugme, ColumnsEditor ?

Probaj prvo bez filtera, da bi video da li ttable donosi i prenosi sve podatke. Kada vidis da je to OK, onda pogledaj:

- property Filtered; true || false - enable or disable filtering
- property FilterOptions; stavljas da li se racunaju i parcijalni filteri (ako imas tabelu juzera, i stavis za filter "A", donece se svi juzeri koji pocinju sa "A"), kao i potvrda da li je filter case sensitive ili ne (velika=mala slova);
- ili si jednostavno uprskao filter; vodi racuna da je naziv columna dobro napisan (vezano i sa ovim CaseSensitive) i da je uslov ok, dakle "UserLevel = 2", na primer. Pazi se kod filtera koji testiraju string polja, tada treba da u filter ubacis i navodnike, a ako ti je to varijabla, onda su u pitanju navodnici u okviru navodnika -> NewFilter := 'UserName = ''Petrovic'' '; (ovo kod imena Petrovic nisu dvostruki navodnici, nego dva jednostruka za redom).

Kada postavljas ili menjas filter, u principu, preporucuje se da se dataset komponenta zatvori i onda otvori, tipa:

[code:1]
...
MojaTabela.DisableControls;
MojaTabela.Close;
MojaTabela.Filter := NoviFilter;
MojaTabela.Open;
MojaTabela.EnableControls;
...
[/code:1]

Ovo disable- i enablecontrols su procedure koje blokiraju/odblokiraju SVE data-aware komponente (dbgrid, dbedit, ...) koje se vezu na tu tabelu, dok se rade neke ovakve operacije na tabeli; u tvoj slucaju, da grid ne "skace" bas na svaku operaciju na tabeli.

Da li se sta donelo, mozes, naravno, proveriti sa MojaTabela.RecordCount propertyjem koji pokazuje koliko je recorda "doneseno". Ukoliko zelis bas da proveris da li je tabela prazna. moze da se koristi MojaTabela.IsEmpty (boolean) ili prosto da proveris da li su BOF i EOF true -> ako su oba true, onda je tabela prazna.

Naravno, nemoj database, table i ostale db komponente ostavljati "otvorenim" iliti active kao u projektu; tu ih zatvori, a kada se program startuje, onda pokusaj da ih otvoris; sve te operacije (otvori, upisi, brisi, izmeni, ...) lepo stavljaj u try...except blokove i proveravaj da nije EDatabaseError podignut.
 
greska!pOslao sam thread umjesto ovde da nastavim!

Opet ja i problemi!
Ovaj put sa QuickReport-ovima
Dakle ovako:
napravio sam jedan quickreport i povezao ga sa Table odakle dobija podatke.Tabela je povezana sa bazom i sve tu funkcionise kako treba.
Na reportu su i odgovarajuci QRDBtext-ovi , povezani sa odgovaraju?im kolonamna u tabeli.
Kad uradim
quickreport.preview;
otvori izvjestaj ali mi da samo zadnji slog iz tabele.
Pokusao sam i sa table.first;
i sa slicnim stvarima ali nece.Sto je najgore, sa istim properties za table i quickreport primjer iz Delphija funkcionise savrseni i izlista citavu svoju tabelu.
Znam da sam dosadan ali sta cu kad od sve literature imam jednu jedinu knjigu za Delphi ?Delphi5 - detaljan izvornik? koju je autor izgleda pisao kao podsjetnik za sebe a ovi nasi su je , takodje ?odlicno preveli?.
Hvala sto me trpite!
 
Nazad
Vrh Dno