На этом шаге мы рассмотрим реализацию команды Upload Data.
Сейчас мы напишем код команды Upload меню Data приложения STUpload. А также создадиv функцию-обработчик обновления пользовательского интерфейса, чтобы меню и команда панели инструментов становились доступными, только когда в приложение загружен документ.
Рис.1. Создание функций
void CSTUploadDoc::OnUpdateDataUpload(CCmdUI* pCmdUI) { // Делаем доступной команду UploadData, только если в файле // содержатся данные и для просмотра выбрана какая-то // ценная бумага BOOL bEnable = GetCurrentFund().IsEmpty() ? FALSE : TRUE; pCmdUI->Enable(bEnable); }
#include <comdef.h>// Для поддержки СОМ в компиляторе #include <lmcons.h>// Для получения доступа к константе UNLEN #include ".\STLoadData\STLoadData.h" #include ".\STLoadData\STLoadData_i.c"
void CSTUploadDoc::OnDataUpload() { if( AfxMessageBox( "Upload current file to database?", MB_OKCANCEL ) == IDCANCEL ) return; ::CoInitialize( NULL ); _COM_SMARTPTR_TYPEDEF(IUploadStockData, __uuidof(IUploadStockData)); IUploadStockDataPtr pServer; HRESULT hr = pServer.CreateInstance( CLSID_UploadStockData ); if( SUCCEEDED( hr ) ) hr = pServer->ConnectToDatabase(); if( SUCCEEDED( hr ) ) { try { POSITION pos = m_DocList.GetHeadPosition(); while( pos ) { CStockData sd = m_DocList.GetNext( pos ); BSTR fund = sd.GetFund().AllocSysString(); DATE date = sd.GetDate().m_dt; double price = sd.GetPrice(); DWORD dwLen = UNLEN + 1; TCHAR cUser[ UNLEN + 1 ]; ::GetUserName( cUser, &dwLen ); CString strUser( cUser ); BSTR uplBy = (strUser.Left( 10 )).AllocSysString(); COleDateTime dtToday = COleDateTime::GetCurrentTime(); DATE uplDate = dtToday.m_dt; HRESULT hr = pServer->UploadRecord(fund, date, price, uplBy, uplDate); ::SysFreeString( fund ); ::SysFreeString( uplBy ); if( FAILED( hr )) { CString strPrompt = "Upload of:\n"; strPrompt += sd.GetAsString(); strPrompt += "\nfailed"; if( AfxMessageBox( strPrompt, MB_OKCANCEL ) == IDCANCEL ) break; } } if( !pos ) // Мы добрались до конца цикла AfxMessageBox( "Upload completed successfully" ); } catch( _com_error e ) { ::MessageBox( NULL, e.ErrorMessage(), NULL, MB_OK ); } pServer->Disconnect(); } ::CoUninitialize(); }
Разберитесь, как компонент UploadStockData создается и используется для загрузки в базу данных записей, содержащихся в переменной-члене m_DocList объекта документа. Обратите внимание, что Windows API-функция GetUserName() применяется для получения имени текущего зарегистрированного пользователя. Первые 10 символов этого имени размещаются в поле ph_uploadedby таблицы pricehistory базы данных Stocks. Теперь Вы можете приступить к сборке приложения STUpload.
select * from pricehistory
Рис.2. Результаты выполнения запроса
Со следующего шага мы начнем рассматривать создание элементов ActiveX.