Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Obrada uslova za Bazu?

[es] :: Pascal / Delphi / Kylix :: Obrada uslova za Bazu?

[ Pregleda: 2913 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

inherited
Novi Sad

Član broj: 95516
Poruke: 219
*.neobee.net.



Profil

icon Obrada uslova za Bazu?20.06.2006. u 15:53 - pre 217 meseci
Npr., imamo TEdit u koji unosimo IME lica. Kako obraditi uslov da ako nema tog lica u BP
prijavi ShowMessage ('Nema lica') i odradi SetFocus na taj TEdit? Video sam u jednoj temi
da je neko filtriranje odradio ovako:

if Edit1.Text<>'' then
if filter='' then
filter:='WHERE IME LIKE ''' + Edit1.Text + '%'' '
else
filter:='WHERE IME LIKE ''' + Edit1.Text + '%'' ';
tad ako ima lica ili pocinje na upisano slovo prikazuje se u dbgrid-u, a ako nema lica
dbgrid je prazan. Meni treba prijava, Message, da to lice ne postoji u BP, u slucaju
filtriranja kao sto sam naveo?!

Nadam se da cete razumeti?!!!
 
Odgovor na temu

Bojan Kopanja
Bojan Kopanja
Senior Web Developer, ZeusSoftware
Stara Pazova

Član broj: 6155
Poruke: 507
80.93.238.*

ICQ: 346697685
Sajt: www.zeussoftware.rs


Profil

icon Re: Obrada uslova za Bazu?20.06.2006. u 16:14 - pre 217 meseci
Ja bih to odradio sa locate umesto filtriranjem pa bi bilo mnogo jednostavnije . Evo recimo nesto ovako (pises u event OnKeyDown za Edit1):

Code:
if (Key = VK_RETURN) and (Edit1.Text <> '') then
begin
  if not ADOTable1.Locate('IME', Edit1.Text, [loPartialKey]) then
  begin
    ShowMessage('Nema Lica!');
    Edit1.Clear;
    Edit1.SetFocus;
  end;
end;


E sad, ovo sam pisao direktno ovde, znaci bez provere tako da sma mozda omanuo ime eventa recimo ili onog treceg parametra za Locate, ali u sustini to ti je to .

Eto, probaj pa javi da li radi ...
 
Odgovor na temu

inherited
Novi Sad

Član broj: 95516
Poruke: 219
*.neobee.net.



Profil

icon Re: Obrada uslova za Bazu?20.06.2006. u 17:14 - pre 217 meseci
Radim s ADOQuery-jem, pa ako bi mogao uslov da se obradi u mom primeru?!
 
Odgovor na temu

Bojan Kopanja
Bojan Kopanja
Senior Web Developer, ZeusSoftware
Stara Pazova

Član broj: 6155
Poruke: 507
80.93.238.*

ICQ: 346697685
Sajt: www.zeussoftware.rs


Profil

icon Re: Obrada uslova za Bazu?20.06.2006. u 17:40 - pre 217 meseci
Napisi sve isto kao sto sam gore naveo samo umsto ADOTable stavi ADOQuery i gotovo .
 
Odgovor na temu

inherited
Novi Sad

Član broj: 95516
Poruke: 219
*.neobee.net.



Profil

icon Re: Obrada uslova za Bazu?20.06.2006. u 18:28 - pre 217 meseci
Code:

procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if (Key = VK_RETURN) and (Edit1.Text <> '') then
begin
  if not ADOQuery.Locate('SIFRA', Edit1.Text, [loPartialKey]) then
   begin
   ShowMessage('Nema Lica!');
   Edit1.Clear;
   Edit1.SetFocus;
   end
  else
   filter:='';
   ADOQuery.Close;
   ADOQuery.SQL.Clear;
   ADOQuery.SQL.Add('SELECT * FROM CLANOVI');
    if Edit1.Text<>'' then
     if filter='' then
        filter:='WHERE SIFRA LIKE ''' + Edit1.Text + '%'' '
       else
          filter:='WHERE SIFRA LIKE ''' + Edit1.Text + '%'' ';
    ADOQuery.SQL.Add(filter);
    ADOQuery.Open;
end;


Ovako sam obradio pretragu, koja javlja ako nema lica u tabeli... Ali?!
Mislim da se kod jos moze procistiti i time smanjiti i postati optimalniji?
 
Odgovor na temu

Bojan Kopanja
Bojan Kopanja
Senior Web Developer, ZeusSoftware
Stara Pazova

Član broj: 6155
Poruke: 507
80.93.238.*

ICQ: 346697685
Sajt: www.zeussoftware.rs


Profil

icon Re: Obrada uslova za Bazu?20.06.2006. u 19:23 - pre 217 meseci
Posto me ocigledno nisi razumeo evo ti jos jednom ceo kod koji ti treba:

Code:
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (Key = VK_RETURN) and (Edit1.Text <> '') then
  begin
    if not ADOQuery.Locate('SIFRA', Edit1.Text, [loPartialKey]) then
     begin
     ShowMessage('Nema Lica!');
     Edit1.Clear;
     Edit1.SetFocus;
     end
    else
  end;
end;


Ovo ce ti izbciti poruku da nema lica ako nista nije odgovaralo unesenome u Editu ili ce se pozicionirati na ono sto pocinje kao ono iz Edita.

Samo jos da ti kazem da ako vec koristis ADOQuery ne trebas da koristis filter na nacin na koji si to u prethodnom postu koristio posto ako uradis SELECT * FROMTABELA pa onda stavljas filter i nema previse logike to sto koristis ADOQuery umestoADOTable-a. Te stvari trebas da odmah ubacujes u SQL koji pises u ADOQuery-u pa bi ti ono sto si ti radio sa filterom jednostavno izgledalo ovako:

Code:
ADOQuery.SQL.Add('SELECT * FROM CLANOVI WHERE SIFRA LIKE '+QuotedStr(Edit1.Text+'%')+';');


Eto, to ce ti odraditi isto ono sto si ti radio sa filterom, a mnogo je jednostavnije...
 
Odgovor na temu

inherited
Novi Sad

Član broj: 95516
Poruke: 219
*.neobee.net.



Profil

icon Re: Obrada uslova za Bazu?21.06.2006. u 00:34 - pre 217 meseci
Locate je OK, ali mislim da je bolje kad se izvrsi filtriranje, preglednije je, a ovako pozicionira se trazeni kljuc izmedju ostalih kljuceva, sto i nije bas pregledno, bar meni.
Dalje, mislim da je bolje i prakticnije koristiti Query komponente i zbog samog opterecenja BP, brzih upita i jednostavnosti. Kad odradimo npr. ( mozda ce biti greske u sintaksi ):
Code:
 
SELECT Naziv_Kolone FROM Naziv_Tabele
WHERE Naziv_Kolone = '15105'

pa to u delphi-ju, suzava se uslov pretrage, smanjuje se opterecenje i dobija se na brzini?!
Sto se tice:
Code:

ADOQuery.SQL.Add('SELECT * FROM LICA WHERE SIFRA LIKE '+QuotedStr(Edit1.Text+'%')+';');

verovatno si u pravu?!!!
 
Odgovor na temu

Bojan Kopanja
Bojan Kopanja
Senior Web Developer, ZeusSoftware
Stara Pazova

Član broj: 6155
Poruke: 507
80.93.238.*

ICQ: 346697685
Sajt: www.zeussoftware.rs


Profil

icon Re: Obrada uslova za Bazu?21.06.2006. u 08:39 - pre 217 meseci
Pa OK, ako ti je to preglednije radi tako... Ja sam iz prvog posta zakljucio da tebi ne odgovara da ti DBGrid ostane prazan ako nema lica koje je trazeno, pa sam ti zato napisao ovako kako sam napisao . Moras malo jasnije da opisujes problem .

Eto, tebi onda treba ovo ako sam opet dobro razumeo ( ako bas hoces preko filtera da radis ):

Code:
if Edit1.Text <> '' then
ADOQuery1.Filter:= 'WHERE IME LIKE ' + QuotedStr(Edit1.Text + '%') + ';';
ADOQuery1.Filtered:= True;


Mada je meni ovo bez veze ... Pa i sam si napisao u nekoliko postova gore ovaj kod:

Code:
.....
   else
   filter:='';
   ADOQuery.Close;
   ADOQuery.SQL.Clear;
   ADOQuery.SQL.Add('SELECT * FROM CLANOVI');
    if Edit1.Text<>'' then
     if filter='' then
        filter:='WHERE SIFRA LIKE ''' + Edit1.Text + '%'' '
       else
          filter:='WHERE SIFRA LIKE ''' + Edit1.Text + '%'' ';
    ADOQuery.SQL.Add(filter);
    ADOQuery.Open;


A to ti nije nista drugo do

Code:
ADOQuery1.SQL.Add('SELECT * FROM CLANOVI WHERE SIFRA LIKE '+QuotedStr(Edit1.Text + '%')+';');


Tako da tu nisi uradio nista sa samim filterom nego si samo poslao novi SQL upit bazi, a to ce ti nepotrebno opteretiti bazu posto podatke vec imas u njoj i mozes jednostavno da ih pretrazis sa Locate. Ovako samo imas jedan upit vise...

I na kraju ako bas hoces da ti se selektuju samo oni rekordi koji odgovaraju pretrazi onda ti treba ovako nesto:

Code:
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (Key = VK_RETURN) and (Edit1.Text <> '') then
  begin
    if not ADOQuery.Locate('SIFRA', Edit1.Text, [loPartialKey]) then
    begin
      ShowMessage('Nema Lica!');
      Edit1.Clear;
      Edit1.SetFocus;
    end
    else
    begin
      ADOQuery1.Close;
      ADOQUery1.SQL.Clear;
      ADOQUery1.SQL.Add('SELECT * FROM CLANOVI WHERE SIFRA LIKE '+QuotedStr(Edit1.Text + '%')+';');
      ADOQuery1.Open;
    end;
  end;
end;


Vrlo verovatno sam napravio koju gresku u kodu posto sam tek ustao, tako da jos ne razmisljam bistro .

[Ovu poruku je menjao Strog dana 21.06.2006. u 09:53 GMT+1]
 
Odgovor na temu

inherited
Novi Sad

Član broj: 95516
Poruke: 219
*.dialup.neobee.net.



Profil

icon Re: Obrada uslova za Bazu?21.06.2006. u 11:11 - pre 217 meseci
OK, da usvojimo ovo kao ispravno, programerski:
Code:

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (Key = VK_RETURN) and (Edit1.Text <> '') then  begin
    if not ADOQuery.Locate('SIFRA', Edit1.Text, [loPartialKey]) then begin
       ShowMessage('Nema Lica!');
       Edit1.Clear;
       Edit1.SetFocus;
      end
    else begin
     ADOQuery.Close;
     ADOQuery.SQL.Clear;
     ADOQuery.SQL.Add('SELECT * FROM LICA WHERE SIFRA LIKE '+QuotedStr(Edit1.Text+'%')+';');
     ADOQuery.Open;
    end
  end;
end;

Imao bih jos jedno pitanje. Da li bi se u ovom primeru mogao obraditi uslov:
Code:

if Edit1.Text = '' then ShowMessage('Unesite uslov za pretragu!');


BTW, sta znaci funkcija QuotedStr?
 
Odgovor na temu

Miloš Baić
Miloš Baić
ERP (Dynamics NAV) programer
Beograd

Član broj: 72468
Poruke: 1155
*.neobee.net.



Profil

icon Re: Obrada uslova za Bazu?21.06.2006. u 12:28 - pre 217 meseci
Kad imate jedan uslov za pretragu, onda je sasvim uredu da kod izgleda ovako:
Code:

if (Key = VK_RETURN) and (TntEdit1.Text <> '') then
begin
  if not ADOQuery.Locate('SIFRA', Edit1.Text, [loPartialKey]) then
   begin
   ShowMessage('Nema Lica!');
   Edit1.Clear;
   Edit1.SetFocus;
   end
  else begin
  ADOQuery.Close;
  ADOQuery.SQL.Clear;
  ADOQuery.SQL.Add('SELECT * FROM LICA WHERE SIFRA LIKE '+QuotedStr(Edit1.Text+'%')+';');
  ADOQuery.Open;
  end
end;

Ali, kad imate tri Tedit-a (uslova po kojima se moze vrsiti pretraga), recimo, po mom iskustvu,
najbolja varijanta je:
Code:

...
filter: String;
...
  filter:='';
  ADOQuery.Close;
  ADOQuery.SQL.Clear;
  ADOQuery.SQL.Add('SELECT * FROM LICA');
    if Sifra.Text<>'' then
       if filter='' then
          filter:='WHERE SIFRA LIKE ''' + Sifra.Text + '%'' '
       else
          filter:='WHERE SIFRA LIKE ''' + Sifra.Text + '%'' ';
    if Prezime.Text<>'' then
       if filter='' then
          filter:='WHERE PREZIME LIKE ''' + Prezime.Text + '%'' '
       else
          filter:='WHERE PREZIME LIKE ''' +  Prezime.Text + '%'' ';
    if Ime.Text<>'' then
       if filter='' then
          filter:='WHERE IME LIKE ''' + Ime.Text + '%'' '
       else
          filter:='WHERE IME LIKE ''' + Ime.Text + '%'' ';
  ADOQuery.SQL.Add(filter);
  ADOQuery.Open;
  Sifra.Clear;
  Prezime.Clear;
  Ime.Clear;

Mada, sve je to stvar znanja, iskustva i ukusa...

Someone's sitting in the shade today because someone planted a tree a long time ago.
 
Odgovor na temu

Bojan Kopanja
Bojan Kopanja
Senior Web Developer, ZeusSoftware
Stara Pazova

Član broj: 6155
Poruke: 507
195.178.35.*

ICQ: 346697685
Sajt: www.zeussoftware.rs


Profil

icon Re: Obrada uslova za Bazu?21.06.2006. u 14:41 - pre 217 meseci
Da, samo sto mi se cini ( ovako kompajlirano u glavi )
da ti ovo nece bas raditi tako kako bitrebalo da radi... Ja mislim da bi trebalo ovako da se napise:

Code:

...
filter: String;
...
  filter:='';
  ADOQuery.Close;
  ADOQuery.SQL.Clear;
  ADOQuery.SQL.Add('SELECT * FROM LICA');
    if Sifra.Text<>'' then
       if filter='' then
          filter:='WHERE SIFRA LIKE ''' + Sifra.Text + '%'' '
       else
          filter:=filter + ' AND SIFRA LIKE ''' + Sifra.Text + '%'' ';
    if Prezime.Text<>'' then
       if filter='' then
          filter:='WHERE PREZIME LIKE ''' + Prezime.Text + '%'' '
       else
          filter:=filter + ' AND PREZIME LIKE ''' +  Prezime.Text + '%'' ';
    if Ime.Text<>'' then
       if filter='' then
          filter:='WHERE IME LIKE ''' + Ime.Text + '%'' '
       else
          filter:=filter + ' AND IME LIKE ''' + Ime.Text + '%'' ';
  ADOQuery.SQL.Add(filter);
  ADOQuery.Open;
  Sifra.Clear;
  Prezime.Clear;
  Ime.Clear;


E sad bi trebao filter da ti izgleda kako treba, a onako kako si ti napisao mislim da bi u filteru bio uvek samo deo za filtriranje po Imenu, bez obzira na to da li je bilo ostala 2 argumenta za pretragu.
 
Odgovor na temu

Miloš Baić
Miloš Baić
ERP (Dynamics NAV) programer
Beograd

Član broj: 72468
Poruke: 1155
*.neobee.net.



Profil

icon Re: Obrada uslova za Bazu?21.06.2006. u 15:10 - pre 217 meseci
Pozdrav,

mislim da su oba načina korektna. U mom slučaju, bilo koji od ponuđenih uslova
da se upiše, vršiće se filtriranje prema njemu. Dakle ako u IME unesemo "M",
filtriraće se lica čije ime ppočinje sa M, a ako unesemo "Miloš", filtriraju se lica
sa tim imenom. Ako u PREZIME unesmo "B" a u IME "M", filtriraju se lica čije prezime počinje
sa "B" , a ime sa "M". A ako unesemo "Baić" "Miloš", filtrira se traženi uslov...
Provereno ispravno funkcioniše...
Someone's sitting in the shade today because someone planted a tree a long time ago.
 
Odgovor na temu

inherited
Novi Sad

Član broj: 95516
Poruke: 219
*.neobee.net.



Profil

icon Re: Obrada uslova za Bazu?21.06.2006. u 15:21 - pre 217 meseci
Evo kako sam ja odradio ShowMessage ako nema lica u tabeli:
Code:

procedure TForm.EditSIFRAKeyDown(Sender: TObject;
  var Key: Word; Shift: TShiftState);
begin
    if (Key = VK_RETURN) and (EditSIFRA.Text <> '') then  begin
          ADOQuery.Close;
          ADOQuery.SQL.Clear;
          ADOQuery.SQL.Add('SELECT * FROM Lica WHERE SIFRA LIKE '+QuotedStr(EditSIFRA.Text+'%')+';');
          ADOQuery.Open;
          EditPREZIME.Text:= ADOQuery.FieldByName('PREZIME').AsString;
          EditIME.Text:= ADOQuery.FieldByName('IME').AsString;
          EditMOBILNI.Text:= ADOQuery.FieldByName('MOBILNI').AsString;
          if EditPREZIME.Text='' then
            ShowMessage('Ne postoji clan sa takvom šifrom!');
         end
end;

Vrsi se filtriranje, ako nije pronjadjen record, EditPREZIME - EditIME - EditMOBILNI, su prazni, pa ako je EditPREZIME.Text
prazno, tad ShowMessage('Ne postoji clan sa takvom šifrom!');
Simpaticno?

Dalje, niste mi rekli sta znaci funkcija QuotedStr? Nesto radi s string - om?! Al sta?
 
Odgovor na temu

Bojan Kopanja
Bojan Kopanja
Senior Web Developer, ZeusSoftware
Stara Pazova

Član broj: 6155
Poruke: 507
195.178.35.*

ICQ: 346697685
Sajt: www.zeussoftware.rs


Profil

icon Re: Obrada uslova za Bazu?21.06.2006. u 16:32 - pre 217 meseci
@ loshmiscg

Moguce, nisam probao ovo tvoje posto me mrzelo da kucam primer samo za to , a ovo moje znam 100% da radi, tako da je vrlo lako moguce da oba nacina rade kako treba.

@ingerited

QuotedStr ti menja onu sumu apostrofa u kodu, tj. da ne bi pisao SELECT * FROM BAZA WHERE IME = 'NEKOIME' pa sve to jos moras da stavis u apostrofe za delfijev string pa se tu stvari malo komplikuju ti lepo stavis SELECT * FROM BAZ WHERE IME = QuotedStr(NEKOIME) i tu si zavrsio sa apostrofima ... Znaci mnogo je preglednije i manje se gresi...
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Obrada uslova za Bazu?

[ Pregleda: 2913 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.