Tal |
Отправлено: 25.06.2003, 17:11 |
|
Не зарегистрирован
|
Поможите люди добрые.
Вопрос такой
Через ADOQuery формируется запрос. Скажем мне нужно по нажатию кнопок упорядочивать этот набор данных по разным столбцам или наложить какой-нибудь фильтр поверх возвращенных данных. Как это реализовать чтобы не переоткрывать запрос, а работать с текущим набором?
t_m_l@mail.ru |
|
Admin |
Отправлено: 26.06.2003, 00:13 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
Фактически тут 2 вопроса.
1 Фильтрация данных
2 Сортировка по полям (столбцам)
----
Начну со 1-го, насчет фильтра:
И у компонента ADOQuery и у ADOTable есть свойства Filter и Filtered.
воспользовавшись которыми можно накладывать фильтр
на отобранные данные (локальная фильтрация):
CODE |
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ADOQuery1->Open();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
ADOQuery1->Filtered = false;
ADOQuery1->Filter = Edit1->Text;
ADOQuery1->Filtered = true;
}
//--------------------------------------------------------
|
или можно это сделать через событие onFilterRecord:
CODE |
void __fastcall TForm1::ADOQuery1FilterRecord(TDataSet *DataSet,
bool &Accept)
{
Accept = (Edit1->Text == ADOQuery1DSDesigner->Value);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
ADOQuery1->Filtered = false;
ADOQuery1->Filtered = true;
}
//--------------------------------------------------------
|
----
Теперь что касается локальной сортировки.
CODE |
//---------------------------------------------------------------------------
void __fastcall TForm1::DBGrid1TitleClick(TColumn *Column)
{
Label1->Caption = "Сортировка по полю " + Column->FieldName;
ADOQuery1->Sort = WideString ( Column->FieldName );
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ADOQuery1->Open();
}
//---------------------------------------------------------------------------
|
Но Вы должны реально понимать следующее:
QUOTE |
не переоткрывать запрос, а работать с текущим набором
|
Хотя эта сортировка и называется локальной, тем не менее
представьте ситуацию — у Вас есть таблица ~ на 200 — 300 Мб,
и вы хотите сделать локальную сортировку
При Вашем запросе на выборку (Select) реально считывается
и возвращается Вам не сразу все запрошенные записи, то есть
не эти 200-300 Мб данных,
а определенная порция данных (кэш), далее, по мере
обращения идет обращение к таблице и извлекается
следующая и т.д.
То есть, если Вам понадобиться сделать локальную сортировку
очень большой таблицы, чтобы это сделать и определить
как данные должны быть отсортированы, будут получены
все данные из таблицы и упорядочены(отсортированы) по
указанным полям, а для этого все равно запрос будет
переоткрыт (хотя может и прозрачно для вас), что может
занять времени примерно столько-же, сколько и просто прямой
запрос, только будет затрата времени на переоткрытие
базы.
CODE |
//---------------------------------------------------------------------------
void __fastcall TForm1::DBGrid1TitleClick(TColumn *Column)
{
AnsiString sSQL = "Select * from myTbl order by " + Column->FieldName;
Label1->Caption = "Сортировка по полю " + Column->FieldName;
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add(sSQL);
ADOQuery1->Open();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ADOQuery1->Open();
}
//-------------------------------------------------------------
|
Отредактировано Admin — 26 Jun 2003, 00:18
|
|
|