Strona 2 z 2

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

Nowy postNapisane: wtorek, 13 października 2009, 12:50
przez Ho88it
Kicha.. nie mam weny do tego..
Poniższy kod się kompiluje ale wywala błąd "Access violation error [...]"
Kod: Zaznacz cały
void __fastcall TForm1::Kontrahenta1Click(TObject *Sender)
{
try
{
QRaport->Filtered=false;
QRaport->Filter= "nzf_IdAdresu LIKE '*" + dynamic_cast<TDBGrid*>(Sender)->Fields[10]->Value + "*'";//dynamicznie
QRaport->Filtered=true;

RDluznik->PRaport->Preview();
}
catch(EDatabaseError& E)
{
// cos sie nie udalo wiec sprawdzamy co jest grane
ShowMessage(E.Message);
}
}


Zaplątałem się w tym wszystkim.. może ktoś patrząc z boku zobaczy to czego ja sam po sobie nie poprawię..
A co do rzutowania danych na poziomie wyciągania danych z bazy, to w ogóle nie wiem czy używając jednocześnie programu księgowego i mojego programu nie wystąpią jakieś dziwne kolizje w bazie. Ktoś jakieś sugestie ma?

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

Nowy postNapisane: wtorek, 13 października 2009, 15:25
przez Witold
Ho88it napisał(a):Ktoś jakieś sugestie ma?


Kontrahenta1Click(TObject *Sender) to zdarzenie z PopUpMenu ?
Gdzie jako Sender dostaniesz wskaźnik na kliknięte TMenuItem, który spróbujesz rzutować na TDBGrid* ?
Gdyby tak było rzutowanie się nie uda (dynamic_cast zwróci 0), masz Access violation error... .

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

Nowy postNapisane: wtorek, 13 października 2009, 18:49
przez Cyfrowy Baron
Kod: Zaznacz cały
QRaport->Filter= "nzf_IdAdresu LIKE '*" + dynamic_cast<TDBGrid*>(Sender)->Fields[10]->Value + "*'";//dynamicznie


Witold ma rację! Co to wogóle znaczy, dlaczego rzutujesz obiekt typu TMenuItem lub TButton (nie wiem dla jakiego obiektu utworzono zdarzenie OnCLick), na obiekt typu TDBGrid. Miało by to może jakiś sens gdyby obiekt TMenuItem lub TButton, posiadał funkcję Fields[X]->Value

Kolejna sprawa, jeżeli rzutujesz obiekty tego samego typu to możesz użyć dynamic_cast, ale jeżeli są to różne typy to należy użyć reinterpret_cast.

Co rozumiesz przez ten komentarz (patrz kod) // dynamicznie

O rzutowaniu i przypisaniu polimorficznym możesz poczytać: ► patrz serwis: Cyfrowy Baron dział: teoria -> rzutowanie typów, przypisanie polimorficzne.

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

Nowy postNapisane: środa, 14 października 2009, 09:32
przez Ho88it
Ja was przepraszam.. tak durnowate błędy robię, że chyba odłożę to na jakiś długi weekend. Ręce mi po prostu opadają z tym projektem. Robię go w tzw. międzyczasie i gubię wątek podczas programowania jak tylko szef mi wyskoczy z robotą.

Chodzi w każdym bądź razie, że TADOQuery za cholerę nie chce się poddać filtrowaniu tak jak pisałem o tym wyżej. Koncepcja jest taka aby po wybraniu opcji z PopUpMenu pojawiła się zaprojektowana forma z przefiltrowanymi rekordami w DBGrid. Jednak, że filtrowanie nie działa tak dobrze jak przy użyciu BDE mimo semantycznie poprawnego kodu. Muszę użyć TADOQuery bo wyniki do filtrowania pochodzą z kilku tabel złożonych na zasadzie Master Detail.

rzutowanie musi się odbyć na poziomie wyciągania danych z bazy.

Zastanawiam się czy faktycznie musi skoro wcześniej działało bez tego, ale tylko (tylko i wyłącznie!) przez dynamiczne rzutowanie w zdarzeniu OnChange w TEdit.

A teraz prosta sprawa kliknij odfiltruj i wyświetl, rozkłada mnie na łopatki bo nie wiem co jest nie tak. W helpie nawet nie zasugerowali, że filtracja może się nie odbyć przez zwykłe wyłączenie filtra, ustawienie filtra i włączenie filtra. Wszystko opisałem wyżej. W akcie desperacji mogę przesłać kod, ale baza danych jakiej używam jest firmy zewnętrznej i nie mogę jej udostępnić (nawet diagramu bazy).

To co pisałem post wcześniej możecie uznać za niebyłe.. sam się z siebie śmieję teraz, bo takiej brzytwy to się dawno nie chwyciłem. :D

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

Nowy postNapisane: środa, 14 października 2009, 11:23
przez Witold
Banita napisał:
...dodam tez ze filtorwac mozesz tylko pola tekstowe.
przykladowo pole jest numeryczne, ty zrzutujesz je na text w programie...

To nie pomogło ?

Podałeś:
Kod: Zaznacz cały
int Id=GridKontrahenci->Fields[10]->Value;


czyli Fileds[10] jest numeryczne ?

jesteś pewien że możesz pole numeryczne filtrować przez LIKE ? nie prez '<' '>' '=' itd.
W SQL chyba tak nie można, a przez Filter można ?

I o co chodzi z gwiazdkami '*' + ID + '*' np. dla id = 1 chcesz dostać wszystkich kontrahentów
którzy mają 1 w ID nawet w środku, czy na końcu np. 91, 293122 , 99999999199999 ?

Może coś z tej strony jakimś cudem zadziała:
http://stackoverflow.com/questions/1108 ... eric-field

O bazach wiem b. niewiele , ale co mi tam …

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

Nowy postNapisane: środa, 14 października 2009, 11:52
przez Ho88it
:oops: ale porażka.... filtrowałem numery NIP i założyłem, że są przechowywane jako liczby (w bazie są wpisywane bez myślników jednym ciągiem). Faktycznie muszę zmienić składnię filtra bo numery ID są typu Integer a NIP był jako String. Masakra .. tyle czasu straciłem... ale co kilka głów to nie jedna.. Dziękuję wszystkim.