C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как изменить запрос через AdoQuery не обновляя тек
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

Вернуться в Работа с базами данных в C++Builder