Wyszukiwanie +filtrowanie +DBGrid

0

Witam.
Mam tabelę 10 kolumn i b. dużo rekordów. Wszystkie kolumny są w Stringach, teraz tak:
chcę zrobić tak aby wyszukiwać jakaś frazę z edita (wyszukiwać ma ją zależnie od wyboru ComboBox kolumny). Teraz pytania:

  1. jak to zrobić żeby w DBGridzie podpiętym pod tą tabele wyświetlały mi się wartości spełniające ten warunek ale żeby nie był brana pod uwagę wielkość liter i żeby wyświetlał nawet rekord którego część pasuje do rządania?
  2. Kolumna 4 i 5 są to kolumny cena i marża (są tam liczby ale w stringach) nie wnikajmy dlaczego tak jest. Te kolumny mają być przeszukiwane od do kiedy robiłem to prze SetRange i warunkiem było np. od 100 do 500 to wyświetlało mi nawet 1000 itp. więc to trzeba jakoś na liczby zamienić:/ Cena - Float, Marża - Integer.

Do realizacji tego niechciałbym używać SQL, o ile to jest możliwe bez SQLa to prosze o podpowiedź.

Pozdrawiam

0

Nie trzeba tego robic w SQL.

Wiec tak:
ad 1. a) zaiteresuj sie OnFiltredRecord. Jest juz gdzies to tutaj dokladnie opisane.
Uzywasz czegos takiego:
if checkbox1.checked = true then
begin
if pos(edit1.text,table1.fieldvalues['Combobox1.text'])>0 then result:=false
else result:=true;
end
else
begin
if pos(Upercase(edit1.text),Upercase(table1.fieldvalues['Combobox1.text']))>0 then result:=false
else result:=true;
end;

(nie sprawdzalem czy dziala i jakis czas juz nie pisalem w delphi)

ad 2. Zmien rodzaj zawartosci kolumny po prostu (w zaleznosci od tego jakiej bazy wuzywasz mozesz uzyc Dabase Desktop (tak to sie zadaje nazywa, nawet nie mam delphi zaistalowanego).

0

No własnie problem w tym że baza tworzona jest programowo ponieważ jes zależna od pliku z którego importuje dane, następnie parsowane i wolałbym zostawić to wszystko w stringach bo łatwiej z lotu to poparsować. A to co napisałeś wcześniej pozwoli mi wyświetlić wszystkie rekordy spełniające warunek?

0

ad. 2 wszystkie!

a to zrob recznie najepiej;
table.filtred:=true;

ad. 1 musialbys troche pozmieniac ta OnFilteredRecord co Ci wczsniej napisalem. Dadaj to na poczatek

 
if (strtoint(table1.fieldvalues['Cana']) <100) OR (strtoint(table1.fieldvalues['Cana']) >500) then
 begin
 result:=false;
 exit;
 end;
0

Mógłbyś prosze troche sprecyzować, w jaki sposób oprogramować zdażenie OnFilterRecord i jak go wywołać tak aby wyświelił mi rekordy z przediału tylko od 100 do 500 np? Przepraszam że tak drąże ale musze to zrobić jak najszybciej bo inaczej będzie kiepsko :]

0

Musisz kolego czytac!!
To juz bylo tu poruszane. A poza tym to ja ci napisalem dokladnie tresc funkcji.
We wlasciwosciach tabeli ustawiasz albo recznie albo programowo Filter albo Filtred (nie pamietam na true). To dziala jak zwykla pętla i tam wpisujesz warunki ktorymi bedzie traktowany kazdy rekord. Gdy funkcja zworci wartosc true to rekord zostanie wyswietlony a jak false to nie.
Nie wiem co bys wiecej chcial abym ci napisal.
CZYTAJ to co juz zostalo wczesniej napisane!!

0

Ok. udało mi sie zrobić to filtrowanie, wszystko działa w porządku ale za pierwszym, drugim czasami trzecim wyszukiwaniem. Następnym razem przestaje działać i filtruje jakieś dziwne rzeczy :|Albo nic nie wyświetla:( Sprawdźcie to prosze... wcześniej ta procedura była krótsza i sprawdzała tylko czy ComboBoxy są różne od Cena i Marża ale to filtrowanie mnie troche zmyliło i przebudowałem ale dalej nie pasi :(

procedure TForm1.TableFilterRecord(DataSet: TDataSet; var Accept: Boolean);
begin
case (ComboBox1.ItemIndex) of
 0:     begin
            if pos(AnsiLowerCase(edit11.text),AnsiLowerCase(table.fieldvalues['Grupa']))>0 then Accept:=true
            else Accept:=false;
        end;
 1:     begin
            if pos(AnsiLowerCase(edit11.text),AnsiLowerCase(table.fieldvalues['Podgrupa']))>0 then Accept:=true
            else Accept:=false;
        end;
 2:     begin
            if pos(AnsiLowerCase(edit11.text),AnsiLowerCase(table.fieldvalues['Producent']))>0 then Accept:=true
            else Accept:=false;
        end;
 3:     begin
            if pos(AnsiLowerCase(edit11.text),AnsiLowerCase(table.fieldvalues['Nazwa']))>0 then Accept:=true
            else Accept:=false;
        end;
 4:     begin
           if (strtoFloat(table.fieldByName('Cena').AsString)>=StrToFloat(Edit11.Text)) and (strtoFloat(table.fieldByName('Cena').AsString)<=StrToFloat(Edit12.Text)) then
           Accept:=true else Accept:=false;
        end;
 5:     begin
           if (strtoInt(table.fieldByName('Marza').AsString)>=StrToInt(Edit11.Text)) and (strtoInt(table.fieldByName('Marza').AsString)<=StrToInt(Edit12.Text)) then
           Accept:=true else Accept:=false;
        end;
 6:     begin
            if pos(AnsiLowerCase(edit11.text),AnsiLowerCase(table.fieldvalues['Kod']))>0 then Accept:=true
            else Accept:=false;
        end;
 7:      begin
            if pos(AnsiLowerCase(edit11.text),AnsiLowerCase(table.fieldvalues['Gwarancja']))>0 then Accept:=true
            else Accept:=false;
        end;
 8:      begin
            if pos(AnsiLowerCase(edit11.text),AnsiLowerCase(table.fieldvalues['Opis']))>0 then Accept:=true
            else Accept:=false;
        end;
 9:      begin
            if pos(AnsiLowerCase(edit11.text),AnsiLowerCase(table.fieldvalues['Stan']))>0 then Accept:=true
            else Accept:=false;
        end;
 else
        begin
            if pos(AnsiLowerCase(edit11.text),AnsiLowerCase(table.fieldvalues['Grupa']))>0 then Accept:=true
            else Accept:=false;
        end;
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1