TAS0020MF.cpp 51 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #include "ITSSkinF.h"
  4. #include "ITSUtilF.h"
  5. #include "ITSDbF.h"
  6. #include "AppGlobalF.h"
  7. #pragma hdrstop
  8. #include "TAS0020MF.h"
  9. //---------------------------------------------------------------------------
  10. #pragma package(smart_init)
  11. #pragma link "cxButtons"
  12. #pragma link "cxClasses"
  13. #pragma link "cxContainer"
  14. #pragma link "cxControls"
  15. #pragma link "cxCustomData"
  16. #pragma link "cxData"
  17. #pragma link "cxDataStorage"
  18. #pragma link "cxDBData"
  19. #pragma link "cxEdit"
  20. #pragma link "cxFilter"
  21. #pragma link "cxGraphics"
  22. #pragma link "cxGrid"
  23. #pragma link "cxGridBandedTableView"
  24. #pragma link "cxGridChartView"
  25. #pragma link "cxGridCustomTableView"
  26. #pragma link "cxGridCustomView"
  27. #pragma link "cxGridDBBandedTableView"
  28. #pragma link "cxGridDBChartView"
  29. #pragma link "cxGridLevel"
  30. #pragma link "cxGridTableView"
  31. #pragma link "cxLabel"
  32. #pragma link "cxLookAndFeelPainters"
  33. #pragma link "cxLookAndFeels"
  34. #pragma link "cxPC"
  35. #pragma link "cxPCdxBarPopupMenu"
  36. #pragma link "cxSpinEdit"
  37. #pragma link "cxSplitter"
  38. #pragma link "cxStyles"
  39. #pragma link "cxTextEdit"
  40. #pragma link "dxSkinBlack"
  41. #pragma link "dxSkinBlue"
  42. #pragma link "dxSkinCaramel"
  43. #pragma link "dxSkinCoffee"
  44. #pragma link "dxSkinDarkRoom"
  45. #pragma link "dxSkinDarkSide"
  46. #pragma link "dxSkinFoggy"
  47. #pragma link "dxSkinGlassOceans"
  48. #pragma link "dxSkiniMaginary"
  49. #pragma link "dxSkinLilian"
  50. #pragma link "dxSkinLiquidSky"
  51. #pragma link "dxSkinLondonLiquidSky"
  52. #pragma link "dxSkinMcSkin"
  53. #pragma link "dxSkinMoneyTwins"
  54. #pragma link "dxSkinOffice2007Black"
  55. #pragma link "dxSkinOffice2007Blue"
  56. #pragma link "dxSkinOffice2007Green"
  57. #pragma link "dxSkinOffice2007Pink"
  58. #pragma link "dxSkinOffice2007Silver"
  59. #pragma link "dxSkinOffice2010Black"
  60. #pragma link "dxSkinOffice2010Blue"
  61. #pragma link "dxSkinOffice2010Silver"
  62. #pragma link "dxSkinsCore"
  63. #pragma link "dxSkinscxPCPainter"
  64. #pragma link "dxSkinSeven"
  65. #pragma link "dxSkinSharp"
  66. #pragma link "dxSkinSilver"
  67. #pragma link "dxSkinStardust"
  68. #pragma resource "*.dfm"
  69. TTAS0020M *TAS0020M = NULL;
  70. //---------------------------------------------------------------------------
  71. __fastcall TTAS0020M::TTAS0020M(TComponent* Owner)
  72. : TForm(Owner)
  73. {
  74. ITSSkin_Load(this);
  75. LoadLocalSkin();
  76. CMM_LoadForm(g_sFormsDir, this);
  77. FTitle = "간선도로 통계";
  78. LoadConfig();
  79. m_sLinkLevel = "1";
  80. MyItsAtrdManager = new TItsAtrdManager();
  81. MyItsAtrdManager->LoadFromDb();
  82. MyItsAtrdManager->LoadAtrdLength();
  83. }
  84. //---------------------------------------------------------------------------
  85. /*
  86. * 환경설정정보 로딩
  87. *
  88. * arguments
  89. *
  90. * return
  91. * void
  92. */
  93. void __fastcall TTAS0020M::LoadConfig()
  94. {
  95. m_sFooterRight = "";//GetConfigValue("APPLICATION", "REPORTRIGHT", "");
  96. }
  97. //---------------------------------------------------------------------------
  98. /*
  99. * 공통으로 처리되지 않는 스킨을 변경한다.
  100. * arguments
  101. *
  102. * return
  103. * void
  104. */
  105. void __fastcall TTAS0020M::LoadLocalSkin()
  106. {
  107. /*
  108. * 스킨 변경
  109. */
  110. PgQuery->ParentColor = true;
  111. TsDay->ParentColor = true;
  112. TsMon->ParentColor = true;
  113. TsYear->ParentColor = true;
  114. }
  115. //---------------------------------------------------------------------------
  116. /*
  117. * form이 메모리에서 생성될때 호출되는 생성자 이벤트 핸들러
  118. * arguments
  119. * Sender : event handler 객체
  120. * return
  121. * void
  122. */
  123. void __fastcall TTAS0020M::FormCreate(TObject *Sender)
  124. {
  125. for (int ii = 0; ii < MAX_CHART; ii++)
  126. {
  127. m_pFrmChart[ii] = new TPlugInChart(this);
  128. switch(ii)
  129. {
  130. case 0:
  131. m_pFrmChart[ii]->Parent = PnlDayGraph;
  132. m_pFrmChart[ii]->SetChartInfo("", "시간", "평균속도");
  133. break;
  134. case 1:
  135. m_pFrmChart[ii]->Parent = PnlMonGraph;
  136. m_pFrmChart[ii]->SetChartInfo("", "일", "평균속도");
  137. break;
  138. case 2:
  139. m_pFrmChart[ii]->Parent = PnlYearGraph;
  140. m_pFrmChart[ii]->SetChartInfo("", "월", "평균속도");
  141. break;
  142. }
  143. m_pFrmChart[ii]->Show();
  144. }
  145. PgList->HideTabs = true;
  146. }
  147. //---------------------------------------------------------------------------
  148. /*
  149. * form을 보여줄때 호출되는 event 메서드이다.
  150. * arguments
  151. * Sender : event handler 객체
  152. * return
  153. * void
  154. */
  155. void __fastcall TTAS0020M::FormShow(TObject *Sender)
  156. {
  157. PgList->ActivePageIndex = 0;
  158. PgQuery->ActivePageIndex= 0;
  159. //DMMain->InsertListHeaderMenuItem(CxDay, (TcxGridDBTableView*)TvDay);
  160. // form 초기화
  161. FormInit();
  162. }
  163. //---------------------------------------------------------------------------
  164. /*
  165. * form 초기화
  166. * arguments
  167. *
  168. * return
  169. * void
  170. */
  171. void __fastcall TTAS0020M::FormInit()
  172. {
  173. DtDay->Date = IncHour(Now(), -24);
  174. DtMon->Date = StartOfTheMonth(IncHour(Now(), -24*30));
  175. DtYear->Date = IncHour(Now(), -24);
  176. DtStTime->Time = StrToDateTime("00:00");
  177. DtEdTime->Time = StrToDateTime("23:59");
  178. ADOD->Connection = ITSDb_GetConnection();
  179. ADOM->Connection = ITSDb_GetConnection();
  180. ADOY->Connection = ITSDb_GetConnection();
  181. TvDay->DataController->DataSource = DSD;
  182. TvMon->DataController->DataSource = DSM;
  183. TvYear->DataController->DataSource = DSY;
  184. //FillStatComboBox(CbStatCfg, "IST0810M");
  185. }
  186. //---------------------------------------------------------------------------
  187. /*
  188. * 닫기버튼 이나 x버튼 클릭시 공통으로 처리하는 로직이들어간다..
  189. * Form과 DataModule class를 delete시킨다.
  190. * arguments
  191. *
  192. * return
  193. * void
  194. */
  195. void __fastcall TTAS0020M::CommClose()
  196. {
  197. try
  198. {
  199. CMM_SaveForm(g_sFormsDir, this);
  200. //DeleteStatComboBox(CbStatCfg);
  201. TvDay->BeginUpdate();
  202. ADOD->Close();
  203. TvDay->EndUpdate();
  204. TvMon->BeginUpdate();
  205. ADOM->Close();
  206. TvMon->EndUpdate();
  207. TvYear->BeginUpdate();
  208. ADOY->Close();
  209. TvYear->EndUpdate();
  210. if (MyItsAtrdManager)
  211. {
  212. delete MyItsAtrdManager;
  213. MyItsAtrdManager = NULL;
  214. }
  215. }
  216. catch(...)
  217. {
  218. }
  219. }
  220. //---------------------------------------------------------------------------
  221. /*
  222. * 화면이 로딩된 후 리스트 목록을 조회하도록 한다.
  223. * arguments
  224. *
  225. * return
  226. * void
  227. */
  228. void __fastcall TTAS0020M::TmrRefreshTimer(TObject *Sender)
  229. {
  230. TmrRefresh->Enabled = false;
  231. }
  232. //---------------------------------------------------------------------------
  233. /*
  234. * 통계구분 탭 변경시 발생하는 이벤트 핸들러
  235. * arguments
  236. *
  237. * return
  238. * void
  239. */
  240. void __fastcall TTAS0020M::PgQueryChange(TObject *Sender)
  241. {
  242. //Tab Change
  243. PgList->ActivePageIndex = PgQuery->ActivePageIndex;
  244. switch(PgQuery->ActivePageIndex)
  245. {
  246. case 0: DtDay->SetFocus(); break;
  247. case 1: DtMon->SetFocus(); break;
  248. case 2: DtYear->SetFocus(); break;
  249. default: break;
  250. }
  251. }
  252. //---------------------------------------------------------------------------
  253. /*
  254. * Graph Button Click Event Handler
  255. * arguments
  256. * Sender : event handler 객체
  257. * return
  258. * void
  259. */
  260. void __fastcall TTAS0020M::BtnGraphClick(TObject *Sender)
  261. {
  262. // 차트를 다른 창에서 보여줘야 할 경우 Frm1121100_1F.cpp 내 소스 참조
  263. }
  264. //---------------------------------------------------------------------------
  265. /*
  266. * Print Button Click Event Handler
  267. * arguments
  268. * Sender : event handler 객체
  269. * return
  270. * void
  271. */
  272. void __fastcall TTAS0020M::BtnPrintClick(TObject *Sender)
  273. {
  274. TcxGrid *pGrid = NULL;
  275. TcxGridDBBandedTableView *pView = NULL;
  276. TLabel *LblQry= NULL;
  277. String sTitle;
  278. switch(PgQuery->ActivePageIndex)
  279. {
  280. case 0: pGrid = CxDay; pView = TvDay;
  281. LblQry = LblQryTm;
  282. break;
  283. case 1: pGrid = CxMon; pView = TvMon;
  284. LblQry = LblQryDay;
  285. break;
  286. case 2: pGrid = CxYear; pView = TvYear;
  287. LblQry = LblQryYear;
  288. break;
  289. default: return;
  290. }
  291. sTitle = LblRptTitle->Caption + "\r\n" + LblQry->Caption;
  292. if (pView->DataController->RecordCount == 0)
  293. {
  294. ShowMessage("인쇄 할 데이터가 없습니다.");
  295. return;
  296. }
  297. //ComponentPrinterLink->OptionsView->Footers = true;
  298. //ComponentPrinterLink->OptionsView->GroupFooters = true;
  299. //ComponentPrinterLink->OptionsSize->AutoWidth = true;
  300. //CMM_PrintList(pGrid, sTitle, m_sFooterRight);
  301. pView->DataController->FocusedRecordIndex = 0;
  302. }
  303. //---------------------------------------------------------------------------
  304. /*
  305. * Excel Button Click Event Handler
  306. * arguments
  307. * Sender : event handler 객체
  308. * return
  309. * void
  310. */
  311. void __fastcall TTAS0020M::BtnExlSaveClick(TObject *Sender)
  312. {
  313. TcxGrid *pGrid = NULL;
  314. TcxGridDBBandedTableView *pView = NULL;
  315. TLabel *LblQry= NULL;
  316. String sTitle;
  317. switch(PgQuery->ActivePageIndex)
  318. {
  319. case 0: pGrid = CxDay; pView = TvDay;
  320. LblQry = LblQryTm;
  321. break;
  322. case 1: pGrid = CxMon; pView = TvMon;
  323. LblQry = LblQryDay;
  324. break;
  325. case 2: pGrid = CxYear; pView = TvYear;
  326. LblQry = LblQryYear;
  327. break;
  328. default: return;
  329. }
  330. sTitle = LblRptTitle->Caption + LblQry->Caption;
  331. if (pView->DataController->RecordCount == 0)
  332. {
  333. ShowMessage("저장 할 데이터가 없습니다.");
  334. return;
  335. }
  336. CMM_ExportToExcelFile(sTitle, pGrid, pView, this);
  337. }
  338. //---------------------------------------------------------------------------
  339. /*
  340. * Refresh Button Click Event Handler
  341. * arguments
  342. * Sender : event handler 객체
  343. * return
  344. * void
  345. */
  346. void __fastcall TTAS0020M::BtnSearchClick(TObject *Sender)
  347. {
  348. m_sLinkLevel = CbLinkLevel->Text;
  349. RefreshData();
  350. }
  351. //---------------------------------------------------------------------------
  352. /*
  353. * Refresh Data Event Function
  354. * arguments
  355. *
  356. * return
  357. * void
  358. */
  359. void __fastcall TTAS0020M::RefreshData()
  360. {
  361. TcxGridDBBandedTableView *pView = NULL;
  362. TLabel *LblQry= NULL;
  363. TLabel *LblRecords= NULL;
  364. WORD nYear, nMonth, nDay, nHour, nMin, nSec, nMSec;
  365. int nDispCols;
  366. String sBandText = "";
  367. String sMsgTitle, sMsgString;
  368. TDateTimePicker *DtQryTm;
  369. int nStYear, nEdYear;
  370. switch(PgQuery->ActivePageIndex)
  371. {
  372. case 0:
  373. pView = TvDay;
  374. DtQryTm = DtDay;
  375. LblQry = LblQryTm;
  376. LblRecords = LblRecordsTm;
  377. sBandText = "(" + DtDay->Date.FormatString("yyyy년 mm월 dd일") + ")";
  378. nDispCols = 24;
  379. if (StartOfTheDay(Now()) <= DtDay->DateTime)
  380. {
  381. DecodeTime(Now(), nHour, nMin, nSec, nMSec);
  382. if (nMin > 5) nDispCols = nHour;
  383. else nDispCols = nHour-1;
  384. }
  385. break;
  386. case 1:
  387. pView = TvMon;
  388. DtQryTm = DtMon;
  389. LblQry = LblQryDay;
  390. LblRecords = LblRecordsDay;
  391. sBandText = "(" + DtMon->Date.FormatString("yyyy년 mm월") + ")";
  392. nDispCols = ITSUtil_GetMonthLastDay(AnsiString(DtMon->Date.FormatString("yyyymm")).c_str());
  393. if (StartOfTheDay(Now()) <= EndOfTheMonth(DtMon->DateTime))
  394. {
  395. DecodeDate(Now(), nYear, nMonth, nDay);
  396. if (nDay < nDispCols) nDispCols = nDay-1;
  397. }
  398. {
  399. String sStDateTime = DtStTime->Time.FormatString("hhnn");
  400. String sEdDateTime = DtEdTime->Time.FormatString("hhnn");
  401. if (sStDateTime > sEdDateTime)
  402. {
  403. Application->MessageBox(L"검색 시작시각이 검색 종료시각 보다 큽니다.", FTitle.c_str(), MB_OK|MB_ICONWARNING|MB_APPLMODAL);
  404. return;
  405. }
  406. }
  407. break;
  408. case 2:
  409. pView = TvYear;
  410. DtQryTm = DtYear;
  411. LblQry = LblQryYear;
  412. LblRecords = LblRecordsYear;
  413. sBandText = "(" + DtYear->Date.FormatString("yyyy년") + ")";
  414. nDispCols = 12;
  415. if (Now().FormatString("yyyy") == DtYear->DateTime.FormatString("yyyy"))
  416. {
  417. DecodeDate(Now(), nYear, nMonth, nDay);
  418. nDispCols = nMonth;
  419. }
  420. break;
  421. default: return;
  422. }
  423. if (!pView) return;
  424. if (DtQryTm->DateTime.FormatString("yyyymmdd").ToInt() > Now().FormatString("yyyymmdd").ToInt())
  425. {
  426. Application->MessageBox(L"통계검색 시각 정보를 확인하세요.", FTitle.c_str(), MB_OK|MB_ICONWARNING|MB_APPLMODAL);
  427. MessageDlg(sMsgString.c_str(), mtInformation, TMsgDlgButtons() << mbOK, NULL);
  428. DtQryTm->SetFocus();
  429. nDispCols = 0; /* 리턴하지 않는 경우 모든 컬럼을 숨긴다. */
  430. return;
  431. }
  432. LblQry->Caption = sBandText;
  433. CMM_ShowListColumn(pView, nDispCols);
  434. TWaitCursor crs;
  435. try
  436. {
  437. pView->BeginUpdate();
  438. switch(PgQuery->ActivePageIndex)
  439. {
  440. case 0: DispDayStatistics(); break;
  441. case 1: DispMonthStatistics(); break;
  442. case 2: DispYearStatistics(); break;
  443. default: return;
  444. }
  445. }
  446. __finally
  447. {
  448. pView->EndUpdate();
  449. //pView->ApplyBestFit(NULL, false, false);
  450. LblRecords->Caption = FormatFloat("##,##0", pView->DataController->RecordCount) + " 건";
  451. String sEnd = "데이터 " + LblRecords->Caption + " 이 조회 되었습니다.";
  452. Application->MessageBox(sEnd.c_str(), L"데이터 조회 완료", MB_OK|MB_ICONINFORMATION|MB_APPLMODAL);
  453. }
  454. DrawChart(sBandText);
  455. }
  456. //---------------------------------------------------------------------------
  457. /*
  458. * 조회한 데이터를 기준으로 차트를 그린다.
  459. * arguments
  460. *
  461. * return
  462. * void
  463. */
  464. void __fastcall TTAS0020M::DrawChart(String sTitle)
  465. {
  466. TcxGridDBBandedTableView *pView = NULL;
  467. String sAxisX, sAxisY;
  468. int nAxisY1, nAxisY2, nAxisY3, nStColIdx, nEdColIdx, nTotColIdx;
  469. nAxisY3 = 0;
  470. nEdColIdx = 0;
  471. nTotColIdx = -1;
  472. switch(PgQuery->ActivePageIndex)
  473. {
  474. case 0: pView = TvDay;
  475. nAxisY1 = vDayColumnNo->Index;
  476. nAxisY2 = vDayColumnTot->Index;
  477. nAxisY3 = TvDayColumn1->Index;
  478. nEdColIdx = cxGridDBBandedColumn54->Index;
  479. nStColIdx = vDayColumnAvg->Index;//vDayColumn1->Index;
  480. break;
  481. case 1: pView = TvMon;
  482. nAxisY1 = vMonColumnNo->Index;
  483. nAxisY2 = vMonColumnTot->Index;
  484. nAxisY3 = TvMonColumn1->Index;
  485. nEdColIdx = vMonColumn31->Index;
  486. nStColIdx = vMonColumnAvg->Index;//vMonColumn1->Index;
  487. break;
  488. case 2: pView = TvYear;
  489. nAxisY1 = vYearColumnNo->Index;
  490. nAxisY2 = vYearColumnTot->Index;
  491. nAxisY3 = TvYearColumn1->Index;
  492. nEdColIdx = vYearColumn12->Index;
  493. nStColIdx = vYearColumnAvg->Index;//vYearColumn1->Index;
  494. break;
  495. default: return;
  496. }
  497. /*
  498. * Chart draw
  499. */
  500. try
  501. {
  502. m_pFrmChart[PgQuery->ActivePageIndex]->Clear();
  503. if (pView->DataController->RecordCount == 0)
  504. {
  505. //ShowMessage("표출 할 데이터가 없습니다.");
  506. return;
  507. }
  508. m_pFrmChart[PgQuery->ActivePageIndex]->BeginDraw("", "", "");
  509. //m_pFrmChart[PgQuery->ActivePageIndex]->DrawChart4((TcxGridDBTableView *)pView, nAxisY1, nAxisY2, nStColIdx, nTotColIdx);
  510. m_pFrmChart[PgQuery->ActivePageIndex]->DrawChart5((TcxGridDBTableView *)pView, nAxisY1, nAxisY2, nAxisY3, nStColIdx, nEdColIdx, nTotColIdx);
  511. m_pFrmChart[PgQuery->ActivePageIndex]->EndDraw();
  512. }
  513. catch(...)
  514. {
  515. }
  516. }
  517. //---------------------------------------------------------------------------
  518. /*
  519. * 시간대별 일 통계 데이터 조회/출력
  520. * arguments
  521. *
  522. * return
  523. * void
  524. */
  525. void __fastcall TTAS0020M::DispDayStatistics()
  526. {
  527. String sQry;
  528. String sDD;
  529. String sFrom, sTo;
  530. String sTmp;
  531. int ii;
  532. sDD = DtDay->Date.FormatString("yyyyMMdd");
  533. sFrom = sDD + "000000";
  534. sTo = sDD + "235959";
  535. sQry =
  536. "SELECT LY.ARTERYID, LY.ARTERYNAME, LY.DIRECTION, LY.DIRECTIONNAME, LY.ARTERYLENGHT, LX.TRFTYPE, \r\n"
  537. " DECODE(LX.ARTERYID, NULL, '-', DECODE(TTM, 0, '-', ROUND(TLL*3.6/TTM, 0))) AS ARTERYSPD, \r\n"
  538. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T00, 0, '-', ROUND(L00*3.6/T00, 0))) AS C00, \r\n"
  539. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T01, 0, '-', ROUND(L01*3.6/T01, 0))) AS C01, \r\n"
  540. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T02, 0, '-', ROUND(L02*3.6/T02, 0))) AS C02, \r\n"
  541. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T03, 0, '-', ROUND(L03*3.6/T03, 0))) AS C03, \r\n"
  542. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T04, 0, '-', ROUND(L04*3.6/T04, 0))) AS C04, \r\n"
  543. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T05, 0, '-', ROUND(L05*3.6/T05, 0))) AS C05, \r\n"
  544. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T06, 0, '-', ROUND(L06*3.6/T06, 0))) AS C06, \r\n"
  545. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T07, 0, '-', ROUND(L07*3.6/T07, 0))) AS C07, \r\n"
  546. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T08, 0, '-', ROUND(L08*3.6/T08, 0))) AS C08, \r\n"
  547. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T09, 0, '-', ROUND(L09*3.6/T09, 0))) AS C09, \r\n"
  548. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T10, 0, '-', ROUND(L10*3.6/T10, 0))) AS C10, \r\n"
  549. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T11, 0, '-', ROUND(L11*3.6/T11, 0))) AS C11, \r\n"
  550. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T12, 0, '-', ROUND(L12*3.6/T12, 0))) AS C12, \r\n"
  551. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T13, 0, '-', ROUND(L13*3.6/T13, 0))) AS C13, \r\n"
  552. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T14, 0, '-', ROUND(L14*3.6/T14, 0))) AS C14, \r\n"
  553. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T15, 0, '-', ROUND(L15*3.6/T15, 0))) AS C15, \r\n"
  554. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T16, 0, '-', ROUND(L16*3.6/T16, 0))) AS C16, \r\n"
  555. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T17, 0, '-', ROUND(L17*3.6/T17, 0))) AS C17, \r\n"
  556. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T18, 0, '-', ROUND(L18*3.6/T18, 0))) AS C18, \r\n"
  557. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T19, 0, '-', ROUND(L19*3.6/T19, 0))) AS C19, \r\n"
  558. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T20, 0, '-', ROUND(L20*3.6/T20, 0))) AS C20, \r\n"
  559. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T21, 0, '-', ROUND(L21*3.6/T21, 0))) AS C21, \r\n"
  560. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T22, 0, '-', ROUND(L22*3.6/T22, 0))) AS C22, \r\n"
  561. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T23, 0, '-', ROUND(L23*3.6/T23, 0))) AS C23 \r\n"
  562. " FROM ( \r\n"
  563. "SELECT GROUPING(ARTERYID) AS GROUPING_ARTERYID, \r\n"
  564. " GROUPING(DIRECTION) AS GROUPING_DIRECTION, \r\n"
  565. " GROUPING(TRFTYPE) AS GROUPING_TRFTYPE, \r\n"
  566. " CASE WHEN GROUPING(ARTERYID ) = 1 THEN '도로' ELSE ARTERYID END AS GROUP_ARTERYID, \r\n"
  567. " CASE WHEN GROUPING(DIRECTION) = 1 THEN '방향' ELSE DIRECTION END AS GROUP_DIRECTION, \r\n"
  568. " CASE WHEN GROUPING(TRFTYPE) = 1 THEN '소계' ELSE TRFTYPE END AS GROUP_TRFTYPE, \r\n"
  569. " ARTERYID, DIRECTION, TRFTYPE, \r\n"
  570. " SUM(DECODE(TRVTM, NULL, 0, LINKLEN)) TLL, \r\n"
  571. " SUM(DECODE(TRVTM, NULL, 0, TRVTM )) TTM, \r\n"
  572. " SUM(DECODE(STATHOUR, '00', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T00, \r\n"
  573. " SUM(DECODE(STATHOUR, '00', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L00, \r\n"
  574. " SUM(DECODE(STATHOUR, '01', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T01, \r\n"
  575. " SUM(DECODE(STATHOUR, '01', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L01, \r\n"
  576. " SUM(DECODE(STATHOUR, '02', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T02, \r\n"
  577. " SUM(DECODE(STATHOUR, '02', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L02, \r\n"
  578. " SUM(DECODE(STATHOUR, '03', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T03, \r\n"
  579. " SUM(DECODE(STATHOUR, '03', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L03, \r\n"
  580. " SUM(DECODE(STATHOUR, '04', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T04, \r\n"
  581. " SUM(DECODE(STATHOUR, '04', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L04, \r\n"
  582. " SUM(DECODE(STATHOUR, '05', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T05, \r\n"
  583. " SUM(DECODE(STATHOUR, '05', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L05, \r\n"
  584. " SUM(DECODE(STATHOUR, '06', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T06, \r\n"
  585. " SUM(DECODE(STATHOUR, '06', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L06, \r\n"
  586. " SUM(DECODE(STATHOUR, '07', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T07, \r\n"
  587. " SUM(DECODE(STATHOUR, '07', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L07, \r\n"
  588. " SUM(DECODE(STATHOUR, '08', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T08, \r\n"
  589. " SUM(DECODE(STATHOUR, '08', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L08, \r\n"
  590. " SUM(DECODE(STATHOUR, '09', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T09, \r\n"
  591. " SUM(DECODE(STATHOUR, '09', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L09, \r\n"
  592. " SUM(DECODE(STATHOUR, '10', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T10, \r\n"
  593. " SUM(DECODE(STATHOUR, '10', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L10, \r\n"
  594. " SUM(DECODE(STATHOUR, '11', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T11, \r\n"
  595. " SUM(DECODE(STATHOUR, '11', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L11, \r\n"
  596. " SUM(DECODE(STATHOUR, '12', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T12, \r\n"
  597. " SUM(DECODE(STATHOUR, '12', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L12, \r\n"
  598. " SUM(DECODE(STATHOUR, '13', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T13, \r\n"
  599. " SUM(DECODE(STATHOUR, '13', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L13, \r\n"
  600. " SUM(DECODE(STATHOUR, '14', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T14, \r\n"
  601. " SUM(DECODE(STATHOUR, '14', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L14, \r\n"
  602. " SUM(DECODE(STATHOUR, '15', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T15, \r\n"
  603. " SUM(DECODE(STATHOUR, '15', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L15, \r\n"
  604. " SUM(DECODE(STATHOUR, '16', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T16, \r\n"
  605. " SUM(DECODE(STATHOUR, '16', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L16, \r\n"
  606. " SUM(DECODE(STATHOUR, '17', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T17, \r\n"
  607. " SUM(DECODE(STATHOUR, '17', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L17, \r\n"
  608. " SUM(DECODE(STATHOUR, '18', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T18, \r\n"
  609. " SUM(DECODE(STATHOUR, '18', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L18, \r\n"
  610. " SUM(DECODE(STATHOUR, '19', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T19, \r\n"
  611. " SUM(DECODE(STATHOUR, '19', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L19, \r\n"
  612. " SUM(DECODE(STATHOUR, '20', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T20, \r\n"
  613. " SUM(DECODE(STATHOUR, '20', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L20, \r\n"
  614. " SUM(DECODE(STATHOUR, '21', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T21, \r\n"
  615. " SUM(DECODE(STATHOUR, '21', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L21, \r\n"
  616. " SUM(DECODE(STATHOUR, '22', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T22, \r\n"
  617. " SUM(DECODE(STATHOUR, '22', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L22, \r\n"
  618. " SUM(DECODE(STATHOUR, '23', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T23, \r\n"
  619. " SUM(DECODE(STATHOUR, '23', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L23 \r\n"
  620. " FROM ( \r\n"
  621. "SELECT Y.ARTERYID, Y.ARTERYNAME, Y.DIRECTION, Y.ARTERYLEN, X.TRFTYPE, \r\n"
  622. " Y.LINKID, Y.LINKLEN, X.STATHOUR, X.SPD, X.TRVTM \r\n"
  623. " FROM (SELECT /*+ INDEX(A IX_ROAD_HH_STAT_PK) */ \r\n"
  624. " 'FSN' AS TRFTYPE, \r\n"
  625. " B.ATRD_ID AS ARTERYID, A.ROAD_ID AS LINKID, C.SECT_LNGT AS LINKLEN, \r\n"
  626. " SUBSTR(A.STAT_DT, 9, 2) AS STATHOUR, A.SPED AS SPD, A.TRVL_HH AS TRVTM \r\n"
  627. " FROM TB_ROAD_HH_STAT A, TB_ATRD_ROAD_RLTN B, TB_ROAD C \r\n"
  628. " WHERE 1=1 \r\n"
  629. " AND A.STAT_DT BETWEEN :p01 AND :p02 \r\n"
  630. " AND A.ROAD_ID = B.ROAD_ID \r\n"
  631. " AND B.ROAD_ID = C.ROAD_ID \r\n"
  632. " ) X, \r\n"
  633. " VW_ATRD_ROAD_RLTN Y \r\n"
  634. " WHERE Y.LINKID = X.LINKID \r\n"
  635. ") \r\n"
  636. " GROUP BY ROLLUP (ARTERYID, DIRECTION, TRFTYPE) \r\n"
  637. " HAVING GROUPING(TRFTYPE) = 0) LX, \r\n"
  638. " VW_ATRD LY \r\n"
  639. " WHERE LY.ARTERYID = LX.ARTERYID(+) \r\n"
  640. " AND LY.DIRECTION = LX.DIRECTION(+) \r\n"
  641. " ORDER BY LY.ARTERYNAME, LY.DIRECTION, LX.TRFTYPE \r\n";
  642. try
  643. {
  644. ITSDb_SQLText(ADOD, sQry);
  645. ITSDb_SQLBind(ADOD, "p01", sFrom);
  646. ITSDb_SQLBind(ADOD, "p02", sTo);
  647. ITSDb_SQLOpen(ADOD);
  648. ShowRecordCount(ADOD->RecordCount);
  649. }
  650. catch(EDatabaseError &E)
  651. {
  652. ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
  653. throw Exception(String(E.ClassName()) + E.Message);
  654. }
  655. catch (Exception &exception)
  656. {
  657. ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
  658. throw Exception(String(exception.ClassName()) + exception.Message);
  659. }
  660. }
  661. //---------------------------------------------------------------------------
  662. /*
  663. * 일별 월 통계 데이터 조회/출력
  664. * arguments
  665. *
  666. * return
  667. * void
  668. */
  669. void __fastcall TTAS0020M::DispMonthStatistics()
  670. {
  671. String sQry = "";
  672. String sMM;
  673. String sFrom, sTo;
  674. String sTmp;
  675. int ii;
  676. sMM = DtMon->Date.FormatString("yyyyMM");
  677. sFrom = sMM + "01000000";
  678. sTo = sMM + "31235959";
  679. String sStTm = DtStTime->Time.FormatString("hhnn");
  680. String sEdTm = DtEdTime->Time.FormatString("hhnn");
  681. sQry =
  682. "SELECT LY.ARTERYID, LY.ARTERYNAME, LY.DIRECTION, LY.DIRECTIONNAME, LY.ARTERYLENGHT, LX.TRFTYPE, \r\n"
  683. " DECODE(LX.ARTERYID, NULL, '-', DECODE(TTM, 0, '-', ROUND(TLL*3.6/TTM, 0))) AS ARTERYSPD, \r\n"
  684. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T01, 0, '-', ROUND(L01*3.6/T01, 0))) AS C01, \r\n"
  685. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T02, 0, '-', ROUND(L02*3.6/T02, 0))) AS C02, \r\n"
  686. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T03, 0, '-', ROUND(L03*3.6/T03, 0))) AS C03, \r\n"
  687. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T04, 0, '-', ROUND(L04*3.6/T04, 0))) AS C04, \r\n"
  688. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T05, 0, '-', ROUND(L05*3.6/T05, 0))) AS C05, \r\n"
  689. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T06, 0, '-', ROUND(L06*3.6/T06, 0))) AS C06, \r\n"
  690. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T07, 0, '-', ROUND(L07*3.6/T07, 0))) AS C07, \r\n"
  691. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T08, 0, '-', ROUND(L08*3.6/T08, 0))) AS C08, \r\n"
  692. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T09, 0, '-', ROUND(L09*3.6/T09, 0))) AS C09, \r\n"
  693. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T10, 0, '-', ROUND(L10*3.6/T10, 0))) AS C10, \r\n"
  694. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T11, 0, '-', ROUND(L11*3.6/T11, 0))) AS C11, \r\n"
  695. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T12, 0, '-', ROUND(L12*3.6/T12, 0))) AS C12, \r\n"
  696. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T13, 0, '-', ROUND(L13*3.6/T13, 0))) AS C13, \r\n"
  697. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T14, 0, '-', ROUND(L14*3.6/T14, 0))) AS C14, \r\n"
  698. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T15, 0, '-', ROUND(L15*3.6/T15, 0))) AS C15, \r\n"
  699. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T16, 0, '-', ROUND(L16*3.6/T16, 0))) AS C16, \r\n"
  700. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T17, 0, '-', ROUND(L17*3.6/T17, 0))) AS C17, \r\n"
  701. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T18, 0, '-', ROUND(L18*3.6/T18, 0))) AS C18, \r\n"
  702. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T19, 0, '-', ROUND(L19*3.6/T19, 0))) AS C19, \r\n"
  703. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T20, 0, '-', ROUND(L20*3.6/T20, 0))) AS C20, \r\n"
  704. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T21, 0, '-', ROUND(L21*3.6/T21, 0))) AS C21, \r\n"
  705. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T22, 0, '-', ROUND(L22*3.6/T22, 0))) AS C22, \r\n"
  706. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T23, 0, '-', ROUND(L23*3.6/T23, 0))) AS C23, \r\n"
  707. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T24, 0, '-', ROUND(L24*3.6/T24, 0))) AS C24, \r\n"
  708. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T25, 0, '-', ROUND(L25*3.6/T25, 0))) AS C25, \r\n"
  709. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T26, 0, '-', ROUND(L26*3.6/T26, 0))) AS C26, \r\n"
  710. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T27, 0, '-', ROUND(L27*3.6/T27, 0))) AS C27, \r\n"
  711. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T28, 0, '-', ROUND(L28*3.6/T28, 0))) AS C28, \r\n"
  712. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T29, 0, '-', ROUND(L29*3.6/T29, 0))) AS C29, \r\n"
  713. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T30, 0, '-', ROUND(L30*3.6/T30, 0))) AS C30, \r\n"
  714. " DECODE(LX.ARTERYID, NULL, '-', DECODE(T31, 0, '-', ROUND(L31*3.6/T31, 0))) AS C31 \r\n"
  715. " FROM ( \r\n"
  716. "SELECT GROUPING(ARTERYID) AS GROUPING_ARTERYID, \r\n"
  717. " GROUPING(DIRECTION) AS GROUPING_DIRECTION, \r\n"
  718. " GROUPING(TRFTYPE) AS GROUPING_TRFTYPE, \r\n"
  719. " CASE WHEN GROUPING(ARTERYID ) = 1 THEN '도로' ELSE ARTERYID END AS GROUP_ARTERYID, \r\n"
  720. " CASE WHEN GROUPING(DIRECTION) = 1 THEN '방향' ELSE DIRECTION END AS GROUP_DIRECTION, \r\n"
  721. " CASE WHEN GROUPING(TRFTYPE) = 1 THEN '소계' ELSE TRFTYPE END AS GROUP_TRFTYPE, \r\n"
  722. " ARTERYID, DIRECTION, TRFTYPE, \r\n"
  723. " SUM(DECODE(TRVTM, NULL, 0, LINKLEN)) TLL, \r\n"
  724. " SUM(DECODE(TRVTM, NULL, 0, TRVTM )) TTM, \r\n"
  725. " SUM(DECODE(STATDAY, '01', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T01, \r\n"
  726. " SUM(DECODE(STATDAY, '01', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L01, \r\n"
  727. " SUM(DECODE(STATDAY, '02', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T02, \r\n"
  728. " SUM(DECODE(STATDAY, '02', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L02, \r\n"
  729. " SUM(DECODE(STATDAY, '03', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T03, \r\n"
  730. " SUM(DECODE(STATDAY, '03', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L03, \r\n"
  731. " SUM(DECODE(STATDAY, '04', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T04, \r\n"
  732. " SUM(DECODE(STATDAY, '04', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L04, \r\n"
  733. " SUM(DECODE(STATDAY, '05', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T05, \r\n"
  734. " SUM(DECODE(STATDAY, '05', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L05, \r\n"
  735. " SUM(DECODE(STATDAY, '06', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T06, \r\n"
  736. " SUM(DECODE(STATDAY, '06', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L06, \r\n"
  737. " SUM(DECODE(STATDAY, '07', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T07, \r\n"
  738. " SUM(DECODE(STATDAY, '07', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L07, \r\n"
  739. " SUM(DECODE(STATDAY, '08', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T08, \r\n"
  740. " SUM(DECODE(STATDAY, '08', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L08, \r\n"
  741. " SUM(DECODE(STATDAY, '09', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T09, \r\n"
  742. " SUM(DECODE(STATDAY, '09', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L09, \r\n"
  743. " SUM(DECODE(STATDAY, '10', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T10, \r\n"
  744. " SUM(DECODE(STATDAY, '10', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L10, \r\n"
  745. " SUM(DECODE(STATDAY, '11', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T11, \r\n"
  746. " SUM(DECODE(STATDAY, '11', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L11, \r\n"
  747. " SUM(DECODE(STATDAY, '12', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T12, \r\n"
  748. " SUM(DECODE(STATDAY, '12', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L12, \r\n"
  749. " SUM(DECODE(STATDAY, '13', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T13, \r\n"
  750. " SUM(DECODE(STATDAY, '13', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L13, \r\n"
  751. " SUM(DECODE(STATDAY, '14', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T14, \r\n"
  752. " SUM(DECODE(STATDAY, '14', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L14, \r\n"
  753. " SUM(DECODE(STATDAY, '15', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T15, \r\n"
  754. " SUM(DECODE(STATDAY, '15', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L15, \r\n"
  755. " SUM(DECODE(STATDAY, '16', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T16, \r\n"
  756. " SUM(DECODE(STATDAY, '16', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L16, \r\n"
  757. " SUM(DECODE(STATDAY, '17', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T17, \r\n"
  758. " SUM(DECODE(STATDAY, '17', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L17, \r\n"
  759. " SUM(DECODE(STATDAY, '18', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T18, \r\n"
  760. " SUM(DECODE(STATDAY, '18', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L18, \r\n"
  761. " SUM(DECODE(STATDAY, '19', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T19, \r\n"
  762. " SUM(DECODE(STATDAY, '19', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L19, \r\n"
  763. " SUM(DECODE(STATDAY, '20', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T20, \r\n"
  764. " SUM(DECODE(STATDAY, '20', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L20, \r\n"
  765. " SUM(DECODE(STATDAY, '21', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T21, \r\n"
  766. " SUM(DECODE(STATDAY, '21', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L21, \r\n"
  767. " SUM(DECODE(STATDAY, '22', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T22, \r\n"
  768. " SUM(DECODE(STATDAY, '22', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L22, \r\n"
  769. " SUM(DECODE(STATDAY, '23', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T23, \r\n"
  770. " SUM(DECODE(STATDAY, '23', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L23, \r\n"
  771. " SUM(DECODE(STATDAY, '24', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T24, \r\n"
  772. " SUM(DECODE(STATDAY, '24', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L24, \r\n"
  773. " SUM(DECODE(STATDAY, '25', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T25, \r\n"
  774. " SUM(DECODE(STATDAY, '25', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L25, \r\n"
  775. " SUM(DECODE(STATDAY, '26', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T26, \r\n"
  776. " SUM(DECODE(STATDAY, '26', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L26, \r\n"
  777. " SUM(DECODE(STATDAY, '27', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T27, \r\n"
  778. " SUM(DECODE(STATDAY, '27', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L27, \r\n"
  779. " SUM(DECODE(STATDAY, '28', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T28, \r\n"
  780. " SUM(DECODE(STATDAY, '28', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L28, \r\n"
  781. " SUM(DECODE(STATDAY, '29', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T29, \r\n"
  782. " SUM(DECODE(STATDAY, '29', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L29, \r\n"
  783. " SUM(DECODE(STATDAY, '30', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T30, \r\n"
  784. " SUM(DECODE(STATDAY, '30', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L30, \r\n"
  785. " SUM(DECODE(STATDAY, '31', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T31, \r\n"
  786. " SUM(DECODE(STATDAY, '31', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L31 \r\n"
  787. " FROM ( \r\n"
  788. "SELECT Y.ARTERYID, Y.ARTERYNAME, Y.DIRECTION, Y.ARTERYLEN, X.TRFTYPE, \r\n"
  789. " Y.LINKID, Y.LINKLEN, X.STATDAY, X.SPD, X.TRVTM \r\n"
  790. " FROM (SELECT /*+ INDEX(A IX_ROAD_15M_STAT_PK) */ \r\n"
  791. " 'FSN' AS TRFTYPE, \r\n"
  792. " B.ATRD_ID AS ARTERYID, A.ROAD_ID AS LINKID, C.SECT_LNGT AS LINKLEN, \r\n"
  793. " SUBSTR(A.STAT_DT, 7, 2) AS STATDAY, A.SPED AS SPD, A.TRVL_HH AS TRVTM \r\n"
  794. " FROM TB_ROAD_15M_STAT A, TB_ATRD_ROAD_RLTN B, TB_ROAD C \r\n"
  795. " WHERE 1=1 \r\n"
  796. " AND A.STAT_DT BETWEEN :p01 AND :p02 \r\n"
  797. " AND SUBSTR(A.STAT_DT, 9, 4) BETWEEN :p03 AND :p04 \r\n"
  798. " AND A.ROAD_ID = B.ROAD_ID \r\n"
  799. " AND B.ROAD_ID = C.ROAD_ID \r\n"
  800. " ) X, \r\n"
  801. " VW_ATRD_ROAD_RLTN Y \r\n"
  802. " WHERE Y.LINKID = X.LINKID \r\n"
  803. ") \r\n"
  804. " GROUP BY ROLLUP (ARTERYID, DIRECTION, TRFTYPE) \r\n"
  805. " HAVING GROUPING(TRFTYPE) = 0) LX, \r\n"
  806. " VW_ATRD LY \r\n"
  807. " WHERE LY.ARTERYID = LX.ARTERYID(+) \r\n"
  808. " AND LY.DIRECTION = LX.DIRECTION(+) \r\n"
  809. " ORDER BY LY.ARTERYNAME, LY.DIRECTION, LX.TRFTYPE \r\n";
  810. try
  811. {
  812. ITSDb_SQLText(ADOM, sQry);
  813. ITSDb_SQLBind(ADOM, "p01", sFrom);
  814. ITSDb_SQLBind(ADOM, "p02", sTo);
  815. ITSDb_SQLBind(ADOM, "p03", sStTm);
  816. ITSDb_SQLBind(ADOM, "p04", sEdTm);
  817. ITSDb_SQLOpen(ADOM);
  818. ShowRecordCount(ADOM->RecordCount);
  819. }
  820. catch(EDatabaseError &E)
  821. {
  822. throw Exception(String(E.ClassName()) + E.Message);
  823. }
  824. catch (Exception &exception)
  825. {
  826. throw Exception(String(exception.ClassName()) + exception.Message);
  827. }
  828. }
  829. //---------------------------------------------------------------------------
  830. /*
  831. * 월별 년 통계 데이터 조회/출력
  832. * arguments
  833. *
  834. * return
  835. * void
  836. */
  837. void __fastcall TTAS0020M::DispYearStatistics()
  838. {
  839. #if 0
  840. String sQry = "";
  841. String sYYYY;
  842. String sTmp;
  843. int ii;
  844. sYYYY = DtYear->Date.FormatString("yyyy");
  845. String sQry1 = "";
  846. sQry1 = "SELECT LY.ARTERYID, LY.ARTERYNAME, LY.DIRECTION, LY.DIRECTIONNAME, LY.ARTERYLENGTH, LX.TRFTYPE, \r\n"
  847. " DECODE(LX.ARTERYID, NULL, '-', DECODE(TTM, 0, '-', ROUND(TLL*3.6/TTM, 0))) AS ARTERYSPD, \r\n";
  848. int nLoops = 13;
  849. for (ii = 1; ii < nLoops; ii++)
  850. {
  851. sTmp = "";
  852. sTmp.printf(L" DECODE(LX.ARTERYID, NULL, '-', DECODE(T%02d, 0, '-', ROUND(L%02d*3.6/T%02d, 0))) AS C%02d ", ii, ii, ii, ii);
  853. if (ii == nLoops-1) sTmp += " \r\n";
  854. else sTmp += ",\r\n";
  855. sQry1 += sTmp;
  856. }
  857. String sQry2 = "";
  858. sQry2 = " FROM (SELECT GROUPING(ARTERYID) AS GROUPING_ARTERYID, GROUPING(DIRECTION) AS GROUPING_DIRECTION, \r\n"
  859. " GROUPING(TRFTYPE) AS GROUPING_TRFTYPE, \r\n"
  860. " CASE WHEN GROUPING(ARTERYID ) = 1 THEN '도로' ELSE ARTERYID END AS GROUP_ARTERYID, \r\n"
  861. " CASE WHEN GROUPING(DIRECTION) = 1 THEN '방향' ELSE DIRECTION END AS GROUP_DIRECTION, \r\n"
  862. " CASE WHEN GROUPING(TRFTYPE) = 1 THEN '소계' ELSE TRFTYPE END AS GROUP_TRFTYPE, \r\n"
  863. " ARTERYID, DIRECTION, TRFTYPE, \r\n"
  864. " SUM(DECODE(TRVTM, NULL, 0, LINKLEN)) TLL, \r\n"
  865. " SUM(DECODE(TRVTM, NULL, 0, TRVTM )) TTM, \r\n";
  866. for (ii = 0; ii < nLoops; ii++)
  867. {
  868. sTmp = "";
  869. sTmp.printf(L" SUM(DECODE(STATMON, '%02d', DECODE(TRVTM, NULL, 0, TRVTM), 0)) AS T%02d, \r\n"
  870. " SUM(DECODE(STATMON, '%02d', DECODE(TRVTM, NULL, 0, LINKLEN), 0)) AS L%02d", ii, ii, ii, ii);
  871. if (ii == nLoops-1) sTmp += " \r\n";
  872. else sTmp += ",\r\n";
  873. sQry2 += sTmp;
  874. }
  875. String sQry3 = 0;
  876. sQry3 = " FROM ( \r\n";
  877. int nBinds = 0;
  878. int nColCnt = CbStatCfg->Items->Count;
  879. for (ii = 0; ii < nColCnt; ii++)
  880. {
  881. TObjStat *pObj = (TObjStat *)GetStatObject(CbStatCfg, ii);
  882. if (NULL == pObj) continue;
  883. sTmp = "";
  884. sTmp.printf(L" SELECT Y.ARTERYID, Y.ARTERYNAME, Y.DIRECTION, Y.ARTERYLEN, X.TRFTYPE, \r\n"
  885. " Y.LINKID, Y.LINKLEN, X.STATMON, X.SPD, X.TRVTM \r\n"
  886. " FROM (SELECT /*+ INDEX(A %s) */ \r\n"
  887. " '%s' AS TRFTYPE, \r\n"
  888. " A.LINKID, A.STATMON, A.AVGSPD AS SPD, A.AVGTRVTM AS TRVTM \r\n"
  889. " FROM %s A \r\n"
  890. " WHERE A.STATYEAR = :f%d) X, \r\n"
  891. " (SELECT A.ARTERYID, B.ARTERYNAME, A.DIRECTION, B.ARTERYTYPE, \r\n"
  892. " DECODE(A.DIRECTION, '0', B.UPLENGTH, B.DNLENGTH) AS ARTERYLEN, \r\n"
  893. " C.LENGTH AS LINKLEN, C.LINKID, A.LINKSEQ \r\n"
  894. " FROM TB_MP_ARTERY_LINK A, TB_MS_ARTERY B, TB_MS_LINK C \r\n"
  895. " WHERE A.LINKLEVEL = :l%d \r\n"
  896. " AND A.ARTERYID = B.ARTERYID \r\n"
  897. " AND B.IMPYN = 'Y' \r\n"
  898. " AND A.LINKID = C.LINKID) Y \r\n"
  899. " WHERE Y.LINKID = X.LINKID \r\n",
  900. pObj->m_sIdx[enStatMon].c_str(),
  901. pObj->m_sStatDesc.c_str(),
  902. pObj->m_sTbl[enStatMon].c_str(),
  903. nBinds,
  904. nBinds);
  905. sQry3 += sTmp;
  906. if (ii != (nColCnt-1))
  907. {
  908. TObjStat *pObj = (TObjStat *)GetStatObject(CbStatCfg, ii+1);
  909. if (NULL != pObj)
  910. {
  911. sQry3 += " UNION ALL \r\n";
  912. }
  913. }
  914. nBinds++;
  915. }
  916. String sQry4 = "";
  917. sQry4 = " ) \r\n"
  918. " GROUP BY ROLLUP (ARTERYID, DIRECTION, TRFTYPE) \r\n"
  919. " HAVING GROUPING(TRFTYPE) = 0) LX, \r\n"
  920. " (SELECT ARTERYID, DIRECTION, DIRECTIONNAME, \r\n"
  921. " ARTERYNAME, ARTERYLENGTH, ARTERYTYPE \r\n"
  922. " FROM VW_MS_ARTERY ) LY \r\n"
  923. " WHERE LY.ARTERYID = LX.ARTERYID(+) \r\n"
  924. " AND LY.DIRECTION = LX.DIRECTION(+) \r\n"
  925. " ORDER BY LY.ARTERYNAME, LY.DIRECTION, LX.TRFTYPE \r\n";
  926. sQry = sQry1 + sQry2 + sQry3 + sQry4;
  927. try
  928. {
  929. ITSDb_SQLText(ADOY, sQry);
  930. for (ii = 0; ii < nBinds; ii++)
  931. {
  932. sTmp = "";
  933. sTmp.printf(L"f%d", ii);
  934. ITSDb_SQLBind(ADOY, sTmp, sYYYY);
  935. sTmp = "";
  936. sTmp.printf(L"l%d", ii);
  937. ITSDb_SQLBind(ADOY, sTmp, m_sLinkLevel);
  938. }
  939. ITSDb_SQLOpen(ADOY);
  940. ShowRecordCount(ADOY->RecordCount);
  941. }
  942. catch(EDatabaseError &E)
  943. {
  944. throw Exception(String(E.ClassName()) + E.Message);
  945. }
  946. catch (Exception &exception)
  947. {
  948. throw Exception(String(exception.ClassName()) + exception.Message);
  949. }
  950. #endif
  951. }
  952. //---------------------------------------------------------------------------
  953. /*
  954. * 조회결과 데이터 건수 표출
  955. * arguments
  956. *
  957. * return
  958. * void
  959. */
  960. void __fastcall TTAS0020M::ShowRecordCount(int nRecCnt)
  961. {
  962. //
  963. }
  964. //---------------------------------------------------------------------------
  965. /*
  966. * Summary Footer style set
  967. * arguments
  968. *
  969. * return
  970. * void
  971. */
  972. void __fastcall TTAS0020M::TvListDataControllerSummaryFooterSummaryItemsSummary(TcxDataSummaryItems *ASender, TcxSummaryEventArguments &Arguments,
  973. TcxSummaryEventOutArguments &OutArguments)
  974. {
  975. CMM_SetSummaryItemKind(Arguments, OutArguments, 2, false, false);
  976. }
  977. //---------------------------------------------------------------------------
  978. /*
  979. * Summary Footer style set
  980. * arguments
  981. *
  982. * return
  983. * void
  984. */
  985. void __fastcall TTAS0020M::TvListDataControllerSummaryDefaultGroupSummaryItemsSummary(TcxDataSummaryItems *ASender, TcxSummaryEventArguments &Arguments,
  986. TcxSummaryEventOutArguments &OutArguments)
  987. {
  988. CMM_SetSummaryItemKind(Arguments, OutArguments, 1, false, false);
  989. }
  990. //---------------------------------------------------------------------------
  991. /*
  992. * Close 버튼 클릭 이벤트 핸들러
  993. * arguments
  994. * Sender : event handler 객체
  995. * return
  996. * void
  997. */
  998. void __fastcall TTAS0020M::BtnCloseClick(TObject *Sender)
  999. {
  1000. Close();
  1001. }
  1002. //---------------------------------------------------------------------------
  1003. void __fastcall TTAS0020M::vDayColumnCustomDrawCell(TcxCustomGridTableView *Sender, TcxCanvas *ACanvas, TcxGridTableDataCellViewInfo *AViewInfo,
  1004. bool &ADone)
  1005. {
  1006. TColor tColor = ACanvas->Brush->Color;
  1007. try
  1008. {
  1009. if (!VarIsNull(AViewInfo->Value))
  1010. {
  1011. String sSpd = AViewInfo->Value;
  1012. if (sSpd == NULL || sSpd.IsEmpty() || sSpd == "0" || sSpd == "-")
  1013. {
  1014. tColor = clFuchsia;
  1015. }
  1016. }
  1017. else
  1018. {
  1019. tColor = clFuchsia;
  1020. }
  1021. ACanvas->Font->Color = clBlack;
  1022. ACanvas->SetBrushColor(tColor);
  1023. }
  1024. catch(...)
  1025. {
  1026. }
  1027. }
  1028. //---------------------------------------------------------------------------
  1029. void __fastcall TTAS0020M::FormClose(TObject *Sender, TCloseAction &Action)
  1030. {
  1031. CommClose();
  1032. TAS0020M = NULL;
  1033. Action = caFree;
  1034. }
  1035. //---------------------------------------------------------------------------