CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - TADOTable filtr z użyciem WILDCARD [wiele kolumn]

TADOTable filtr z użyciem WILDCARD [wiele kolumn]

Problemy związane z tworzeniem i zarządzaniem programami bazo-danowymi.
Regulamin działu


Zadając pytania dotyczące baz danych należy podawać szczegółowe informacje o bazie danych nad którą się pracuje, czyli:

  • Rodzaj serwera bazodanowego: MySql, MSSQL, Oracle itp.
  • Wersja bazy danych
  • Technologia bazodanowa używana w programie: ADO, DbExpress, InterBase
  • Komponenty użyte do zestawienia połączenia: ADOConnection, SqlConnection
  • Sposób zestawienia komponentów bazodanowych np. DataSet - DataSource - DbGrid lub DataSet - DataSetProvider - ClientDataSet - DataSource - DbGrid
  • Jeżeli używane były biblioteki innych firm niż Borland, CodeGeer i Embarcadero proszę podać ich nazwy, numer wersji i adres źródła.

TADOTable filtr z użyciem WILDCARD [wiele kolumn]

Nowy postprzez Ho88it » środa, 12 sierpnia 2009, 13:33

Problem: Użycie wildcard w komponencie TADOTable.

Filtrowanie rekordów nie liczbowych przez komponent TADOTable wygląda całkiem inaczej jak w TTable (nie używa znaku =) i możliwe jest użycie znaku % zamiast *.

Składnia filtra dla pojedynczej kolumny:
Kod: Zaznacz cały
NazwaKolumny+" Like '%SłowoSzukane%'";


Składnia filtra dla 2 kolumn:
Kod: Zaznacz cały
NazwaKolumny1 + " Like '%SłowoSzukane%' or "+ NazwaKolumny2 +" Like '%SłowoSzukane%'";


W całym filtrze ważne są spacje i słowo Like pisane z uwzględnieniem wielkości liter i SPACJI do momentu ujęcia szukanej frazy w apostrofy.
Słowo or pozwala na dodanie kolejnego kryterium wyszukiwania (zwiększa ilość wyników), a słowo and dodaje kolejny warunek do spełnienia przez rekordy bazy (zawęża ilość wyników).
Jeżeli nazwa kolumny posiada Spację to należy ją umieścić w nawiasie kwadratowym [ ].
Jeżeli filtrujemy wartości liczbowe to słowo Like należy zastąpić wyrażeniami matematycznymi np: < , > , = .


Kod: Zaznacz cały
void __fastcall TForm2::Edit1KeyUp(TObject *Sender, WORD &Key,
     TShiftState Shift)
{
if (Edit1->Text!="") { // nie uruchomi filtracji jeżeli pole będzie puste
    if (Key==VK_RETURN) {// filtracja rozpocznie się po naciśnięciu ENTER

    TADOTable1->Filtered = false; //wyłącza filtrację
    Label1->Caption = TADOTable1->Fields->Fields[1]->DisplayLabel;// Pomoże nam zorientować się po jakiej kolumnie program filtruje
                                          //(polecam używanie numeru kolumny z uwagi na łatwiejszą implementację zmiany)

    TADOTable1->Filter=TADOTable1->Fields->Fields[1]->DisplayLabel+" Like '%"+Edit1->Text+"%'"; // Treść filtra

    TADOTable1->Filtered = true;// filtruj tablicę
    }
}  else {TADOTable1->Filtered = false;}// jeżeli brak textu w kontrolce Edit1 to wyłącz filtr
}


Poprawiono nieścisłości w filtrowaniu wyrażeń liczbowych dzięki: Witoldowi, Cyfrowemu Baronowi i Banicie
Internet Explorer to program, który służy do przeglądania internetu z twojego komputera i na odwrót.
Avatar użytkownika
Ho88it
Homos antropiczny
Homos antropiczny
 
Posty: 63
Dołączył(a): niedziela, 10 sierpnia 2008, 20:53
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: Visual Studio 2008
Visual Studio 2010
Gadu Gadu: 0
    NieznanyNieznana

Re: TADOTable filtr z użyciem WILDCARD [wiele kolumn]

Nowy postprzez marcin w » niedziela, 3 października 2010, 18:11

Witam

Próbuję przefiltrować zawartość bazy danych po dwóch kolumnach, więc dane spełniają warunek zgodności wprowadzonych tekstów do Edit1 oraz Edit2 jednocześnie

W kodzie wygląda to tak
KOD sql:     UKRYJ  
  AnsiString w1 = ADOTable1->Fields->Fields[4]->DisplayLabel+" Like '%"+Edit1->Text+"%'";
  AnsiString w2 = ADOTable1->Fields->Fields[5]->DisplayLabel+" Like '%"+Edit2->Text+"%'";
  ADOTable1->Filter=w1 AND w2;

Niestety, ale kompilator woła o średnik za słowem And
Avatar użytkownika
marcin w
Bladawiec
Bladawiec
 
Posty: 4
Dołączył(a): niedziela, 3 października 2010, 18:04
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Win 7
Kompilator: BCB
Gadu Gadu: 0
    Windows 7Firefox

Re: TADOTable filtr z użyciem WILDCARD [wiele kolumn]

Nowy postprzez banita » niedziela, 3 października 2010, 21:33

w c++ nie ma słowa kluczowego 'AND'. jesli chcesz dodac dwa stringi to albo za pomoca przeciazonego operatora dodawania albo metody apped albo inna metoda ktora to umozliwia.
Avatar użytkownika
banita
Kreacjusz
Kreacjusz
 
Posty: 283
Dołączył(a): poniedziałek, 28 lipca 2008, 20:07
Podziękował : 1
Otrzymał podziękowań: 18
System operacyjny: Windows 7 Professional
Kompilator: C++Builder 2010 Update 5,
Delphi 2010 Update 5,
NetBeans 6.9(MinGw + Qt),
Visual Studio 2008 + Qt
Gadu Gadu: 0
    Windows 7Opera

Re: TADOTable filtr z użyciem WILDCARD [wiele kolumn]

Nowy postprzez marcin w » poniedziałek, 4 października 2010, 15:48

Wzorowałem się na pierwszym poście, gdzie do łączenia filtrów użyto słowa "or" lub "and".

Słowo or pozwala na dodanie kolejnego kryterium wyszukiwania (zwiększa ilość wyników), a słowo and dodaje kolejny warunek do spełnienia przez rekordy bazy (zawęża ilość wyników).
Ostatnio edytowano poniedziałek, 4 października 2010, 16:15 przez marcin w, łącznie edytowano 2 razy
Avatar użytkownika
marcin w
Bladawiec
Bladawiec
 
Posty: 4
Dołączył(a): niedziela, 3 października 2010, 18:04
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Win 7
Kompilator: BCB
Gadu Gadu: 0
    Windows 7Firefox

Re: TADOTable filtr z użyciem WILDCARD [wiele kolumn]

Nowy postprzez banita » poniedziałek, 4 października 2010, 15:57

to sa operator SQL. w C++ musisz je uwzglednic w stringu ktory zawiera zapytanei sql
Avatar użytkownika
banita
Kreacjusz
Kreacjusz
 
Posty: 283
Dołączył(a): poniedziałek, 28 lipca 2008, 20:07
Podziękował : 1
Otrzymał podziękowań: 18
System operacyjny: Windows 7 Professional
Kompilator: C++Builder 2010 Update 5,
Delphi 2010 Update 5,
NetBeans 6.9(MinGw + Qt),
Visual Studio 2008 + Qt
Gadu Gadu: 0
    Windows 7Opera

Re: TADOTable filtr z użyciem WILDCARD [wiele kolumn]

Nowy postprzez marcin w » poniedziałek, 4 października 2010, 16:15

Próbuję jakoś scalić te dwa filtry, niestety w żaden sposób nie mogę ich połączyć tak aby baza przyjęła ten filtr, zawsze mam komunikat:

Argumenty są niewłaściwego typu, wykraczają poza dopuszczalny zakres lub są ze sobą w konflikcie.

Dokładniej to ma formie mam 5 pól, gdzie wprowadzam jakiś tekst i w zależności od wartości checkbox (true lub false) przy danym polu odpowiadającym kolumnie w bazie danych tekst jest dodawany do filtra lub nie.
Avatar użytkownika
marcin w
Bladawiec
Bladawiec
 
Posty: 4
Dołączył(a): niedziela, 3 października 2010, 18:04
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Win 7
Kompilator: BCB
Gadu Gadu: 0
    Windows 7Firefox

Re: TADOTable filtr z użyciem WILDCARD [wiele kolumn]

Nowy postprzez Cyfrowy Baron » poniedziałek, 4 października 2010, 18:33

marcin w napisał(a):Niestety, ale kompilator woła o średnik za słowem And


więc zrób to tak:

KOD cpp:     UKRYJ  
  ADOTable1->Filter = w1 + "AND" + w2;


chyba, że chodzi o to, iż kompilator zgłasza błąd odnośnie AND, gdyż go nie rozpoznaje, wtedy robisz tak:

KOD cpp:     UKRYJ  
  ADOTable1->Filter = w1 + w2;
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: TADOTable filtr z użyciem WILDCARD [wiele kolumn]

Nowy postprzez marcin w » poniedziałek, 4 października 2010, 20:45

Już rozwiązałem problem, pewnie da się zrobić to poprzez "dynamiczne tworzenie filtra w pętlach, ale mnie prościej było najpierw stworzyć ciąg będący filtrem, potem go scalać w jeden długi ciąg będący filtrem

dokonałem tego poprzez:

Kod: Zaznacz cały
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Button1Click(TObject *Sender)
{
ADOTable1 -> Filtered = false;

AnsiString lacznik = " and ";
AnsiString filtr;
AnsiString filtr1 = ADOTable1->Fields->Fields[1]->DisplayLabel+" Like '%"+Edit1->Text+"%'";
AnsiString filtr2 = ADOTable1->Fields->Fields[2]->DisplayLabel+" Like '%"+Edit2->Text+"%'";
AnsiString filtr3 = ADOTable1->Fields->Fields[3]->DisplayLabel+" Like '%"+Edit3->Text+"%'";
AnsiString filtr4 = ADOTable1->Fields->Fields[4]->DisplayLabel+" Like '%"+Edit4->Text+"%'";
AnsiString filtr5 = ADOTable1->Fields->Fields[5]->DisplayLabel+" Like '%"+Edit5->Text+"%'";


bool m,n,o,p,r = 0;

if ((CheckBox1->Checked == true) && (Edit1->Text !=""))
        {
        filtr = filtr1;
        m=1;
        }
if ((CheckBox2->Checked == true) && (Edit2->Text !=""))
        {
        if (m==1)
        {
        filtr = filtr + lacznik + filtr2;
        }
        else
        {
        filtr = filtr2;
        }
        n=1;
        }


if ((CheckBox3->Checked == true) && (Edit3->Text !=""))
        {
        if (m==1 | n==1)
        {
        filtr = filtr + lacznik + filtr3;
        }
        else
        {
        filtr = filtr3;
        }
        o=1;
        }

if ((CheckBox4->Checked == true) && (Edit4->Text !=""))
        {
        if (m==1 | n==1 | o==1)
        {
        filtr = filtr + lacznik + filtr4;
        }
        else
        {
        filtr = filtr4;
        }
        p=1;
        }


if ((CheckBox5->Checked == true) && (Edit5->Text !=""))
        {
        if (m==1 | n==1 | o==1 | p==1)
        {
        filtr = filtr + lacznik + filtr5;
        }
        else
        {
        filtr = filtr5;
        }
        r=1;
        }


if (m==1 | n==1 | o==1 | p==1 | r==0)
        {
        ADOTable1 -> Filter = filtr;
        ADOTable1 -> Filtered = true;
        }



}
Avatar użytkownika
marcin w
Bladawiec
Bladawiec
 
Posty: 4
Dołączył(a): niedziela, 3 października 2010, 18:04
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Win 7
Kompilator: BCB
Gadu Gadu: 0
    Windows 7Firefox

Re: TADOTable filtr z użyciem WILDCARD [wiele kolumn]

Nowy postprzez Cyfrowy Baron » wtorek, 5 października 2010, 08:50

Ten zapis:

KOD cpp:     UKRYJ  
bool m,n,o,p,r = 0;


przypisuje wartość false tylko ostatniej zmiennej, czyli r. Pozostałe zmienne będą miały wartość domyślną true. Poza tym dla rozróżnienia od typów liczbowych powinieneś raczej stosować wartość true - false, gdyż tak jak zrobiłeś jest mało czytelnie. Poza tym jesteś niekonsekwentny, gdyż np. w tym kodzie:

KOD cpp:     UKRYJ  
CheckBox1->Checked == true


używasz już wartości true, a nie 1, a to przecież ten sam typ zmiennej. Takie niekonsekwencje wprowadzają w błąd.



Zamiast tak:

KOD cpp:     UKRYJ  
(Edit1->Text !="")


można tak:

KOD cpp:     UKRYJ  
( !Edit1->Text.IsEmpty() )




By zapisy warunków były krótsze zamiast:

KOD cpp:     UKRYJ  
if (m==1 | n==1 | o==1 | p==1 | r==0)


można je zapisać tak:

KOD cpp:     UKRYJ  
if ( m | n | o | p | !r )
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Bazy danych

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość

cron