Шаг 9 - Фильтры, сортировка CRecordset

Для испытаний данного шага Вам лучше создать записи, как показанно ниже. Это будет проще и результат понятно как получается.

9_1.gif (2338 b)

Если тщательно разобраться с SQL оператором SELECT, то с помощью него можно получить практически любые виды от исходной таблицы. Но этот способ не единственный. Даже если с помощью данного оператора Вы отсортировали записи, всегда возникает необходимость допустим их отсортировать по полю или наложить фильтр. Это можно сделать и на основе доступных переменных класса CRecordset.

Для накладывания фильтра в классе CRecordset есть переменная m_strFilter. В эту переменную можно поместить фильтр и вызвать функцию обновления источника строк.

void CDatebaseDlg::OnOpen() 
{ 
	CRecordset cr(NULL);
	try
	{
		cr.Open(CRecordset::dynaset, "SELECT *  FROM TABLE1"); 
		cr.m_strFilter ="Count<100";
		cr.Requery();
		CDBVariant var;	
		short index=1;	 
		cr.Move(0);	 
		cr.GetFieldValue(index,var);	
		AfxMessageBox(*var.m_pstring);
		cr.Close(); 
	}
	catch(CDBException cdb)
	{
		AfxMessageBox(cdb.m_strStateNativeOrigin);
	}
}

Обратите внимание, что я обьявил таблицу как dynaset, что позволяет проводить подобные операции, в будущем эта опция разрешит добавлять, редактировать и удалять записи.

В фильтр я поместил строку, которая указывает, что поле должно быть меньше 100. Если вы запустите, то увидите фамилию Vasilev, так как он единственный, который имеет это поле меньше 100. После задания фильтра я вызвал функцию Requery, которая обновила источник строк на основе фильтра. Не забывайте её использовать.

Для сортировки тоже есть переменная и она носит имя m_strSort, в ней молжно указать поле ,по которому будет произведена сортировка.

void CDatebaseDlg::OnOpen() 
{ 
	CRecordset cr(NULL);
	try
	{
		cr.Open(CRecordset::dynaset, "SELECT *  FROM TABLE1"); 
		cr.m_strSort="Family";
		cr.Requery();
		CDBVariant var;	
		short index=1;	 
		cr.Move(0);	 
		cr.GetFieldValue(index,var);	
		AfxMessageBox(*var.m_pstring);
		cr.Close(); 
	}
	catch(CDBException cdb)
	{
		AfxMessageBox(cdb.m_strStateNativeOrigin);
	}
}

При работе этого кода первым будет Artem, хотя в исходной таблице он последний :-(. Логика точно такая же, как и выше в примере. Установка поля сортировки и обновление.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 21.10.99