fbd9e07443838bd06eb711238ed2b9a84346ff23.svn-base 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading;
  6. using System.Collections;
  7. using System.Data;
  8. using System.Drawing;
  9. namespace IControls_FireManager
  10. {
  11. // 엑티브 레포트 관련 작업량을 알아내고, 실제로 엑티브 레포트 관련 작업을 하는 함수를 모아둔다
  12. // 향후 레포트 관련 작업양이 많아짐에따라 소스 관리가 힘들어질수 있으므로 관련 함수만 정리하기 좋도록 하는데 목적이 있음
  13. public static class _ActiveReport
  14. {
  15. //
  16. // 헤더와 디테일의 정보를 동적으로 생성한다
  17. //
  18. public static void Create_Column(
  19. DataDynamics.ActiveReports.ActiveReport pActiveReport,
  20. DataDynamics.ActiveReports.PageHeader pPageHeader, // 페이제 헤더
  21. DataDynamics.ActiveReports.Detail pDetail, // 디테일
  22. ArrayList Column_Info, // 컬럼 텍스트명 및 길이 예)빌딩명=0.32;층명=0.5
  23. float ColumnHeight, // 컬럼 높이
  24. int FontSize) // 폰트 사이즈
  25. {
  26. // 반드시 정확한 데이타가 들어와야만 한다
  27. if (Column_Info.Count == 0) return;
  28. // 아이템 추가시 Left 속성은 계속 증가하도록 구성
  29. float left = 0;
  30. // 아이템을 추가하자 (단, 현재 페이지의 프린터 출력 가로 사이즈를 침범하지 못하도록 만들어야 한다)
  31. for (int i = 0; i < Column_Info.Count; i++)
  32. {
  33. //
  34. // 페이지 헤더
  35. //
  36. // 텍스트 박스 생성
  37. DataDynamics.ActiveReports.TextBox PageHeader_TextBox = new DataDynamics.ActiveReports.TextBox();
  38. // 선 속성
  39. PageHeader_TextBox.Border.BottomStyle = DataDynamics.ActiveReports.BorderLineStyle.Solid;
  40. PageHeader_TextBox.Border.LeftStyle = DataDynamics.ActiveReports.BorderLineStyle.Solid;
  41. PageHeader_TextBox.Border.RightStyle = DataDynamics.ActiveReports.BorderLineStyle.Solid;
  42. PageHeader_TextBox.Border.TopStyle = DataDynamics.ActiveReports.BorderLineStyle.Solid;
  43. // 이름
  44. PageHeader_TextBox.Name = "PageHeader_" + ((_Report_Column_Info)Column_Info[i]).Column_Key;
  45. // 텍스트
  46. PageHeader_TextBox.Text = ((_Report_Column_Info)Column_Info[i]).Column_Name;
  47. // X 좌표
  48. PageHeader_TextBox.Left = left;
  49. // Y 좌표
  50. PageHeader_TextBox.Top = 0.88F;
  51. // 너비
  52. PageHeader_TextBox.Width = ((_Report_Column_Info)Column_Info[i]).Column_Size;
  53. // 높이
  54. PageHeader_TextBox.Height = ColumnHeight;
  55. // 스타일
  56. PageHeader_TextBox.Style =
  57. "background-color: LightGrey; color: Black; font-family: 굴림; font-size: " +
  58. FontSize.ToString() +
  59. "pt; font-" + "weight: bold; text-align: center; vertical-align: bottom; ddo-char-set: 1";
  60. // 왼쪽 좌표 증가
  61. left = left + PageHeader_TextBox.Width;
  62. // 단, 예외로 마지막 아이템이라면 프린터사이즈만큼 임의로 늘린다
  63. if (i == Column_Info.Count - 1)
  64. {
  65. PageHeader_TextBox.Width = PageHeader_TextBox.Width + (pActiveReport.PrintWidth - left);
  66. PageHeader_TextBox.Width = PageHeader_TextBox.Width - 0.001F; // margin
  67. }
  68. // 페이지 헤더에 추가
  69. pPageHeader.Controls.Add(PageHeader_TextBox);
  70. }
  71. left = 0;
  72. for (int i = 0; i < Column_Info.Count; i++)
  73. {
  74. //
  75. // 디테일
  76. //
  77. // 텍스트 박스 생성
  78. DataDynamics.ActiveReports.TextBox Detail_TextBox = new DataDynamics.ActiveReports.TextBox();
  79. // 선 속성
  80. Detail_TextBox.Border.BottomStyle = DataDynamics.ActiveReports.BorderLineStyle.Solid;
  81. Detail_TextBox.Border.LeftStyle = DataDynamics.ActiveReports.BorderLineStyle.Solid;
  82. Detail_TextBox.Border.RightStyle = DataDynamics.ActiveReports.BorderLineStyle.Solid;
  83. Detail_TextBox.Border.TopStyle = DataDynamics.ActiveReports.BorderLineStyle.Solid;
  84. // 이름
  85. Detail_TextBox.Name = ((_Report_Column_Info)Column_Info[i]).Column_Key;
  86. // 텍스트
  87. Detail_TextBox.Text = ((_Report_Column_Info)Column_Info[i]).Column_Name;
  88. // X 좌표
  89. Detail_TextBox.Left = left;
  90. // Y 좌표
  91. Detail_TextBox.Top = 0F;
  92. // 너비
  93. Detail_TextBox.Width = ((_Report_Column_Info)Column_Info[i]).Column_Size;
  94. // 높이
  95. Detail_TextBox.Height = ColumnHeight;
  96. // 스타일
  97. Detail_TextBox.Style =
  98. "font-family: 굴림; font-size: " + FontSize.ToString() + "pt; text-align: center; vertical-align: bottom; ddo-char-set: 1";
  99. // 왼쪽 좌표 증가
  100. left = left + Detail_TextBox.Width;
  101. // 단, 예외로 마지막 아이템이라면 프린터사이즈만큼 임의로 늘린다
  102. if (i == Column_Info.Count - 1)
  103. {
  104. Detail_TextBox.Width = Detail_TextBox.Width + (pActiveReport.PrintWidth - left);
  105. Detail_TextBox.Width = Detail_TextBox.Width - 0.001F; // margin
  106. }
  107. // 데이타 필드
  108. Detail_TextBox.DataField = Detail_TextBox.Name;
  109. // 데이타 필드 추가
  110. pActiveReport.Fields.Add(Detail_TextBox.Name);
  111. // 페이지 헤더에 추가
  112. pDetail.Controls.Add(Detail_TextBox);
  113. }
  114. }
  115. //
  116. // 레포트 출력시에 예외처리 (보통 데이타베이스에서 자료를 가져와서 곧바로 레포트로 만드는 경우 DataRow 개체를 사용하게된다. 이때 필요없는 데이타가 존재함)
  117. //
  118. public static bool Exception_ReportPrint(DataDynamics.ActiveReports.ActiveReport pActiveReport, string Key, int RowCounter, DataRow Result_Info)
  119. {
  120. bool result = true;
  121. // 단, 인덱스 넘버라면
  122. if (Key == "INDEX_NUMBER")
  123. {
  124. pActiveReport.Fields[Key].Value = (RowCounter + 1).ToString();
  125. }
  126. // 나머지는 예외가 아니다!
  127. else
  128. result = false;
  129. return result;
  130. }
  131. //
  132. // 기본 디폴트 컬럼 인쇄부 어레이리스트 생성 (가변 레포트에서만 사용됨)
  133. //
  134. public static void Print_Default_Column(ArrayList Save_Arraylist, string Column_Key, string Column_Name, float Column_Size)
  135. {
  136. _Report_Column_Info data = new _Report_Column_Info();
  137. data.Column_Key = Column_Key;
  138. data.Column_Name = Column_Name;
  139. data.Column_Size = Column_Size;
  140. Save_Arraylist.Add(data);
  141. }
  142. //
  143. // 데이타 총개수
  144. //
  145. public static int Get_All_ProcessCount(object Data)
  146. {
  147. int result = 0;
  148. if (Data != null)
  149. {
  150. if (Data.GetType() == typeof(DataRowCollection))
  151. result = ((DataRowCollection)Data).Count;
  152. else if (Data.GetType() == typeof(ArrayList))
  153. result = ((ArrayList)Data).Count;
  154. }
  155. return result;
  156. }
  157. //
  158. // 레포트 생성자
  159. //
  160. // 레포트를 생성하기 위해 먼저 컬럼명을 생성하는 가변 레포트인지, 아니면 정형화된 고정 레포트인지 살펴봐야한다
  161. //
  162. // 가변레포트의 경우 컬럼명이 존재하지 않아서 직접 생성시켜주어야 한다, 즉 상위의 Create_Column 함수가 레포트 포맷에 존재한다
  163. // 대표적인 가변레포트 포맷은 ActiveReport_Variable_Height, ActiveReport_Variable_Width 이다
  164. // 장점은 데이타를 컬럼명에 맞게 출력할수 있어 레포트의 포맷을 다양하게 구성할수가 있다
  165. // 단점은 그룹헤더가 하나뿐인 단순한 도표수준의 레포트만 출력가능하다
  166. // 고정레포트의 경우 컬럼명을 실제 존재하여 직접 생성시키면안된다. 대신 레포트 폼에서 만든 TextBox 의 DataField 이름을 알고 있어야한다
  167. // 대표적인 고정레포트 포맷은 ActiveReport_Location_ACU 이다
  168. // 장점은 그룹헤더가 여러개로 구성가능하며, 이미지 및 각종 양식에 자유롭게 사용자가 구성할 수 있다
  169. // 단점은 각 DataField 를 직접 레포트 디자이너에서 일일이 확인해주어야 하며, 그룹헤더가 여러개라면 구성이 복잡해진다
  170. // 아래는 고정레포트의 생성부만 취합하였음
  171. // 연동 그룹 레포트
  172. public static void Create_ReportViewer_OperGroup(string Receiver_Id)
  173. {
  174. // 레포트 폼생성
  175. if (_Data.ActiveReportViewer_Enable == false)
  176. {
  177. // 컬럼키값
  178. _Report_OperGroup dummy = new _Report_OperGroup();
  179. ArrayList Column_Info = _Reflection.GetMemberName_ToArrayList(dummy);
  180. // 레포트 특정 클래스 데이타 집합
  181. ArrayList Report_Data = new ArrayList();
  182. //
  183. // 데이타베이스 접근 경로 지정부
  184. //
  185. _Data.DataBaseFilePath_Set(null);//Receiver_Id);
  186. //
  187. // 레포트용 데이타 생성부
  188. // 현재 쿼리가 많아지는 루틴이다. 그룹별 쿼리를 날리게 되어 효율적이지 못하지만
  189. // 그룹헤더 정보가 고유하게 셋팅되어 리스트에 저장되어야 하므로 아래와 같이 작업합니다
  190. // 만약 레포트 출력에 속도가 문제가 발생된다면..
  191. // 쿼리를 하나만 날리고 저장된 리스트를 각각 모두 추출해서 고유한 그룹만 선별해서 별도로 그룹 헤더 코드를 생성해야 합니다.
  192. //
  193. //** TB_GROUP 테이블에서 출력그룹을 모두 가지고 온다
  194. DataRowCollection DB_TABLE_GROUP = _Db.ExecuteRead_SqlDataAdapter(_Sql.SearchAll_Table_Value("TB_GROUP", "GROUP_ID", Receiver_Id));
  195. int Group_Header_No = 0;
  196. if (DB_TABLE_GROUP != null && DB_TABLE_GROUP.Count != 0)
  197. {
  198. foreach (DataRow GROUP in DB_TABLE_GROUP)
  199. {
  200. //** TB_GROUP_DEVICE 테이블에서 해당그룹을 모두 가지고 보여준다
  201. DataRowCollection DB_TABLE_DETAIL = _Db.ExecuteRead_SqlDataAdapter(_Sql.Search_Gruop_DeviceTable(GROUP[1].ToString(), Receiver_Id));
  202. int Group_No = 0;
  203. if (DB_TABLE_DETAIL != null && DB_TABLE_DETAIL.Count != 0)
  204. {
  205. // 그룹별 고유 코드
  206. Group_Header_No++;
  207. foreach (DataRow DETAIL in DB_TABLE_DETAIL)
  208. {
  209. // 내용별 순번
  210. Group_No++;
  211. if (_Convert.Exception_Into_object(DETAIL[6], DETAIL[7], DETAIL[8], DETAIL[9], DETAIL[10]) == true)
  212. {
  213. // 회로번호 추출
  214. // 매개변수 순서 => COMM_ID, BOARD_ID, LOOP_NO, REPEATER_ID, DEVICE_ID, INOUT_TYPE
  215. MskDeviceIDString dev_s = new MskDeviceIDString(
  216. _Convert.Null_to_IntZero(DETAIL[6].ToString()),
  217. _Convert.Null_to_IntZero(DETAIL[7].ToString()),
  218. _Convert.Null_to_IntZero(DETAIL[8].ToString()),
  219. _Convert.Null_to_IntZero(DETAIL[9].ToString()),
  220. _Convert.Null_to_IntZero(DETAIL[10].ToString()),
  221. DETAIL[11].ToString(), Receiver_Id); // cyim 2016.12.05 : 수신기 모델별 내부 로직 변경
  222. // 레포트 출력용 클래스 생성
  223. _Report_OperGroup Report_OperGroup = new _Report_OperGroup();
  224. // 그룹별로 고유 코드 (중복이 안된다고 가정한다)
  225. Report_OperGroup.Group_Header = Group_Header_No.ToString();
  226. // 그룹 순번
  227. Report_OperGroup.Group_No = Group_Header_No;
  228. // 그룹 아이디
  229. Report_OperGroup.Group_ID = GROUP[1].ToString();
  230. // 그룹 이름
  231. Report_OperGroup.Group_Name = GROUP[2].ToString();
  232. // 내용 순번
  233. Report_OperGroup.Detail_No = Group_No;
  234. // 내용 회로번호
  235. Report_OperGroup.Detail_Circuit = dev_s.MskId;
  236. // 내용 회로타입
  237. Report_OperGroup.Detail_Type = DETAIL[0].ToString();
  238. // 내용 회로위치
  239. Report_OperGroup.Detail_Location = DETAIL[1].ToString();
  240. // 내용 회로이름
  241. Report_OperGroup.Detail_Name = DETAIL[2].ToString();
  242. // 레포트 출력용 데이타 (세부내용을 포함)
  243. Report_Data.Add(Report_OperGroup);
  244. }
  245. }
  246. }
  247. // 세부 내용이 없어도 일단 추가 (차후에 필요없으면 삭제)
  248. else
  249. {
  250. // 그룹별 고유 코드
  251. Group_Header_No++;
  252. // 레포트 출력용 클래스 생성
  253. _Report_OperGroup Report_OperGroup = new _Report_OperGroup();
  254. // 그룹별로 고유 코드 (중복이 안된다고 가정한다)
  255. Report_OperGroup.Group_Header = Group_Header_No.ToString();
  256. // 그룹 순번
  257. Report_OperGroup.Group_No = Group_Header_No;
  258. // 그룹 아이디
  259. Report_OperGroup.Group_ID = GROUP[1].ToString();
  260. // 그룹 이름
  261. Report_OperGroup.Group_Name = GROUP[2].ToString();
  262. // 내용 순번
  263. Report_OperGroup.Detail_No = Group_No;
  264. // 내용 회로번호
  265. Report_OperGroup.Detail_Circuit = _Text.Minus;
  266. // 내용 회로타입
  267. Report_OperGroup.Detail_Type = _Text.Minus;
  268. // 내용 회로위치
  269. Report_OperGroup.Detail_Location = _Text.Minus;
  270. // 내용 회로이름
  271. Report_OperGroup.Detail_Name = _Text.Minus;
  272. // 레포트 출력용 데이타
  273. Report_Data.Add(Report_OperGroup);
  274. }
  275. Group_No = 0;
  276. }
  277. }
  278. // 개요
  279. int All_Group_Cnt = 0;
  280. if (DB_TABLE_GROUP != null) All_Group_Cnt = DB_TABLE_GROUP.Count;
  281. // 레포트뷰어에 정보를 전달
  282. Form_ActiveReport_Viewer Report = new Form_ActiveReport_Viewer(
  283. ACTIVE_REPORT_DATA.OPER_GROUP,
  284. Report_Data,
  285. Column_Info,
  286. "연동 그룹 보고서",
  287. string.Format("프로젝트명 [{0}] 수신기ID [{1}] 그룹개수 [{2}]", _Data.Project_Name, Receiver_Id, All_Group_Cnt.ToString()),
  288. 0.21F,
  289. 9);
  290. // 출력
  291. _Form.Create(Report, null);
  292. }
  293. else
  294. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 350, 150, _Text.UsingReportViewer, 0);
  295. }
  296. // 연동 설정 레포트
  297. public static void Create_ReportViewer_OperSet(string Receiver_Id)
  298. {
  299. // 레포트 폼생성
  300. if (_Data.ActiveReportViewer_Enable == false)
  301. {
  302. // 컬럼키값
  303. _Report_Operset dummy = new _Report_Operset();
  304. ArrayList Column_Info = _Reflection.GetMemberName_ToArrayList(dummy);
  305. // 레포트 특정 클래스 데이타 집합
  306. ArrayList Report_Data = new ArrayList();
  307. //
  308. // 데이타베이스 접근 경로 지정부
  309. //
  310. _Data.DataBaseFilePath_Set(null);//Receiver_Id);
  311. //
  312. // 레포트용 데이타 생성부
  313. // 현재 쿼리가 많아지는 루틴이다. 그룹별 쿼리를 날리게 되어 효율적이지 못하지만
  314. // 그룹헤더 정보가 고유하게 셋팅되어 리스트에 저장되어야 하므로 아래와 같이 작업합니다
  315. // 만약 레포트 출력에 속도가 문제가 발생된다면..
  316. // 쿼리를 하나만 날리고 저장된 리스트를 각각 모두 추출해서 고유한 그룹만 선별해서 별도로 그룹 헤더 코드를 생성해야 합니다.
  317. //
  318. //** TB_MAP 테이블에서 맵명을 모두 가지고 온다
  319. DataRowCollection DB_TABLE_MAP = _Db.ExecuteRead_SqlDataAdapter(_Sql.SearchAll_Table_Value("TB_MAP", "MAP_ID", Receiver_Id));
  320. int Group_Header_No = 0;
  321. if (DB_TABLE_MAP != null && DB_TABLE_MAP.Count != 0)
  322. {
  323. foreach (DataRow MAP in DB_TABLE_MAP)
  324. {
  325. // 그룹별 고유 코드
  326. Group_Header_No++;
  327. //
  328. // 입력이든 출력이든 일단 하나라도 있는지 확인하자
  329. //
  330. // 입력
  331. DataRowCollection DB_TABLE_MAP_IN = _Db.ExecuteRead_SqlDataAdapter(_Sql.Search_Map_ProcessTable(MAP[1].ToString(), "I", Receiver_Id));
  332. // 출력 - 회로
  333. DataRowCollection DB_TB_MAP_OUT = _Db.ExecuteRead_SqlDataAdapter(_Sql.Search_Map_ProcessTable(MAP[1].ToString(), "O", "D", Receiver_Id));
  334. // 출력 - 그룹
  335. DataRowCollection DB_MAP_OUT_GROUP = _Db.ExecuteRead_SqlDataAdapter(_Sql.Search_Map_ProcessTable(MAP[1].ToString(), "O", "G", Receiver_Id));
  336. // 디바이스가 없을 경우
  337. if (DB_TABLE_MAP_IN.Count == 0 && DB_TB_MAP_OUT.Count == 0 && DB_MAP_OUT_GROUP.Count == 0)
  338. {
  339. // 레포트 출력용 클래스 생성
  340. _Report_Operset Report_Operset = new _Report_Operset();
  341. // 그룹별로 고유 코드 (중복이 안된다고 가정한다)
  342. Report_Operset.Group_Header = Group_Header_No.ToString();
  343. // 그룹 순번
  344. Report_Operset.Group_No = Group_Header_No;
  345. // 그룹 아이디
  346. Report_Operset.Group_ID = MAP[2].ToString();
  347. // 그룹 이름
  348. Report_Operset.Group_Name = MAP[3].ToString();
  349. // 서브 그룹별 코드
  350. Report_Operset.Group_Header_Sub = _Text.Minus;
  351. // 내용 IO
  352. Report_Operset.Detail_IO = _Text.Minus;
  353. // 수신기 ID
  354. Report_Operset.Detail_Receiver = _Text.Minus;
  355. // 내용 아이디
  356. Report_Operset.Detail_ID = _Text.Minus;
  357. // 내용 타입
  358. Report_Operset.Detail_Type = _Text.Minus;
  359. // 내용 위치
  360. Report_Operset.Detail_Location = _Text.Minus;
  361. // 내용 이름
  362. Report_Operset.Detail_Name = _Text.Minus;
  363. // 레포트 출력용 데이타 (세부내용을 포함)
  364. Report_Data.Add(Report_Operset);
  365. }
  366. //
  367. // 입력
  368. //
  369. int Group_Header_Sub_No = 0;
  370. bool Group_Header_Sub_No_Enable = false; // 출력중에는 디바이스 및 그룹이 구분되어서 나오게 되므로 하나로 그룹을 통합하기 위한 변수
  371. if (DB_TABLE_MAP_IN != null && DB_TABLE_MAP_IN.Count != 0)
  372. {
  373. Group_Header_Sub_No++;
  374. foreach (DataRow DETAIL in DB_TABLE_MAP_IN)
  375. {
  376. if (_Convert.Exception_Into_object(DETAIL[7], DETAIL[8], DETAIL[9], DETAIL[10], DETAIL[11]) == true)
  377. {
  378. // 매개변수 순서 => COMM_ID, BOARD_ID, LOOP_NO, REPEATER_ID, DEVICE_ID, INOUT_TYPE
  379. MskDeviceIDString dev_s = new MskDeviceIDString(
  380. _Convert.Null_to_IntZero(DETAIL[7].ToString()),
  381. _Convert.Null_to_IntZero(DETAIL[8].ToString()),
  382. _Convert.Null_to_IntZero(DETAIL[9].ToString()),
  383. _Convert.Null_to_IntZero(DETAIL[10].ToString()),
  384. _Convert.Null_to_IntZero(DETAIL[11].ToString()),
  385. DETAIL[12].ToString(), DETAIL[6].ToString()); // cyim 2016.12.05 : 수신기 모델별 내부 로직 변경
  386. // 레포트 출력용 클래스 생성
  387. _Report_Operset Report_Operset = new _Report_Operset();
  388. // 그룹별로 고유 코드 (중복이 안된다고 가정한다)
  389. Report_Operset.Group_Header = Group_Header_No.ToString();
  390. // 그룹 순번
  391. Report_Operset.Group_No = Group_Header_No;
  392. // 그룹 아이디
  393. Report_Operset.Group_ID = MAP[2].ToString();
  394. // 그룹 이름
  395. Report_Operset.Group_Name = MAP[3].ToString();
  396. // 서브 그룹별 코드
  397. Report_Operset.Group_Header_Sub = Group_Header_Sub_No.ToString();
  398. // 내용 IO
  399. Report_Operset.Detail_IO = "입력";
  400. // 수신기 ID
  401. Report_Operset.Detail_Receiver = DETAIL[6].ToString();
  402. // 내용 아이디
  403. Report_Operset.Detail_ID = dev_s.MskId;
  404. // 내용 타입
  405. Report_Operset.Detail_Type = DETAIL[0].ToString();
  406. // 내용 위치
  407. Report_Operset.Detail_Location = DETAIL[1].ToString();
  408. // 내용 이름
  409. Report_Operset.Detail_Name = DETAIL[2].ToString();
  410. // 레포트 출력용 데이타 (세부내용을 포함)
  411. Report_Data.Add(Report_Operset);
  412. }
  413. }
  414. }
  415. //
  416. // 출력 (디바이스)
  417. //
  418. if (DB_TB_MAP_OUT != null && DB_TB_MAP_OUT.Count != 0)
  419. {
  420. // 그룹별 고유 코드
  421. //Group_Header_No++;
  422. if (Group_Header_Sub_No == 1)
  423. {
  424. Group_Header_Sub_No++; // 출력 디바이스 만 있는 경우
  425. Group_Header_Sub_No_Enable = true;
  426. }
  427. else
  428. Group_Header_Sub_No++;
  429. foreach (DataRow DETAIL in DB_TB_MAP_OUT)
  430. {
  431. if (_Convert.Exception_Into_object(DETAIL[7], DETAIL[8], DETAIL[9], DETAIL[10], DETAIL[11]) == true)
  432. {
  433. // 매개변수 순서 => COMM_ID, BOARD_ID, LOOP_NO, REPEATER_ID, DEVICE_ID, INOUT_TYPE
  434. MskDeviceIDString dev_s = new MskDeviceIDString(
  435. _Convert.Null_to_IntZero(DETAIL[7].ToString()),
  436. _Convert.Null_to_IntZero(DETAIL[8].ToString()),
  437. _Convert.Null_to_IntZero(DETAIL[9].ToString()),
  438. _Convert.Null_to_IntZero(DETAIL[10].ToString()),
  439. _Convert.Null_to_IntZero(DETAIL[11].ToString()),
  440. DETAIL[12].ToString(), DETAIL[6].ToString()); // cyim 2016.12.05 : 수신기 모델별 내부 로직 변경
  441. // 레포트 출력용 클래스 생성
  442. _Report_Operset Report_Operset = new _Report_Operset();
  443. // 그룹별로 고유 코드 (중복이 안된다고 가정한다)
  444. Report_Operset.Group_Header = Group_Header_No.ToString();
  445. // 그룹 순번
  446. Report_Operset.Group_No = Group_Header_No;
  447. // 그룹 아이디
  448. Report_Operset.Group_ID = MAP[2].ToString();
  449. // 그룹 이름
  450. Report_Operset.Group_Name = MAP[3].ToString();
  451. // 서브 그룹별 코드
  452. Report_Operset.Group_Header_Sub = Group_Header_Sub_No.ToString();
  453. // 내용 IO
  454. Report_Operset.Detail_IO = "출력";
  455. // 수신기 ID
  456. Report_Operset.Detail_Receiver = DETAIL[6].ToString();
  457. // 내용 아이디
  458. Report_Operset.Detail_ID = dev_s.MskId;
  459. // 내용 타입
  460. Report_Operset.Detail_Type = DETAIL[0].ToString();
  461. // 내용 위치
  462. Report_Operset.Detail_Location = DETAIL[1].ToString();
  463. // 내용 이름
  464. Report_Operset.Detail_Name = DETAIL[2].ToString();
  465. // 레포트 출력용 데이타 (세부내용을 포함)
  466. Report_Data.Add(Report_Operset);
  467. }
  468. }
  469. }
  470. //
  471. // 출력 (그룹)
  472. //
  473. if (DB_MAP_OUT_GROUP != null && DB_MAP_OUT_GROUP.Count != 0)
  474. {
  475. // 그룹별 고유 코드
  476. //Group_Header_No++;
  477. if (Group_Header_Sub_No_Enable == false)
  478. Group_Header_Sub_No++;
  479. foreach (DataRow DETAIL in DB_MAP_OUT_GROUP)
  480. {
  481. // TB_GROUP 테이블에 접근
  482. DataRowCollection DB_TABLE_TB_DEVICE_TYPE = _Db.ExecuteRead_SqlDataAdapter(_Sql.SearchAll_Table_Value("TB_GROUP", "GROUP_ID", DETAIL[5].ToString(), null)); // 맵연동 설정에서 확인하는 출력그룹은 오로지 그룹아이디로만 판단
  483. if (DB_TABLE_TB_DEVICE_TYPE != null && DB_TABLE_TB_DEVICE_TYPE.Count != 0)
  484. {
  485. foreach (DataRow Dr in DB_TABLE_TB_DEVICE_TYPE)
  486. {
  487. // 레포트 출력용 클래스 생성
  488. _Report_Operset Report_Operset = new _Report_Operset();
  489. // 그룹별로 고유 코드 (중복이 안된다고 가정한다)
  490. Report_Operset.Group_Header = Group_Header_No.ToString();
  491. // 그룹 순번
  492. Report_Operset.Group_No = Group_Header_No;
  493. // 그룹 아이디
  494. Report_Operset.Group_ID = MAP[2].ToString();
  495. // 그룹 이름
  496. Report_Operset.Group_Name = MAP[3].ToString();
  497. // 서브 그룹별 코드
  498. Report_Operset.Group_Header_Sub = Group_Header_Sub_No.ToString();
  499. // 내용 IO
  500. Report_Operset.Detail_IO = "출력";
  501. // 수신기 ID
  502. Report_Operset.Detail_Receiver = Dr[0].ToString();
  503. // 내용 아이디
  504. Report_Operset.Detail_ID = DETAIL[5].ToString();
  505. // 내용 타입
  506. Report_Operset.Detail_Type = null;
  507. // 내용 위치
  508. Report_Operset.Detail_Location = null;
  509. // 내용 이름
  510. Report_Operset.Detail_Name = Dr[2].ToString();
  511. // 레포트 출력용 데이타 (세부내용을 포함)
  512. Report_Data.Add(Report_Operset);
  513. }
  514. }
  515. }
  516. }
  517. }
  518. }
  519. // 개요
  520. int All_Group_Cnt = 0;
  521. if (DB_TABLE_MAP != null) All_Group_Cnt = DB_TABLE_MAP.Count;
  522. // 레포트뷰어에 정보를 전달
  523. Form_ActiveReport_Viewer Report = new Form_ActiveReport_Viewer(
  524. ACTIVE_REPORT_DATA.OPER_SET,
  525. Report_Data,
  526. Column_Info,
  527. "연동 설정 보고서",
  528. string.Format("프로젝트명 [{0}] 수신기ID [{1}] 맵 개수 [{2}]", _Data.Project_Name, Receiver_Id, All_Group_Cnt.ToString()),
  529. 0.21F,
  530. 9);
  531. // 출력
  532. _Form.Create(Report, null);
  533. }
  534. else
  535. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 350, 150, _Text.UsingReportViewer, 0);
  536. }
  537. // 화면 설정 레포트
  538. public static void Create_ReportViewer_Page(string RECEIVER_ID)
  539. {
  540. // 레포트 폼생성
  541. if (_Data.ActiveReportViewer_Enable == false)
  542. {
  543. // 컬럼키값
  544. _Report_Page dummy = new _Report_Page();
  545. ArrayList Column_Info = _Reflection.GetMemberName_ToArrayList(dummy);
  546. // 레포트 특정 클래스 데이타 집합
  547. ArrayList Report_Data = new ArrayList();
  548. //
  549. // 해쉬테이블을 이용해서 페이지 정보 추출
  550. //
  551. // 페이지당 현재 설정된 이름을 전부 가져온다
  552. foreach (string PAGE_ID in ((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).LIST_PAGE_ID)
  553. {
  554. if (((_Page)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).HASH_PAGE[PAGE_ID]).Receiver_ID == RECEIVER_ID)
  555. {
  556. // 아이콘 명
  557. ArrayList NewColumnHeader = new ArrayList();
  558. // 아이콘 개수
  559. int Button_Icon_Count = 0;
  560. int Device_Icon_Count = 0;
  561. foreach (string ICON_ID in ((_Page)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).HASH_PAGE[PAGE_ID]).LIST_ICON_ID)
  562. {
  563. // 현재 설정된 아이콘의 이름을 모두 가져온다
  564. string TempDeviceIconName = ((_PictureBoxItem)((_Page)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).HASH_PAGE[PAGE_ID]).HASH_ICON[ICON_ID]).Device_DB_Name;
  565. // 중복 배제 및 공백 제거 (널값 허용안함)
  566. if (NewColumnHeader.Contains(TempDeviceIconName) == false && TempDeviceIconName != null && TempDeviceIconName.Length != 0)
  567. {
  568. NewColumnHeader.Add(TempDeviceIconName);
  569. }
  570. if (((_PictureBoxItem)((_Page)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).HASH_PAGE[PAGE_ID]).HASH_ICON[ICON_ID]).ItemType == Item_Type.Button)
  571. Button_Icon_Count++;
  572. else if (((_PictureBoxItem)((_Page)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).HASH_PAGE[PAGE_ID]).HASH_ICON[ICON_ID]).ItemType == Item_Type.Device)
  573. Device_Icon_Count++;
  574. }
  575. // etc
  576. string Etc = null;
  577. for (int i = 0 ; i < NewColumnHeader.Count; i++)
  578. {
  579. Etc = Etc + NewColumnHeader[i].ToString() + ":" + Get_Count_By_Device_Icon_Name(RECEIVER_ID, PAGE_ID, NewColumnHeader[i].ToString()) + " , ";
  580. }
  581. if (Etc == null) Etc = " ※ Not Setted Device Icon";
  582. else
  583. {
  584. Etc = Etc.Trim();
  585. Etc = Etc.TrimEnd(',');
  586. Etc = " ※ 참고 : " + Etc;
  587. }
  588. // 레포트 출력용 클래스 생성
  589. _Report_Page Report_Page = new _Report_Page();
  590. Report_Page.Group_Header = PAGE_ID;
  591. Report_Page.Group_No = ((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).LIST_PAGE_ID.IndexOf(PAGE_ID);
  592. Report_Page.Group_Name = ((_Page)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).HASH_PAGE[PAGE_ID]).NodeText;
  593. Report_Page.Group_Cnt = string.Format(" Device_Icon : {0} , Button Icon : {1}", Device_Icon_Count, Button_Icon_Count);
  594. Report_Page.Group_Etc = Etc;
  595. //Report_Page.Detail_Image = Image.FromFile(((_Page)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).HASH_PAGE[PAGE_ID]).PictureBoxItem_BackGround.FullPath_FileName);
  596. Report_Page.Detail_Image = ((_Page)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).HASH_PAGE[PAGE_ID]).Capure_Image_Page;
  597. // 레포트 출력용 데이타 (세부내용을 포함)
  598. Report_Data.Add(Report_Page);
  599. }
  600. }
  601. // 레포트뷰어에 정보를 전달
  602. Form_ActiveReport_Viewer Report = new Form_ActiveReport_Viewer(
  603. ACTIVE_REPORT_DATA.PAGE,
  604. Report_Data,
  605. Column_Info,
  606. "페이지 설정 보고서",
  607. string.Format("프로젝트명 [{0}] 수신기ID [{1}] 페이지 개수 [{2}]", _Data.Project_Name, RECEIVER_ID, ((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).LIST_PAGE_ID.Count.ToString()),
  608. 0.21F,
  609. 9);
  610. // 출력
  611. _Form.Create(Report, null);
  612. }
  613. else
  614. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 350, 150, _Text.UsingReportViewer, 0);
  615. }
  616. // 해당 이름에 대한 디바이스 총개수
  617. private static int Get_Count_By_Device_Icon_Name(string RECEIVER_ID, string Page_ID, string Data)
  618. {
  619. int result = 0;
  620. foreach (string ICON_ID in ((_Page)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).HASH_PAGE[Page_ID]).LIST_ICON_ID)
  621. {
  622. if (((_PictureBoxItem)((_Page)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).HASH_PAGE[Page_ID]).HASH_ICON[ICON_ID]).Device_DB_Name == Data)
  623. result++;
  624. }
  625. return result;
  626. }
  627. }
  628. }