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: 4716
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: 4716
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 3 gości

cron