Filtrowanie danych z tabeli Paradox

0

Witam!

Mam tabele Paradox w DBGrid. Kilkanaście kolumn i chciałbym te dane filtrować po wartościach z danej kolumny. Na przykład w jednej z kolumn mam nazwy miast. Nazwy te się powtarzają. Chciałbym aby dane z tej kolumny ładowały się podczas uruchamiania programu do komponentu np. DBComboBox (z tym że posortowane i usunięte duplikaty). Po wybraniu nazwy miasta z Combo Grid filtruje się i pokazuje tylko wiersze z tym miastem. Sprawa niby prosta ale jak zacząłem to robić to coś mi nie wychodzi. Zrobiłem to tak: Grid jest połączony z Table i DataSource. DBComboBox polaczony z Query i DataSource. Po odpaleniu nie ładuje się DBComboBox.... Uzyłem SMDBFilterComboBox (SM Components) no i ładnie się wypełnia tak jak chciałem tylko nie wiem jak odczytać z niego które miasto użytkownik wybrał... :( hmmm pewnie jest jakiś prosty sposób. Proszę o radę. Dzięki!!!

0

No tak wszystko fajnie ale ja to chcę zrobić przy pomocy czegoś w stylu ComboBoxa. Jak wstawię DBComboBox to on tylko pokazuje mi aktualną wartość a nie pokazuje mi listy wszystkich wartości w danej kolumnie. Dlatego użyłem SMDBFilterComboBox (bo w tej kolumnie są wartości puste oraz powtarzające się i do tego używam już filtra). I to działa. Tylko ja nie wiem jak przekazać wybraną wartość do filtra TTable??? Bo te komponenty nie mają właściwości Caption, Text itd. DBComboBox ma właściwość Items i mógłbym odczytać DBComboBox1.Items[0] i wpisać w filtr. Tylko że DBComboBox mi nie robi listy.... Jest tylko bieżąca wartość a jak rozwinę DBComboBoxa to nic więcej nie ma... Mam nadzieję że to wystarczająco opisałem uffff Pozdrawiam!

0

No to w OnCreate formy piszesz warunek:
Jeśli baza ma więcej niż 0 rekordów to

Table1.First;
  while not Table1.Eof do
     begin
        ComboBox1.Items.Add(Table1.FieldByName('Miasto').asString);
Table1.Next;
end;

A na końcu usuwaj duplikaty pętlą for z Comboboxa lub:

var
  SL: TStringList;
begin
  SL := TStringList.Create;
  SL.Sorted := True; // must be set, otherwise next line has no effect
  SL.Duplicates := dupIgnore; // don't accept duplicates
  SL.AddStrings(ComboBox1.Items);
  ComboBox1.Items.Assign(SL);
  SL.Free;
end;

I to byłoby na tyle w tym temacie, a potem już tylko stosujesz powyższe filtry z dodatkiem +Combobox1.Text:

  Dbf1.Filter := 'MIASTO='+Combobox1.Text;
  Dbf1.Filtered := True;

No i potem w Runtime na operacjach na bazie odpowiednio modyfikujesz listę w Comboboxie.
Teraz jak sobie nie poradzisz to [glowa]

0

No i działa. Dzięki wielkie! Nie wiem dlaczego próbowałem to na siłę robić przy pomocy komponentów DB (np. DBComboBox). Wydawało mi się że w ten sposób będzie działać szybciej. Zobaczymy co będzie gdy w bazie będzie kilka tysięcy rekordów. Dzięki jeszcze raz i pozdrawiam!

0

Paradox

Zobaczymy co będzie gdy w bazie będzie kilka tysięcy rekordów

Powodzenia...

0

Jeszcze jedna sprawa.... Dla każdej kolumny osobno zrobiłem sobie filtrowanie. W ten sposób użytkownik może bardzo szybko sobie wyświetlić to co go interesuje. Ale tych kolumn mam większą ilość i są różnej szerokości. Chciałbym jakoś hmmm "zakotwiczyć" te wszystkie ComboBoxy w tytule każdej z kolumn. Wtedy jeśli użytkownik przesunie sobie DBGrida np. 5 kolumn w prawo to dalej będzie ComboBox z odpowiednim filtrem przy odpowiedniej kolumnie. Ewentualnie może da się jakoś przesunięcie DBGrida zsynchronizować z przesunięciem Panelu na którym są te wszystkie ComboBoxy? Masz moze jakiś pomysł?

0

Np. wraz ze zmianą szerokości kolumny poruszaj Comboboxem/ami w prawo lub lewo..Left:=....
Ewentualnie możesz pokolorować kolumny i Comboboxy odpowiednimi barwami aby było widać który do której kolumny jest . ;]

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