Strona 1 z 2

ADOQuery błąd przy próbie filtrowania

Nowy postNapisane: piątek, 11 września 2009, 10:35
przez Ho88it
Cytat z postu "dbExpress i MSSQL 8, Zestawienie połącznienia."
banita napisał(a):Co do ADO to kiedys pisalem taki sytem podpowiedzi (sugerowanie co uzytkownik moze wprowadzic w danym polu, mozliwe wartosci pobierane z bazy np kody pocztowe). podczas wprowadzanai danych rozwija sie lista ktora parsowala sugerowane wyniki zgodnie z tym co zostalo juz wprowadzone. parsowanie opieralo sie o filtrowanie wynikow w ADOQuery i DBGrid, calosc chodzi pieknie i nie ma problemow z oodswiezaniem.

jesli chcesz odczytac wartosci z komorek w DBGrid to musisz odwolac sie do obiektu TADOQueery ktory jest polaczony z tym gridem. bezposrednio do tego query albo za posrednictwem wlasciwosci datasource, data set ....


Dla rozwiania wątpliwości.
ADOQuery->SQL->Text -używane do połączenia kilku tabel w jedną (inner join, outer join.. itp), nie przewiduję filtrowania przez kwerendę bo program ma być jak najbardziej intuicyjny.
ADOQuery->Filter - tym filtruję wyniki zwrócone z kwerendy (filtrowanie wyników można dostrzec przez zmianę paska pionowego przewijania DBGrid1, ale nie na arkuszu DBGrid1).

Kod: Zaznacz cały
void __fastcall TForm1::Edit1KeyUp(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
if (Key==VK_RETURN){
        if (Edit1->Text!=""){
           ADOQuery1->Filtered=false;
           ADOQuery1->Filter=ComboBox1->Text+" Like '*"+Edit11->Text+"*'";//combobox przechowuje nazwy kolumn, edit1 to treść filtra
           ADOQuery1->Filtered=true;//teraz powinno odbyć się filtrowanie i DBGrid1 powinno się odświerzyć

        }else
         
        ADOQuery1->Filtered=false;

}
}


Jeżeli zamiast ADOQuery1 wstawie ADOTable1 to wszystko działa bez zarzutu ale nie mam potrzebnych danych z innych tabel..

Re: dbExpress i MSSQL 8, Zestawienie połącznienia.

Nowy postNapisane: piątek, 11 września 2009, 12:59
przez banita
ADOQuery1->Filtered

ustaw raz na true. pozniej tylko zmieniac warunek filtru bez wlacz/wylacz i zobacz czy cos pomaga.

Re: dbExpress i MSSQL 8, Zestawienie połącznienia.

Nowy postNapisane: poniedziałek, 14 września 2009, 10:03
przez Ho88it
Nie działa... ale pojawiło się coś ciekawego... Po wprowadzeniu treści filtra ręcznie z takimi ustawieniami:

ADOQuery1->Active=true
ADOQuery->Filtered=false
ADOQuery->Filter="nzw_Kont Like '*wp*'"

po zmianie ADOQuery->Filtered=true filtr działa w środowisku... :o ale bez kompilacji programu...
po programowym ustawieniu takich parametrów w zdarzeniu OnKeyUp i uruchomieniu nic takiego się nie dzieje... Co dziwne, po naciśnięciu [ENTER] windows wydaje dźwięk "Ding.wav", a powinien po zwolnieniu klawisza!! a nigdzie w programie nie mam użytej funkcji OnKeyDown lub OnKeyPress.

Tak wygląda hierarchia obiektów na formie.
F1 i F2 to TEdit, a PanelKontrahenta i PanelDokumentów to zwykły TPanel.

Re: dbExpress i MSSQL 8, Zestawienie połącznienia.

Nowy postNapisane: poniedziałek, 14 września 2009, 13:28
przez banita
dla jakiego komponentu obslugujesz to OnKeyUp?

ja filtrowalem w edicie. zdarzenie onchange edita i w momencie wprowadzania nowych znakow gird sie pieknie filtrowal.

Re: dbExpress i MSSQL 8, Zestawienie połącznienia.

Nowy postNapisane: poniedziałek, 14 września 2009, 13:37
przez Ho88it
Oczywiście dla TEdit .. OnKeyUp używam bo OnChange się wykrzacza jeżeli w treści filtra nigdzie nie będzie * a wartość Edit1->Text będzie pusta.. wyskoczy błąd, że szukana wartość nie może być NULL (w przypadku tabel MASTER-DETAIL).
Najgorsze, że wszystko działa jak filtruje się pod środowiskiem lub ADOQuery zastąpi się ADOTable.
Spróbuje użyć OnChange ale jestem sceptyczny.. :?

Re: dbExpress i MSSQL 8, Zestawienie połącznienia.

Nowy postNapisane: poniedziałek, 14 września 2009, 13:49
przez banita
a jak dasz w onchange:

Kod: Zaznacz cały
   if(dynamic_cast<TEdit*>(Sender)->Text.IsEmpty())
   {
      data_set_->Filter = "";   
      return;
   }
   try
   {
      data_set_->Filter = filter_field_ + " LIKE '" + dynamic_cast<TEdit*>(Sender)->Text + "*'";
  }

Re: dbExpress i MSSQL 8, Zestawienie połącznienia.

Nowy postNapisane: poniedziałek, 14 września 2009, 14:24
przez Ho88it
No... działa... :D teraz wytłumacz mi czemu dopiero przez dynamiczne rzutowanie a nie normalnie... Na przyszłość uniknę podobnych problemów.

Re: dbExpress i MSSQL 8, Zestawienie połącznienia.

Nowy postNapisane: poniedziałek, 14 września 2009, 14:50
przez banita
nie ma znaczenie czy odwolasz sie bezposrednio do tego edita czy poprzez wskaznik TObject ktory wywolal owe zdarzenie.
w moim przypadku zdarzenie bylo uzywane przez kilka komponentow wiec kosytalem z rzutowania i wskaznika TObject.

Re: dbExpress i MSSQL 8, Zestawienie połącznienia.

Nowy postNapisane: środa, 16 września 2009, 15:06
przez Ho88it
banita napisał(a):nie ma znaczenie czy odwolasz sie bezposrednio do tego edita czy poprzez wskaznik TObject ktory wywolal owe zdarzenie.
[...]

Powinno tak być.. ale chyba jest inaczej..

Ten sposób który podałeś jest dobry w przypadku wywołania zdarzenia przez obiekt.. a ja potrzebuję też zdefiniować na sztywno pewne schematy tworzenia raportu wg. filtrowanych wyników z kwerend
(zmiana kwerendy -> ładowanie kwerendy -> uruchomienie kwerendy -> filtrowanie wyników -> podgląd raportu).
Problem znów mnie trapi ten sam. Jaka jest tego przyczyna, że przy próbie użycia filtru "statycznego" wywala błąd "Nie można otworzyć filtru".
Problem dotyczy TYLKO ADOQuery.

Przykładowe filtrowanie kwerendy przy wyborze jednej z opcji menu podręcznego:
Kod: Zaznacz cały
void __fastcall TForm1::Kontrahenta1Click(TObject *Sender)// moja nazwa opcji w PopUpMenu
{
QRaport->Filtered=false;//QRaport to ADOQuery
QRaport->Filter= "nzf_IdAdresu LIKE '*" + GridKontrahenci->Fields[10]->Value + "*'";//GridKontrahenci to DBGrid
QRaport->Filtered=true;
RDluznik->PRaport->Preview();//RDluznik to QReport
}
//---------------------------------------------------------------------------

Re: ADOQuery błąd przy próbie filtrowania

Nowy postNapisane: środa, 16 września 2009, 20:59
przez banita
a czy GridKontrahenci nie jest podpiety do QRaport?

Re: ADOQuery błąd przy próbie filtrowania

Nowy postNapisane: czwartek, 17 września 2009, 09:33
przez Ho88it
Połączenie jest takie:
Kod: Zaznacz cały
DBGrid->DataSource = DSKontrahenci //TDataSource
DSKontrahenci->DataSet = QKontrahenci //TADOQuery
QKontrahenci->Connection = DBConnect //TADOConnect


Czyli podpięty jest przez TDataDource. A to coś złego?

Re: ADOQuery błąd przy próbie filtrowania

Nowy postNapisane: czwartek, 17 września 2009, 10:01
przez banita
chyba sie zagubilem i teraz nie wiem w czym problem:).

dodam tez ze filtorwac mozesz tylko pola tekstowe. jesli pole jest np numeric to pobierajac je z bazy musisz je rzutowac na text

Re: ADOQuery błąd przy próbie filtrowania

Nowy postNapisane: czwartek, 17 września 2009, 10:39
przez Ho88it
I pewnie też dynamicznie, bo występuje opcja wyboru kolumny wg. której ma się odbywać filtrowanie i zmieniają się typy danych.
Zrobienie tego w ten sposób, na przykład nie przejdzie..

Kod: Zaznacz cały
void __fastcall TForm1::Kontrahenta1Click(TObject *Sender)
{
int Id=GridKontrahenci->Fields[10]->Value;// na próbę bez dynamicznego rzutowania

QRaport->Filtered=false;
QRaport->Filter= "nzf_IdAdresu LIKE '*" + IntToStr(Id) + "*'";
QRaport->Filtered=true;

RDluznik->PRaport->Preview();
}

Też wywala błąd po skompilowaniu i próbie filtrowania...

Re: ADOQuery błąd przy próbie filtrowania

Nowy postNapisane: czwartek, 17 września 2009, 10:47
przez banita
rzutowanie musi sie odbyc na poziomie wyciagania danych z bazy.

przykladowo pole jest numeryczne, ty zrzutujesz je na text w programie, to nic nie da bo faktycznie filtrowany zbior nadal pracuje na typie numerycznym. musisz wyciagajac dane wygiagnac je jako text.

Re: ADOQuery błąd przy próbie filtrowania

Nowy postNapisane: czwartek, 17 września 2009, 12:59
przez Ho88it
TADOQuery ma opcję ustawiania parametrów. Pierwszy raz bym czegoś takiego używał i nie wiem czy dobrze kombinuje. W załączniku na zrzucie ekranu zaznaczyłem kolorem ciekawe opcje.
Parametry kierunku przepływu danych Direction:
Kod: Zaznacz cały
pdInput
pdInputOutput
pdOutput
pdReturnValue
pdUnknown


Nie wiem jak tego użyć a w helpie spławiają do MSDN :). Pogrzebię..