Шаг 43 - Улучшаем CDaoDialog или как изменяются записи

Во первых мы подправим имя функции void SetRecorset(CDaoRecordset* m_pSet); просто ошибка вышла на SetRecordset. Проблем здесь нет просто в двух местах.

Есть более значительная поправка. По первых давайте разберемся как редактируются записи. Вот схема.

43_1.gif (1723 b)

Набор записей может быть открыт только для чтения, а мы будем с Вами пытаться писать и как результат ошибки. Вот мы и изменим нашу функцию SaveData предусматривая данную ситуацию.

void CDaoDialog::SaveData()
{
	if (!(m_pRecordset->IsEOF()))
	{ 
		if (m_pRecordset->CanUpdate()) 	// если разрешено обновление
		{ 
			m_pRecordset->Edit();		
			UpdateData(TRUE);		
			m_pRecordset->Update();		
		}
	}
}

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

class CDaoDialog : public CDialog
{
// Construction
public:
	virtual void OnSave();
	void Last();
	......
}

void CDaoDialog::OnSave()
{

}

И будет вызывать эту функцию при вызове Save после DDX.

void CDaoDialog::SaveData()
{
	if (!(m_pRecordset->IsEOF()))
	{ 
		if (m_pRecordset->CanUpdate()) 	 // если разрешено обновление
		{ 
			m_pRecordset->Edit();		
			UpdateData(TRUE);	
			OnSave();			// для будущих классов
			m_pRecordset->Update();		
		}
	}
}

В проекте находится класс CDaoDialog упакованный для использования в Component Gallery как ogx файл.


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 15.08.2001