Poslao: 30 Nov 2006 18:48
|
offline
- MSMarkoN
- Ugledni građanin
- Pridružio: 15 Maj 2006
- Poruke: 333
- Gde živiš: Babušnica
|
Nasao sam nesto na google o tome, ali imam problem.
Evo koda:
with ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('SELECT datum FROM table);
SQL.Add('WHERE datum BETWEEN :od_datum AND :do_datum' );
Parameters.ParamByName('od_datum').Value:=DateToStr(datetimepicker1.Date);
Parameters.ParamByName('do_datum').Value:=DateToStr(datetimepicker2.Date);
Open;
end;
Ovaj kod sam stavio na buttononclick, pokrene aplikaciju ali kada pretrazujem nista se ne desava.
od_datum i do_datum su parametri koje sam ubacio u editing Adoquerry1.parameters i postavio datatype na ftDateTime.
Treba li da daju vrednost nekoj komponenti ili datetimepicker odlucuje o tome jer parametri uzimaju njihovu vrednost?
Hvala!
|
|
|
Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
|
|
Poslao: 01 Dec 2006 14:46
|
offline
- Pridružio: 03 Nov 2006
- Poruke: 59
|
Ovaj upit upisi, recimo u neku promjenjivu:
npr. st,
st := 'SELECT datum FROM table '+
'WHERE datum BETWEEN :od_datum AND :do_datum' ;
i stavi prekidnu tacku, na st, tako da mozes pratiti vrijednosti za od_datum i do_datum.
Vjerovatno ih trebas pretvoriti u ispravan format.
Recimo da su ti postavke na bazi takve da ocekuju datum u obliku 15.nov.2006, a ti dobijes 15.11.2006.
Da li ti je upit korektan znaces kada sa F8 predjes preko koda linije
gdje otvaras Query. Ako ti tu pukne program, upit ne valja.
Kuzis me sta hocu da ti kazem?
Najbolje je da ovaj tvoj upit provjeris id DBEXPLORERA.
Ako ne uspijes, napisi cemu ti je jednako:
od_datum i do_datum.
|
|
|
|
Poslao: 01 Dec 2006 16:50
|
offline
- beli0135
- Executor
- Pridružio: 03 Jan 2005
- Poruke: 2990
- Gde živiš: Beograd
|
@MsMarkon
Ne radi se to tako.
Prvo, zapamti da NIKADA, ali NIKADA ne koristis .Value
with ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Text:='SELECT datum FROM table WHERE '+
'datum BETWEEN :od_datum AND :do_datum';
Parameters.ParamByName('od_datum').AsDateTime:=datetimepicker1.Date; Parameters.ParamByName('do_datum').AsDateTime:=datetimepicker2.Date;
end;
(malo me zeza editor, pa nije u liniji)
Drugo, izbegavaj With komandu kad god je moguce. Ume da pomesa loncice po nekad, a debug je skoro nemoguc bez pisanja cele komande.
|
|
|
|
|
Poslao: 01 Dec 2006 21:36
|
offline
- beli0135
- Executor
- Pridružio: 03 Jan 2005
- Poruke: 2990
- Gde živiš: Beograd
|
Zato sto je VALUE varijant, to znaci da prihvata sve, i u 90% slucajeva neces dobiti gresku, jer zavisi od baze, moze da ti proguta.
Primer: ubacujes DATUM u string polje (slucajno gresis). Ako koristis VALUE, bice automatski konvertovano u string, i bice ti zapisano "22/10/2001 12:19:10" u pogresno polje, umesto datuma u pravo polje, i uopste ti nece prijaviti gresku.
Onda das bazu klijentu i eto ti ribanja za koji dan...
Drugi, manji razlog, je to sto je varijant 10-ak puta sporiji, ali to je zanemarljivo u odnosu na ono gore navedeno.
|
|
|
|
Poslao: 08 Jan 2007 21:47
|
offline
- loshmi_sr
- Građanin
- Pridružio: 08 Jan 2007
- Poruke: 279
- Gde živiš: Srbija
|
Citat:Kako sad da napisem u kodu za button SQL upit. Na istom principu kao kod za pretragu datuma ?
Probao sam, ali ne razumem oko parametara sad, posto su stringovi u pitanju.
Povezao sam ADOQuery sa accessom preko conenction_string-a. Znaci na formi imam samo ADOQuery, Datasource, polja za
pretrazivanje (TEdit). Treba li mi jos nesto?
Pozdrav,
ako si ispravno povezao TADOQuery, TDataSet i TDBGrid, mogao bi otprilike ovako:
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM Neka_Tabela');
ADOQuery1.SQL.Add('WHERE Neko_Polje =' + QuotedStr(Edit1.Text));
ADOQuery1.Open;
Možda treba mala dorada, ispravka, nemam delphi pri ruci, ali suština je to.
Da, treba da obradiš event OnClick za TButton.
|
|
|
|
Poslao: 14 Jan 2007 17:56
|
offline
- srdjos
- Zaslužni građanin
- Pridružio: 27 Sep 2005
- Poruke: 678
|
prva stvar
nikad ne koristi ovo:
1.SQL.Add('WHERE Neko_Polje =' + QuotedStr(Edit1.Text));
stavi parametre i dodaj parametre kao AsDateTiem, AsInteger
ostavi drajveru za bazu (ODBC )da sam pretvori te vrednosti.
Pazi kako ti drajver pretvara datume jer ce ti mozda trebati
AsSQLTimeStamp
druga stvar, koristi DBExpress, ADO je u delphiju previse spor
DBexpress je native implementacija u Delphiju
Pozdrav
Srdjo
|
|
|
|
Poslao: 15 Jan 2007 03:40
|
offline
- MSMarkoN
- Ugledni građanin
- Pridružio: 15 Maj 2006
- Poruke: 333
- Gde živiš: Babušnica
|
Hvala svima na pomoci. Resio sam problem.
BIG Pozdrav!
|
|
|
|
Poslao: 16 Jan 2007 22:53
|
offline
- loshmi_sr
- Građanin
- Pridružio: 08 Jan 2007
- Poruke: 279
- Gde živiš: Srbija
|
Citat:nikad ne koristi ovo:
1.SQL.Add('WHERE Neko_Polje =' + QuotedStr(Edit1.Text));
@ srdjos
OK, mozda nije najbolje resenje, ali je jedan od nacina.
Citat:MSMarkoN:
Probao sam, ali ne razumem oko parametara sad, posto su stringovi u pitanju.
Ovako nesto:
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM Neka_Tabela');
ADOQuery1.SQL.Add('WHERE Neko_Polje = :Neko_Polje');
ADOQuery1.Parameters.ParamByName('Neko_Polje').Value:= Edit1.Text;
ADOQuery1.Open;
|
|
|
|
Poslao: 17 Jan 2007 22:23
|
offline
- srdjos
- Zaslužni građanin
- Pridružio: 27 Sep 2005
- Poruke: 678
|
opet, za parametre explicitno naglasi tip podaka
npr.
ADOQuery1.Parameters.ParamByName('Neko_Polje').AsString:= Edit1.Text;
druga stvar:
stavljaj
sql.TEXT := '...'
druga stvar, kad koristis parametre, uvek dodaj
Prepared := True;
znaci
with AdoQuery do begin
Close;
SQL.Clear;
SQL.Add('SELECT * FROM Neka_Tabela');
SQL.Add('WHERE Neko_Polje = :Neko_Polje');
Parameters.ParamByName('Neko_Polje').AsString:= Edit1.Text;
Prepared := True;
Open;
end;
Dopuna: 17 Jan 2007 22:23
opet, za parametre explicitno naglasi tip podaka
npr.
ADOQuery1.Parameters.ParamByName('Neko_Polje').AsString:= Edit1.Text;
druga stvar:
stavljaj
SQL.TEXT := '...'
druga stvar, kad koristis parametre, uvek dodaj
Prepared := True;
znaci
with AdoQuery do begin
Close;
SQL.Clear;
SQL.Text := 'SELECT * FROM Neka_Tabela' +#13+
'WHERE Neko_Polje = :Neko_Polje');
Parameters.ParamByName('Neko_Polje').AsString:= Edit1.Text;
Prepared := True;
Open;
end;
|
|
|
|