ExportDest.cpp
上传用户:zhanglf88
上传日期:2013-11-19
资源大小:6036k
文件大小:27k
源码类别:

金融证券系统

开发平台:

Visual C++

  1. // ExportDest.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "ExportDest.h"
  5. #include "SelectStk.h"
  6. #include "ExportOption.h"
  7. #include <io.h>
  8. #include "..Dialogs.h"
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14. /////////////////////////////////////////////////////////////////////////////
  15. // CExportDest property page
  16. void CExportDest::StoreProfile( )
  17. {
  18. AfxGetApp()->WriteProfileInt( "exportdest", "txtcheck", m_bTxtCheck );
  19. AfxGetApp()->WriteProfileInt( "exportdest", "mdbcheck", m_bMdbCheck );
  20. AfxGetApp()->WriteProfileInt( "exportdest", "csvcheck", m_bCsvCheck );
  21. AfxGetApp()->WriteProfileInt( "exportdest", "odbccheck", m_bODBCCheck );
  22. AfxGetApp()->WriteProfileString( "exportdest", "txtdest", m_strTxtDest );
  23. AfxGetApp()->WriteProfileString( "exportdest", "mdbdest", m_strMdbDest );
  24. AfxGetApp()->WriteProfileString( "exportdest", "csvdest", m_strCsvDest );
  25. AfxGetApp()->WriteProfileString( "exportdest", "odbcdest", m_strODBCDest );
  26. AfxGetApp()->WriteProfileInt( "exportdest", "exeonfinish", m_bExeOnFinish );
  27. AfxGetApp()->WriteProfileInt( "exportdest", "overwrite", m_bOverwrite );
  28. }
  29. void CExportDest::LoadProfile( )
  30. {
  31. m_bTxtCheck = TRUE;
  32. m_bOverwrite = TRUE;
  33. m_bExeOnFinish = TRUE;
  34. m_strTxtDest = AfxGetProfile().GetExportPath() + "txt";
  35. m_strMdbDest = AfxGetProfile().GetExportPath() + "KData.mdb";
  36. m_strCsvDest = AfxGetProfile().GetExportPath() + "csv";
  37. m_strODBCDest = "ODBC;DSN=Excel Files;DBQ="
  38. + AfxGetProfile().GetExportPath()
  39. + "KData.xls;DefaultDir="
  40. + AfxGetProfile().GetExportPath()
  41. + ";DriverId=790;MaxBufferSize=2048;PageTimeout=5;";
  42. if( (0 != access( m_strTxtDest, 0 ) || FILE_ATTRIBUTE_DIRECTORY != GetFileAttributes( m_strTxtDest ) )
  43. && !CreateDirectory( m_strTxtDest, NULL ) )
  44. m_strTxtDest = AfxGetProfile().GetExportPath();
  45. if( (0 != access( m_strCsvDest, 0 ) || FILE_ATTRIBUTE_DIRECTORY != GetFileAttributes( m_strCsvDest ) )
  46. && !CreateDirectory( m_strCsvDest, NULL ) )
  47. m_strCsvDest = AfxGetProfile().GetExportPath();
  48. m_bTxtCheck = AfxGetApp()->GetProfileInt( "exportdest", "txtcheck", m_bTxtCheck );
  49. m_bMdbCheck = AfxGetApp()->GetProfileInt( "exportdest", "mdbcheck", m_bMdbCheck );
  50. m_bCsvCheck = AfxGetApp()->GetProfileInt( "exportdest", "csvcheck", m_bCsvCheck );
  51. m_bODBCCheck = AfxGetApp()->GetProfileInt( "exportdest", "odbccheck", m_bODBCCheck );
  52. m_strTxtDest = AfxGetApp()->GetProfileString( "exportdest", "txtdest", m_strTxtDest );
  53. m_strMdbDest = AfxGetApp()->GetProfileString( "exportdest", "mdbdest", m_strMdbDest );
  54. m_strCsvDest = AfxGetApp()->GetProfileString( "exportdest", "csvdest", m_strCsvDest );
  55. m_strODBCDest = AfxGetApp()->GetProfileString( "exportdest", "odbcdest", m_strODBCDest );
  56. m_bExeOnFinish = AfxGetApp()->GetProfileInt( "exportdest", "exeonfinish", m_bExeOnFinish );
  57. m_bOverwrite = AfxGetApp()->GetProfileInt( "exportdest", "overwrite", m_bOverwrite );
  58. }
  59. IMPLEMENT_DYNCREATE(CExportDest, CPropertyPageEx)
  60. CExportDest::CExportDest() : CPropertyPageEx(CExportDest::IDD)
  61. {
  62. //{{AFX_DATA_INIT(CExportDest)
  63. m_strTxtDest = _T("");
  64. m_strMdbDest = _T("");
  65. m_strCsvDest = _T("");
  66. m_bTxtCheck = FALSE;
  67. m_bMdbCheck = FALSE;
  68. m_bCsvCheck = FALSE;
  69. m_bExeOnFinish = FALSE;
  70. m_bODBCCheck = FALSE;
  71. m_strODBCDest = _T("");
  72. //}}AFX_DATA_INIT
  73. m_bExporting = FALSE;
  74. m_bCanceled = FALSE;
  75. m_dwButtonFlags = PSWIZB_BACK | PSWIZB_NEXT;
  76. }
  77. CExportDest::CExportDest(UINT nIDCaption, UINT nIDTitle, UINT nIDSubTitle)
  78.  : CPropertyPageEx(CExportDest::IDD, nIDCaption, nIDTitle, nIDSubTitle)
  79. {
  80. m_strTxtDest = _T("");
  81. m_strMdbDest = _T("");
  82. m_strCsvDest = _T("");
  83. m_bTxtCheck = FALSE;
  84. m_bMdbCheck = FALSE;
  85. m_bCsvCheck = FALSE;
  86. m_bExeOnFinish = FALSE;
  87. m_bODBCCheck = FALSE;
  88. m_strODBCDest = _T("");
  89. m_bExporting = FALSE;
  90. m_bCanceled = FALSE;
  91. m_dwButtonFlags = PSWIZB_BACK | PSWIZB_NEXT;
  92. }
  93. CExportDest::~CExportDest()
  94. {
  95. }
  96. BOOL CExportDest::ExportBegin(CStringArray &astrColumnName, CUIntArray &anWidth,
  97. BOOL bReportError )
  98. {
  99. CString strTxt, strMdb, strCsv, strODBC;
  100. if( m_bTxtCheck ) strTxt = AfxGetFileDirectoryExist( m_strTxtDest, (LPCTSTR)AfxGetProfile().GetExportPath() );
  101. if( m_bMdbCheck ) strMdb = m_strMdbDest;
  102. if( m_bCsvCheck ) strCsv = AfxGetFileDirectoryExist( m_strCsvDest, (LPCTSTR)AfxGetProfile().GetExportPath() );
  103. if( m_bODBCCheck ) strODBC = m_strODBCDest;
  104. if( !m_exportdb.OpenAllDB(strTxt, TRUE, strMdb, strCsv, TRUE, strODBC,
  105. bReportError ) )
  106. return FALSE;
  107. if( ! m_exportdb.SetTableColumn( astrColumnName, anWidth ) )
  108. return FALSE;
  109. return TRUE;
  110. }
  111. BOOL CExportDest::ExportOpenTable( CStock &stock, int ktype, BOOL bReportError )
  112. {
  113. CString strTableName = stock.GetStockCode();
  114. strTableName += AfxGetKTypeString( ktype );
  115. if( !m_exportdb.OpenAllTable( strTableName, m_bOverwrite, bReportError ) )
  116. return FALSE;
  117. return TRUE;
  118. }
  119. BOOL CExportDest::ExportAddItem( CStringArray &astrItemText )
  120. {
  121. // Pump Message
  122. MSG msg;
  123. while (::PeekMessage(&msg, NULL, NULL, NULL, PM_NOREMOVE) )
  124. AfxGetApp()->PumpMessage();
  125. return m_exportdb.AddItem( astrItemText );
  126. }
  127. void CExportDest::ExportCloseTable( )
  128. {
  129. m_exportdb.CloseAllTable( );
  130. }
  131. BOOL CExportDest::ExportFinish( )
  132. {
  133. m_exportdb.CloseAllDB( );
  134. if( m_bExeOnFinish )
  135. {
  136. if( m_bTxtCheck && m_strTxtDest.GetLength() > 0 )
  137. ShellExecute( NULL, "open", m_strTxtDest, NULL, NULL, SW_SHOW );
  138. if( m_bMdbCheck && m_strMdbDest.GetLength() > 0 )
  139. ShellExecute( NULL, "open", m_strMdbDest, NULL, NULL, SW_SHOW );
  140. if( m_bCsvCheck && m_strCsvDest.GetLength() > 0 )
  141. ShellExecute( NULL, "open", m_strCsvDest, NULL, NULL, SW_SHOW );
  142. if( m_bODBCCheck && m_strODBCDest.GetLength() > 0 )
  143. CExportDB::ExecuteODBCFile( m_strODBCDest );
  144. }
  145. // Set Progress
  146. m_ctrlProgress.SetWindowPos( NULL, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE );
  147. m_staticProgress.SetWindowPos( NULL, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE );
  148. int nLower = 0, nUpper = 100;
  149. m_ctrlProgress.GetRange( nLower, nUpper );
  150. if( nUpper > nLower )
  151. {
  152. m_ctrlProgress.SetPos( nUpper );
  153. CString strInfo;
  154. strInfo.LoadString( IDS_EXPORTDB_FINISHED );
  155. m_staticProgress.SetWindowText( strInfo );
  156. }
  157. return TRUE;
  158. }
  159. void CExportDest::DoExport( )
  160. {
  161. // if( !AfxAssertFunclimitProf( ) )
  162. // return;
  163. // EnableWindow FALSE
  164. CPropertySheetEx * pSheet = DYNAMIC_DOWNCAST( CPropertySheetEx, GetParent() );
  165. if( pSheet )
  166. {
  167. CWnd * pWnd = pSheet->GetDlgItem( IDCANCEL );
  168. if( pWnd && ::IsWindow( pWnd->GetSafeHwnd() ) )
  169. pWnd->EnableWindow( FALSE );
  170. pWnd = pSheet->GetDlgItem( ID_WIZBACK );
  171. if( pWnd && ::IsWindow( pWnd->GetSafeHwnd() ) )
  172. pWnd->EnableWindow( FALSE );
  173. pWnd = pSheet->GetDlgItem( ID_WIZNEXT );
  174. if( pWnd && ::IsWindow( pWnd->GetSafeHwnd() ) )
  175. pWnd->EnableWindow( FALSE );
  176. }
  177. // Get Pages
  178. CSelectStk * pStk = (CSelectStk *)pSheet->GetPage(0);
  179. CExportOption * pOption = (CExportOption *)pSheet->GetPage(1);
  180. // Store CExportOption tmEnd
  181. CSPTime timeEnd;
  182. if( !AfxGetDB().GetTimeLocalRange( &timeEnd, NULL, NULL ) )
  183. timeEnd = CSPTime::GetCurrentTime();
  184. if( pOption->m_bTimeDefine && timeEnd.GetTime() > pOption->m_tmEnd.GetTime() )
  185. timeEnd = pOption->m_tmEnd.GetTime();
  186. pOption->m_tmEnd = timeEnd.GetTime();
  187. pOption->StoreProfile( );
  188. // Columns
  189. CStringArray astrColumn;
  190. CUIntArray anWidth;
  191. CString strTemp;
  192. strTemp.LoadString( IDS_EXPORTDEST_DATE ); astrColumn.Add( strTemp ); anWidth.Add( SLH_WIDTH_MIN );
  193. strTemp.LoadString( IDS_EXPORTDEST_OPEN ); astrColumn.Add( strTemp ); anWidth.Add( SLH_WIDTH_MIN );
  194. strTemp.LoadString( IDS_EXPORTDEST_HIGH ); astrColumn.Add( strTemp ); anWidth.Add( SLH_WIDTH_MIN );
  195. strTemp.LoadString( IDS_EXPORTDEST_LOW ); astrColumn.Add( strTemp ); anWidth.Add( SLH_WIDTH_MIN );
  196. strTemp.LoadString( IDS_EXPORTDEST_CLOSE ); astrColumn.Add( strTemp ); anWidth.Add( SLH_WIDTH_MIN );
  197. strTemp.LoadString( IDS_EXPORTDEST_AMOUNT ); astrColumn.Add( strTemp ); anWidth.Add( SLH_WIDTH_MIN );
  198. strTemp.LoadString( IDS_EXPORTDEST_VOLUME ); astrColumn.Add( strTemp ); anWidth.Add( SLH_WIDTH_MIN );
  199. m_bExporting = TRUE;
  200. m_bCanceled = FALSE;
  201. if( ExportBegin( astrColumn, anWidth, TRUE ) )
  202. {
  203. CString strText;
  204. int nCount = 0, nTotalCount = pStk->m_domainTemp.GetSize();
  205. SetProgressRange( 0, nTotalCount*10 );
  206. for( int i=0; i<pStk->m_domainTemp.GetSize(); i++ )
  207. {
  208. CStock stock;
  209. stock.SetStockCode( CStock::marketUnknown, pStk->m_domainTemp.ElementAt(i) );
  210. stock.SetDatabase( &AfxGetDB() );
  211. DoExportStock( stock, nCount*10, nCount*10+10, pOption );
  212. nCount ++;
  213. SetProgress( nCount*10 );
  214. // Canceled 
  215. if( m_bCanceled )
  216. break;
  217. }
  218. }
  219. // Finish Export
  220. ExportFinish( );
  221. if( m_bCanceled )
  222. {
  223. ExportFinish( );
  224. CPropertyPageEx::OnCancel( );
  225. return;
  226. }
  227. m_bExporting = FALSE;
  228. m_bCanceled = FALSE;
  229. // EnableWindow TRUE
  230. if( pSheet )
  231. {
  232. CWnd * pWnd = pSheet->GetDlgItem( IDCANCEL );
  233. if( pWnd && ::IsWindow( pWnd->GetSafeHwnd() ) )
  234. pWnd->EnableWindow( TRUE );
  235. pWnd = pSheet->GetDlgItem( ID_WIZBACK );
  236. if( pWnd && ::IsWindow( pWnd->GetSafeHwnd() ) )
  237. pWnd->EnableWindow( TRUE );
  238. pWnd = pSheet->GetDlgItem( ID_WIZNEXT );
  239. if( pWnd && ::IsWindow( pWnd->GetSafeHwnd() ) )
  240. pWnd->EnableWindow( TRUE );
  241. }
  242. }
  243. void CExportDest::DoExportStock( CStock &stock, int nProgressStart, int nProgressEnd, CExportOption * pOption )
  244. {
  245. // Prepare Data
  246. if( pOption->m_bKMin5 )
  247. stock.PrepareData( CStock::dataK, CKData::ktypeMin5 );
  248. if( pOption->m_bKMin15 )
  249. stock.PrepareData( CStock::dataK, CKData::ktypeMin15 );
  250. if( pOption->m_bKMin30 )
  251. stock.PrepareData( CStock::dataK, CKData::ktypeMin30 );
  252. if( pOption->m_bKMin60 )
  253. stock.PrepareData( CStock::dataK, CKData::ktypeMin60 );
  254. if( pOption->m_bNoResumeDR )
  255. {
  256. if( pOption->m_bKDay )
  257. stock.PrepareData( CStock::dataK, CKData::ktypeDay );
  258. if( pOption->m_bKMonth )
  259. stock.PrepareData( CStock::dataK, CKData::ktypeMonth );
  260. if( pOption->m_bKWeek )
  261. stock.PrepareData( CStock::dataK, CKData::ktypeWeek );
  262. }
  263. else
  264. {
  265. // DR Up or down, auto begin
  266. int nFormat = CKData::formatXDRdown;
  267. if( pOption->m_bResumeDRUp )
  268. nFormat = CKData::formatXDRup;
  269. DWORD dateAutoDRBegin = -1;
  270. if( pOption->m_bAutoResumeDR )
  271. {
  272. CSPTime sptime( pOption->m_tmAutoResumeDRBegin.GetTime() );
  273. dateAutoDRBegin = sptime.ToStockTimeDay( );
  274. }
  275. stock.PrepareData( CStock::dataDR );
  276. CDRData & drdata = stock.GetDRData();
  277. if( pOption->m_bKDay || pOption->m_bKMonth || pOption->m_bKWeek )
  278. {
  279. stock.PrepareData( CStock::dataK, CKData::ktypeDay );
  280. stock.GetKDataDay().SetDRData( drdata );
  281. stock.GetKDataDay().ChangeCurFormat( nFormat, dateAutoDRBegin, pOption->m_nAutoResumeDRLimit );
  282. if( pOption->m_bKMonth )
  283. stock.ExtractKData( CKData::ktypeMonth, TRUE );
  284. if( pOption->m_bKWeek )
  285. stock.ExtractKData( CKData::ktypeWeek, TRUE );
  286. }
  287. stock.GetKDataMin5().SetDRData( drdata );
  288. stock.GetKDataMin5().ChangeCurFormat( nFormat, dateAutoDRBegin, pOption->m_nAutoResumeDRLimit );
  289. stock.GetKDataMin15().SetDRData( drdata );
  290. stock.GetKDataMin15().ChangeCurFormat( nFormat, dateAutoDRBegin, pOption->m_nAutoResumeDRLimit );
  291. stock.GetKDataMin30().SetDRData( drdata );
  292. stock.GetKDataMin30().ChangeCurFormat( nFormat, dateAutoDRBegin, pOption->m_nAutoResumeDRLimit );
  293. stock.GetKDataMin60().SetDRData( drdata );
  294. stock.GetKDataMin60().ChangeCurFormat( nFormat, dateAutoDRBegin, pOption->m_nAutoResumeDRLimit );
  295. }
  296. // Calcuate Progress
  297. int nTotal = 0, nCount = 0;
  298. if( pOption->m_bKMonth ) nTotal += stock.GetKDataMonth().GetSize();
  299. if( pOption->m_bKWeek ) nTotal += stock.GetKDataWeek().GetSize();
  300. if( pOption->m_bKDay ) nTotal += stock.GetKDataDay().GetSize();
  301. if( pOption->m_bKMin5 ) nTotal += stock.GetKDataMin5().GetSize();
  302. if( pOption->m_bKMin15 ) nTotal += stock.GetKDataMin15().GetSize();
  303. if( pOption->m_bKMin30 ) nTotal += stock.GetKDataMin30().GetSize();
  304. if( pOption->m_bKMin60 ) nTotal += stock.GetKDataMin60().GetSize();
  305. if( 0 == nTotal )
  306. return;
  307. // time
  308. DWORD dateDayBegin = 0, dateDayEnd = (DWORD(-1));
  309. DWORD dateMinBegin = 0, dateMinEnd = (DWORD(-1));
  310. if( pOption->m_bTimeDefine )
  311. {
  312. dateDayBegin= CSPTime(pOption->m_tmBegin.GetTime()).ToStockTimeDay();
  313. dateDayEnd = CSPTime(pOption->m_tmEnd.GetTime()).ToStockTimeDay();
  314. dateMinBegin= CSPTime(pOption->m_tmBegin.GetTime()).ToStockTimeMin();
  315. dateMinEnd = CSPTime(pOption->m_tmEnd.GetTime()).ToStockTimeMin();
  316. }
  317. // Begin Export Month
  318. if( pOption->m_bKMonth
  319. && ExportOpenTable( stock, CKData::ktypeMonth, TRUE ) )
  320. {
  321. CKData & kdata = stock.GetKDataMonth( );
  322. for( int k=0; k<kdata.GetSize(); k++ )
  323. {
  324. KDATA kd = kdata.ElementAt(k);
  325. CStringArray astrItemText;
  326. if( DoExportKDATAToStringArray( kd, astrItemText, TRUE, dateDayBegin, dateDayEnd, stock.GetStockInfo().DigitBit() ) )
  327. ExportAddItem( astrItemText );
  328. nCount ++;
  329. SetProgress( nProgressStart + (nProgressEnd-nProgressStart)*nCount/nTotal );
  330. if( m_bCanceled ) return;
  331. }
  332. ExportCloseTable( );
  333. }
  334. // Begin Export Week
  335. if( pOption->m_bKWeek
  336. && ExportOpenTable( stock, CKData::ktypeWeek, TRUE ) )
  337. {
  338. CKData & kdata = stock.GetKDataWeek( );
  339. for( int k=0; k<kdata.GetSize(); k++ )
  340. {
  341. KDATA kd = kdata.ElementAt(k);
  342. CStringArray astrItemText;
  343. if( DoExportKDATAToStringArray( kd, astrItemText, TRUE, dateDayBegin, dateDayEnd, stock.GetStockInfo().DigitBit() ) )
  344. ExportAddItem( astrItemText );
  345. nCount ++;
  346. SetProgress( nProgressStart + (nProgressEnd-nProgressStart)*nCount/nTotal );
  347. if( m_bCanceled ) return;
  348. }
  349. ExportCloseTable( );
  350. }
  351. // Begin Export Day
  352. if( pOption->m_bKDay
  353. && ExportOpenTable( stock, CKData::ktypeDay, TRUE ) )
  354. {
  355. CKData & kdata = stock.GetKDataDay( );
  356. for( int k=0; k<kdata.GetSize(); k++ )
  357. {
  358. KDATA kd = kdata.ElementAt(k);
  359. CStringArray astrItemText;
  360. if( DoExportKDATAToStringArray( kd, astrItemText, TRUE, dateDayBegin, dateDayEnd, stock.GetStockInfo().DigitBit() ) )
  361. ExportAddItem( astrItemText );
  362. nCount ++;
  363. SetProgress( nProgressStart + (nProgressEnd-nProgressStart)*nCount/nTotal );
  364. if( m_bCanceled ) return;
  365. }
  366. ExportCloseTable( );
  367. }
  368. // Begin Export Min5
  369. if( pOption->m_bKMin5
  370. && ExportOpenTable( stock, CKData::ktypeMin5, TRUE ) )
  371. {
  372. CKData & kdata = stock.GetKDataMin5( );
  373. for( int k=0; k<kdata.GetSize(); k++ )
  374. {
  375. KDATA kd = kdata.ElementAt(k);
  376. CStringArray astrItemText;
  377. if( DoExportKDATAToStringArray( kd, astrItemText, FALSE, dateMinBegin, dateMinEnd, stock.GetStockInfo().DigitBit() ) )
  378. ExportAddItem( astrItemText );
  379. nCount ++;
  380. SetProgress( nProgressStart + (nProgressEnd-nProgressStart)*nCount/nTotal );
  381. if( m_bCanceled ) return;
  382. }
  383. ExportCloseTable( );
  384. }
  385. // Begin Export Min15
  386. if( pOption->m_bKMin15
  387. && ExportOpenTable( stock, CKData::ktypeMin15, TRUE ) )
  388. {
  389. CKData & kdata = stock.GetKDataMin15( );
  390. for( int k=0; k<kdata.GetSize(); k++ )
  391. {
  392. KDATA kd = kdata.ElementAt(k);
  393. CStringArray astrItemText;
  394. if( DoExportKDATAToStringArray( kd, astrItemText, FALSE, dateMinBegin, dateMinEnd, stock.GetStockInfo().DigitBit() ) )
  395. ExportAddItem( astrItemText );
  396. nCount ++;
  397. SetProgress( nProgressStart + (nProgressEnd-nProgressStart)*nCount/nTotal );
  398. if( m_bCanceled ) return;
  399. }
  400. ExportCloseTable( );
  401. }
  402. // Begin Export Min30
  403. if( pOption->m_bKMin30
  404. && ExportOpenTable( stock, CKData::ktypeMin30, TRUE ) )
  405. {
  406. CKData & kdata = stock.GetKDataMin30( );
  407. for( int k=0; k<kdata.GetSize(); k++ )
  408. {
  409. KDATA kd = kdata.ElementAt(k);
  410. CStringArray astrItemText;
  411. if( DoExportKDATAToStringArray( kd, astrItemText, FALSE, dateMinBegin, dateMinEnd, stock.GetStockInfo().DigitBit() ) )
  412. ExportAddItem( astrItemText );
  413. nCount ++;
  414. SetProgress( nProgressStart + (nProgressEnd-nProgressStart)*nCount/nTotal );
  415. if( m_bCanceled ) return;
  416. }
  417. ExportCloseTable( );
  418. }
  419. // Begin Export Min60
  420. if( pOption->m_bKMin60
  421. && ExportOpenTable( stock, CKData::ktypeMin60, TRUE ) )
  422. {
  423. CKData & kdata = stock.GetKDataMin60( );
  424. for( int k=0; k<kdata.GetSize(); k++ )
  425. {
  426. KDATA kd = kdata.ElementAt(k);
  427. CStringArray astrItemText;
  428. if( DoExportKDATAToStringArray( kd, astrItemText, FALSE, dateMinBegin, dateMinEnd, stock.GetStockInfo().DigitBit() ) )
  429. ExportAddItem( astrItemText );
  430. nCount ++;
  431. SetProgress( nProgressStart + (nProgressEnd-nProgressStart)*nCount/nTotal );
  432. if( m_bCanceled ) return;
  433. }
  434. ExportCloseTable( );
  435. }
  436. }
  437. BOOL CExportDest::DoExportKDATAToStringArray( KDATA & kd, CStringArray & astrItemText,
  438. BOOL bDayOrMin, DWORD dateBegin, DWORD dateEnd, int nDigitBits )
  439. {
  440. if( bDayOrMin )
  441. {
  442. if( kd.m_date < dateBegin || kd.m_date > dateEnd )
  443. return FALSE;
  444. }
  445. else
  446. {
  447. if( kd.m_date % 100000000 < dateBegin % 100000000
  448. || kd.m_date % 100000000 > dateEnd % 100000000 )
  449. return FALSE;
  450. }
  451. CString strTemp;
  452. // Date
  453. CSPTime sptime;
  454. sptime.FromStockTime( kd.m_date, bDayOrMin );
  455. strTemp = sptime.Format( "%Y-%m-%d" );
  456. astrItemText.Add( strTemp );
  457. CString strPriceFmt;
  458. strPriceFmt.Format( "%%.%df", nDigitBits );
  459. // Open
  460. strTemp.Format( strPriceFmt, kd.m_fOpen );
  461. astrItemText.Add( strTemp );
  462. // High
  463. strTemp.Format( strPriceFmt, kd.m_fHigh );
  464. astrItemText.Add( strTemp );
  465. // Low
  466. strTemp.Format( strPriceFmt, kd.m_fLow );
  467. astrItemText.Add( strTemp );
  468. // Close
  469. strTemp.Format( strPriceFmt, kd.m_fClose );
  470. astrItemText.Add( strTemp );
  471. // Amount
  472. strTemp.Format( "%u", DWORD(kd.m_fAmount/1000) );
  473. astrItemText.Add( strTemp );
  474. // Volume
  475. strTemp.Format( "%u", DWORD(kd.m_fVolume/100) );
  476. astrItemText.Add( strTemp );
  477. return TRUE;
  478. }
  479. void CExportDest::SetProgressRange( int nLower, int nUpper )
  480. {
  481. if( nUpper > nLower )
  482. {
  483. m_ctrlProgress.SetWindowPos( NULL, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE );
  484. m_staticProgress.SetWindowPos( NULL, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE );
  485. m_ctrlProgress.SetRange32( nLower, nUpper );
  486. }
  487. }
  488. void CExportDest::SetProgress( int nPos )
  489. {
  490. int nLower = 0, nUpper = 100;
  491. m_ctrlProgress.GetRange( nLower, nUpper );
  492. if( nUpper > nLower )
  493. {
  494. m_ctrlProgress.SetPos( nPos );
  495. CString strProgressNew;
  496. strProgressNew.Format( "%d%%", 100*nPos/(nUpper-nLower) );
  497. CString strProgressOld;
  498. m_staticProgress.GetWindowText( strProgressOld );
  499. if( 0 != strProgressNew.Compare( strProgressOld ) )
  500. m_staticProgress.SetWindowText( strProgressNew );
  501. }
  502. }
  503. void CExportDest::DoDataExchange(CDataExchange* pDX)
  504. {
  505. CPropertyPageEx::DoDataExchange(pDX);
  506. //{{AFX_DATA_MAP(CExportDest)
  507. DDX_Control(pDX, IDC_ODBC_SOURCE, m_btnODBCSource);
  508. DDX_Control(pDX, IDC_ODBC_DEST, m_editODBCDest);
  509. DDX_Control(pDX, IDC_ODBC_CHECK, m_btnODBCCheck);
  510. DDX_Control(pDX, IDC_STATIC_PROGRESS, m_staticProgress);
  511. DDX_Control(pDX, IDC_PROGRESS, m_ctrlProgress);
  512. DDX_Control(pDX, IDC_CSV_EXPLORER, m_btnCsvExplorer);
  513. DDX_Control(pDX, IDC_CSV_DEST, m_editCsvDest);
  514. DDX_Control(pDX, IDC_CSV_CHECK, m_btnCsvCheck);
  515. DDX_Control(pDX, IDC_MDB_EXPLORER, m_btnMdbExplorer);
  516. DDX_Control(pDX, IDC_MDB_DEST, m_editMdbDest);
  517. DDX_Control(pDX, IDC_MDB_CHECK, m_btnMdbCheck);
  518. DDX_Control(pDX, IDC_TXT_EXPLORER, m_btnTxtExplorer);
  519. DDX_Control(pDX, IDC_TXT_DEST, m_editTxtDest);
  520. DDX_Control(pDX, IDC_TXT_CHECK, m_btnTxtCheck);
  521. DDX_Text(pDX, IDC_TXT_DEST, m_strTxtDest);
  522. DDX_Text(pDX, IDC_MDB_DEST, m_strMdbDest);
  523. DDX_Text(pDX, IDC_CSV_DEST, m_strCsvDest);
  524. DDX_Check(pDX, IDC_TXT_CHECK, m_bTxtCheck);
  525. DDX_Check(pDX, IDC_MDB_CHECK, m_bMdbCheck);
  526. DDX_Check(pDX, IDC_CSV_CHECK, m_bCsvCheck);
  527. DDX_Check(pDX, IDC_EXEONFINISH, m_bExeOnFinish);
  528. DDX_Check(pDX, IDC_ODBC_CHECK, m_bODBCCheck);
  529. DDX_Text(pDX, IDC_ODBC_DEST, m_strODBCDest);
  530. //}}AFX_DATA_MAP
  531. }
  532. BEGIN_MESSAGE_MAP(CExportDest, CPropertyPageEx)
  533. //{{AFX_MSG_MAP(CExportDest)
  534. ON_BN_CLICKED(IDC_TXT_CHECK, OnTxtCheck)
  535. ON_BN_CLICKED(IDC_TXT_EXPLORER, OnTxtExplorer)
  536. ON_BN_CLICKED(IDC_MDB_CHECK, OnMdbCheck)
  537. ON_BN_CLICKED(IDC_MDB_EXPLORER, OnMdbExplorer)
  538. ON_BN_CLICKED(IDC_CSV_CHECK, OnCsvCheck)
  539. ON_BN_CLICKED(IDC_CSV_EXPLORER, OnCsvExplorer)
  540. ON_BN_CLICKED(IDC_ODBC_CHECK, OnODBCCheck)
  541. ON_BN_CLICKED(IDC_ODBC_SOURCE, OnOdbcSource)
  542. //}}AFX_MSG_MAP
  543. END_MESSAGE_MAP()
  544. /////////////////////////////////////////////////////////////////////////////
  545. // CExportDest message handlers
  546. BOOL CExportDest::OnInitDialog() 
  547. {
  548. CPropertyPageEx::OnInitDialog();
  549. // TODO: Add extra initialization here
  550. LoadProfile( );
  551. UpdateData( FALSE );
  552. // txt 
  553. m_btnTxtCheck.SetCheck( m_bTxtCheck );
  554. m_editTxtDest.EnableWindow( m_bTxtCheck );
  555. m_btnTxtExplorer.EnableWindow( m_bTxtCheck );
  556. int nCheckID = IDC_EXPORT_OVERWRITE;
  557. if( !m_bOverwrite )
  558. nCheckID = IDC_EXPORT_APPEND;
  559. CheckRadioButton( IDC_EXPORT_OVERWRITE, IDC_EXPORT_APPEND, nCheckID );
  560. // mdb
  561. m_btnMdbCheck.SetCheck( m_bMdbCheck );
  562. m_editMdbDest.EnableWindow( m_bMdbCheck );
  563. m_btnMdbExplorer.EnableWindow( m_bMdbCheck );
  564. // Csv
  565. m_btnCsvCheck.SetCheck( m_bCsvCheck );
  566. m_editCsvDest.EnableWindow( m_bCsvCheck );
  567. m_btnCsvExplorer.EnableWindow( m_bCsvCheck );
  568. // ODBC
  569. m_btnODBCCheck.SetCheck( m_bODBCCheck );
  570. m_editODBCDest.EnableWindow( m_bODBCCheck );
  571. m_btnODBCSource.EnableWindow( m_bODBCCheck );
  572. // progress ctrl
  573. m_ctrlProgress.SetWindowPos( NULL, 0, 0, 0, 0, SWP_HIDEWINDOW | SWP_NOSIZE | SWP_NOMOVE );
  574. m_staticProgress.SetWindowPos( NULL, 0, 0, 0, 0, SWP_HIDEWINDOW | SWP_NOSIZE | SWP_NOMOVE );
  575. return TRUE;  // return TRUE unless you set the focus to a control
  576.               // EXCEPTION: OCX Property Pages should return FALSE
  577. }
  578. void CExportDest::OnTxtCheck() 
  579. {
  580. // TODO: Add your control notification handler code here
  581. int nCheck = m_btnTxtCheck.GetCheck();
  582. m_editTxtDest.EnableWindow( nCheck );
  583. m_btnTxtExplorer.EnableWindow( nCheck );
  584. }
  585. void CExportDest::OnTxtExplorer() 
  586. {
  587. // TODO: Add your control notification handler code here
  588. UpdateData( );
  589. CString strTemp = AfxGetFileDirectoryExist( m_strTxtDest, (LPCTSTR)AfxGetProfile().GetExportPath() );
  590. if( AfxDoSelectDirectory( strTemp ) )
  591. {
  592. m_strTxtDest = strTemp;
  593. UpdateData( FALSE );
  594. }
  595. }
  596. void CExportDest::OnMdbCheck() 
  597. {
  598. // TODO: Add your control notification handler code here
  599. int nCheck = m_btnMdbCheck.GetCheck();
  600. m_editMdbDest.EnableWindow( nCheck );
  601. m_btnMdbExplorer.EnableWindow( nCheck );
  602. }
  603. void CExportDest::OnMdbExplorer() 
  604. {
  605. // TODO: Add your control notification handler code here
  606. UpdateData( );
  607. CFileDialog dlg (FALSE, NULL, NULL, OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_ENABLESIZING,
  608. "Microsoft Access Database files (*.mdb)|*.mdb|All files (*.*)|*.*||", NULL);
  609. if( IDOK == dlg.DoModal() )
  610. {
  611. m_strMdbDest = dlg.GetPathName();
  612. UpdateData( FALSE );
  613. }
  614. }
  615. void CExportDest::OnCsvCheck() 
  616. {
  617. // TODO: Add your control notification handler code here
  618. int nCheck = m_btnCsvCheck.GetCheck();
  619. m_editCsvDest.EnableWindow( nCheck );
  620. m_btnCsvExplorer.EnableWindow( nCheck );
  621. }
  622. void CExportDest::OnODBCCheck() 
  623. {
  624. // TODO: Add your control notification handler code here
  625. int nCheck = m_btnODBCCheck.GetCheck();
  626. m_editODBCDest.EnableWindow( nCheck );
  627. m_btnODBCSource.EnableWindow( nCheck );
  628. }
  629. void CExportDest::OnCsvExplorer() 
  630. {
  631. // TODO: Add your control notification handler code here
  632. UpdateData( );
  633. CString strTemp = AfxGetFileDirectoryExist( m_strCsvDest, (LPCTSTR)AfxGetProfile().GetExportPath() );
  634. if( AfxDoSelectDirectory( strTemp ) )
  635. {
  636. m_strCsvDest = strTemp;
  637. UpdateData( FALSE );
  638. }
  639. }
  640. void CExportDest::OnOdbcSource() 
  641. {
  642. // TODO: Add your control notification handler code here
  643. UpdateData( TRUE );
  644. if( m_exportdb.OpenODBCDB( NULL ) )
  645. {
  646. m_strODBCDest = m_exportdb.GetODBCConnect();
  647. UpdateData( FALSE );
  648. }
  649. }
  650. BOOL CExportDest::OnSetActive() 
  651. {
  652. // TODO: Add your specialized code here and/or call the base class
  653. m_bExporting = FALSE;
  654. m_bCanceled = FALSE;
  655. CPropertySheetEx * pSheet = DYNAMIC_DOWNCAST( CPropertySheetEx, GetParent() );
  656. if( pSheet )
  657. {
  658. pSheet->SetWizardButtons( m_dwButtonFlags );
  659. CWnd * pWnd = pSheet->GetDlgItem( ID_WIZNEXT );
  660. if( pWnd && ::IsWindow( pWnd->GetSafeHwnd() ) )
  661. {
  662. CString strTemp;
  663. strTemp.LoadString( IDS_EXPORT_START );
  664. pWnd->SetWindowText( strTemp );
  665. }
  666. }
  667. // progress ctrl
  668. m_ctrlProgress.SetWindowPos( NULL, 0, 0, 0, 0, SWP_HIDEWINDOW | SWP_NOSIZE | SWP_NOMOVE );
  669. m_staticProgress.SetWindowPos( NULL, 0, 0, 0, 0, SWP_HIDEWINDOW | SWP_NOSIZE | SWP_NOMOVE );
  670. return CPropertyPageEx::OnSetActive();
  671. }
  672. LRESULT CExportDest::OnWizardBack() 
  673. {
  674. // TODO: Add your specialized code here and/or call the base class
  675. return CPropertyPageEx::OnWizardBack();
  676. }
  677. LRESULT CExportDest::OnWizardNext() 
  678. {
  679. // TODO: Add your specialized code here and/or call the base class
  680. UpdateData( );
  681. CButton * pbtn = (CButton *)GetDlgItem( IDC_EXPORT_OVERWRITE );
  682. if( pbtn ) m_bOverwrite = pbtn->GetCheck();
  683. if( !m_bTxtCheck && !m_bMdbCheck && !m_bCsvCheck && !m_bODBCCheck )
  684. {
  685. AfxMessageBox( IDS_EXPORTDB_NODEST, MB_OK | MB_ICONINFORMATION );
  686. return -1;
  687. }
  688. if( m_bTxtCheck && m_strTxtDest.GetLength() == 0 )
  689. {
  690. AfxMessageBox( IDS_EXPORTDB_NOTXTDEST, MB_OK | MB_ICONINFORMATION );
  691. return -1;
  692. }
  693. if( m_bMdbCheck && m_strMdbDest.GetLength() == 0 )
  694. {
  695. AfxMessageBox( IDS_EXPORTDB_NOMDBDEST, MB_OK | MB_ICONINFORMATION );
  696. return -1;
  697. }
  698. if( m_bCsvCheck && m_strCsvDest.GetLength() == 0 )
  699. {
  700. AfxMessageBox( IDS_EXPORTDB_NOCSVDEST, MB_OK | MB_ICONINFORMATION );
  701. return -1;
  702. }
  703. if( m_bODBCCheck && m_strODBCDest.GetLength() == 0 )
  704. {
  705. AfxMessageBox( IDS_EXPORTDB_NOODBCDEST, MB_OK | MB_ICONINFORMATION );
  706. return -1;
  707. }
  708. if( m_bTxtCheck )
  709. {
  710. CPathDialog::MakeSurePathExists( m_strTxtDest );
  711. m_strTxtDest = AfxGetFileDirectoryExist( m_strTxtDest, (LPCTSTR)AfxGetProfile().GetExportPath() );
  712. }
  713. if( m_bMdbCheck )
  714. {
  715. int nIndex = m_strMdbDest.Find( "." );
  716. if( -1 == nIndex )
  717. m_strMdbDest += ".mdb";
  718. else if( m_strMdbDest.GetLength()-1 == nIndex )
  719. m_strMdbDest += "mdb";
  720. }
  721. if( m_bCsvCheck )
  722. {
  723. CPathDialog::MakeSurePathExists( m_strCsvDest );
  724. m_strCsvDest = AfxGetFileDirectoryExist( m_strCsvDest, (LPCTSTR)AfxGetProfile().GetExportPath() );
  725. }
  726. UpdateData( FALSE );
  727. // Store profile
  728. StoreProfile( );
  729. // Export
  730. DoExport( );
  731. return -1;
  732. }
  733. void CExportDest::OnCancel() 
  734. {
  735. // TODO: Add your specialized code here and/or call the base class
  736. if( m_bExporting )
  737. {
  738. if( IDOK == AfxMessageBox( IDS_EXPORTDEST_CONFIRMCLOSE, MB_OKCANCEL|MB_ICONINFORMATION ) )
  739. m_bCanceled = TRUE;
  740. return;
  741. }
  742. CPropertyPageEx::OnCancel();
  743. }
  744. BOOL CExportDest::PreTranslateMessage(MSG* pMsg) 
  745. {
  746. // TODO: Add your specialized code here and/or call the base class
  747. if( WM_KEYDOWN == pMsg->message && VK_RETURN == pMsg->wParam )
  748. return TRUE;
  749. return CPropertyPageEx::PreTranslateMessage(pMsg);
  750. }