ADOQuery błąd przy próbie filtrowania

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.

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

Nowy postprzez Ho88it » wtorek, 13 października 2009, 12:50

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?
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: ADOQuery błąd przy próbie filtrowania

Nowy postprzez Witold » wtorek, 13 października 2009, 15:25

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... .
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
Podziękował : 1
Otrzymał podziękowań: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

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

Nowy postprzez Cyfrowy Baron » wtorek, 13 października 2009, 18:49

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.
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
    NieznanyNieznana

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

Nowy postprzez Ho88it » środa, 14 października 2009, 09:32

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
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: ADOQuery błąd przy próbie filtrowania

Nowy postprzez Witold » środa, 14 października 2009, 11:23

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 …

Za ten post autor Witold otrzymał podziękowanie od:
Ho88it
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
Podziękował : 1
Otrzymał podziękowań: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

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

Nowy postprzez Ho88it » środa, 14 października 2009, 11:52

: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.
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

Poprzednia strona

  • 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 0 gości

cron