using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Collections; using System.Data; using System.Drawing; namespace IControls_FireManager { // 엑티브 레포트 관련 작업량을 알아내고, 실제로 엑티브 레포트 관련 작업을 하는 함수를 모아둔다 // 향후 레포트 관련 작업양이 많아짐에따라 소스 관리가 힘들어질수 있으므로 관련 함수만 정리하기 좋도록 하는데 목적이 있음 public static class _ActiveReport { // // 헤더와 디테일의 정보를 동적으로 생성한다 // public static void Create_Column( DataDynamics.ActiveReports.ActiveReport pActiveReport, DataDynamics.ActiveReports.PageHeader pPageHeader, // 페이제 헤더 DataDynamics.ActiveReports.Detail pDetail, // 디테일 ArrayList Column_Info, // 컬럼 텍스트명 및 길이 예)빌딩명=0.32;층명=0.5 float ColumnHeight, // 컬럼 높이 int FontSize) // 폰트 사이즈 { // 반드시 정확한 데이타가 들어와야만 한다 if (Column_Info.Count == 0) return; // 아이템 추가시 Left 속성은 계속 증가하도록 구성 float left = 0; // 아이템을 추가하자 (단, 현재 페이지의 프린터 출력 가로 사이즈를 침범하지 못하도록 만들어야 한다) for (int i = 0; i < Column_Info.Count; i++) { // // 페이지 헤더 // // 텍스트 박스 생성 DataDynamics.ActiveReports.TextBox PageHeader_TextBox = new DataDynamics.ActiveReports.TextBox(); // 선 속성 PageHeader_TextBox.Border.BottomStyle = DataDynamics.ActiveReports.BorderLineStyle.Solid; PageHeader_TextBox.Border.LeftStyle = DataDynamics.ActiveReports.BorderLineStyle.Solid; PageHeader_TextBox.Border.RightStyle = DataDynamics.ActiveReports.BorderLineStyle.Solid; PageHeader_TextBox.Border.TopStyle = DataDynamics.ActiveReports.BorderLineStyle.Solid; // 이름 PageHeader_TextBox.Name = "PageHeader_" + ((_Report_Column_Info)Column_Info[i]).Column_Key; // 텍스트 PageHeader_TextBox.Text = ((_Report_Column_Info)Column_Info[i]).Column_Name; // X 좌표 PageHeader_TextBox.Left = left; // Y 좌표 PageHeader_TextBox.Top = 0.88F; // 너비 PageHeader_TextBox.Width = ((_Report_Column_Info)Column_Info[i]).Column_Size; // 높이 PageHeader_TextBox.Height = ColumnHeight; // 스타일 PageHeader_TextBox.Style = "background-color: LightGrey; color: Black; font-family: 굴림; font-size: " + FontSize.ToString() + "pt; font-" + "weight: bold; text-align: center; vertical-align: bottom; ddo-char-set: 1"; // 왼쪽 좌표 증가 left = left + PageHeader_TextBox.Width; // 단, 예외로 마지막 아이템이라면 프린터사이즈만큼 임의로 늘린다 if (i == Column_Info.Count - 1) { PageHeader_TextBox.Width = PageHeader_TextBox.Width + (pActiveReport.PrintWidth - left); PageHeader_TextBox.Width = PageHeader_TextBox.Width - 0.001F; // margin } // 페이지 헤더에 추가 pPageHeader.Controls.Add(PageHeader_TextBox); } left = 0; for (int i = 0; i < Column_Info.Count; i++) { // // 디테일 // // 텍스트 박스 생성 DataDynamics.ActiveReports.TextBox Detail_TextBox = new DataDynamics.ActiveReports.TextBox(); // 선 속성 Detail_TextBox.Border.BottomStyle = DataDynamics.ActiveReports.BorderLineStyle.Solid; Detail_TextBox.Border.LeftStyle = DataDynamics.ActiveReports.BorderLineStyle.Solid; Detail_TextBox.Border.RightStyle = DataDynamics.ActiveReports.BorderLineStyle.Solid; Detail_TextBox.Border.TopStyle = DataDynamics.ActiveReports.BorderLineStyle.Solid; // 이름 Detail_TextBox.Name = ((_Report_Column_Info)Column_Info[i]).Column_Key; // 텍스트 Detail_TextBox.Text = ((_Report_Column_Info)Column_Info[i]).Column_Name; // X 좌표 Detail_TextBox.Left = left; // Y 좌표 Detail_TextBox.Top = 0F; // 너비 Detail_TextBox.Width = ((_Report_Column_Info)Column_Info[i]).Column_Size; // 높이 Detail_TextBox.Height = ColumnHeight; // 스타일 Detail_TextBox.Style = "font-family: 굴림; font-size: " + FontSize.ToString() + "pt; text-align: center; vertical-align: bottom; ddo-char-set: 1"; // 왼쪽 좌표 증가 left = left + Detail_TextBox.Width; // 단, 예외로 마지막 아이템이라면 프린터사이즈만큼 임의로 늘린다 if (i == Column_Info.Count - 1) { Detail_TextBox.Width = Detail_TextBox.Width + (pActiveReport.PrintWidth - left); Detail_TextBox.Width = Detail_TextBox.Width - 0.001F; // margin } // 데이타 필드 Detail_TextBox.DataField = Detail_TextBox.Name; // 데이타 필드 추가 pActiveReport.Fields.Add(Detail_TextBox.Name); // 페이지 헤더에 추가 pDetail.Controls.Add(Detail_TextBox); } } // // 레포트 출력시에 예외처리 (보통 데이타베이스에서 자료를 가져와서 곧바로 레포트로 만드는 경우 DataRow 개체를 사용하게된다. 이때 필요없는 데이타가 존재함) // public static bool Exception_ReportPrint(DataDynamics.ActiveReports.ActiveReport pActiveReport, string Key, int RowCounter, DataRow Result_Info) { bool result = true; // 단, 인덱스 넘버라면 if (Key == "INDEX_NUMBER") { pActiveReport.Fields[Key].Value = (RowCounter + 1).ToString(); } // 나머지는 예외가 아니다! else result = false; return result; } // // 기본 디폴트 컬럼 인쇄부 어레이리스트 생성 (가변 레포트에서만 사용됨) // public static void Print_Default_Column(ArrayList Save_Arraylist, string Column_Key, string Column_Name, float Column_Size) { _Report_Column_Info data = new _Report_Column_Info(); data.Column_Key = Column_Key; data.Column_Name = Column_Name; data.Column_Size = Column_Size; Save_Arraylist.Add(data); } // // 데이타 총개수 // public static int Get_All_ProcessCount(object Data) { int result = 0; if (Data != null) { if (Data.GetType() == typeof(DataRowCollection)) result = ((DataRowCollection)Data).Count; else if (Data.GetType() == typeof(ArrayList)) result = ((ArrayList)Data).Count; } return result; } // // 레포트 생성자 // // 레포트를 생성하기 위해 먼저 컬럼명을 생성하는 가변 레포트인지, 아니면 정형화된 고정 레포트인지 살펴봐야한다 // // 가변레포트의 경우 컬럼명이 존재하지 않아서 직접 생성시켜주어야 한다, 즉 상위의 Create_Column 함수가 레포트 포맷에 존재한다 // 대표적인 가변레포트 포맷은 ActiveReport_Variable_Height, ActiveReport_Variable_Width 이다 // 장점은 데이타를 컬럼명에 맞게 출력할수 있어 레포트의 포맷을 다양하게 구성할수가 있다 // 단점은 그룹헤더가 하나뿐인 단순한 도표수준의 레포트만 출력가능하다 // 고정레포트의 경우 컬럼명을 실제 존재하여 직접 생성시키면안된다. 대신 레포트 폼에서 만든 TextBox 의 DataField 이름을 알고 있어야한다 // 대표적인 고정레포트 포맷은 ActiveReport_Location_ACU 이다 // 장점은 그룹헤더가 여러개로 구성가능하며, 이미지 및 각종 양식에 자유롭게 사용자가 구성할 수 있다 // 단점은 각 DataField 를 직접 레포트 디자이너에서 일일이 확인해주어야 하며, 그룹헤더가 여러개라면 구성이 복잡해진다 // 아래는 고정레포트의 생성부만 취합하였음 // 연동 그룹 레포트 public static void Create_ReportViewer_OperGroup(string Receiver_Id) { // 레포트 폼생성 if (_Data.ActiveReportViewer_Enable == false) { // 컬럼키값 _Report_OperGroup dummy = new _Report_OperGroup(); ArrayList Column_Info = _Reflection.GetMemberName_ToArrayList(dummy); // 레포트 특정 클래스 데이타 집합 ArrayList Report_Data = new ArrayList(); // // 데이타베이스 접근 경로 지정부 // _Data.DataBaseFilePath_Set(null);//Receiver_Id); // // 레포트용 데이타 생성부 // 현재 쿼리가 많아지는 루틴이다. 그룹별 쿼리를 날리게 되어 효율적이지 못하지만 // 그룹헤더 정보가 고유하게 셋팅되어 리스트에 저장되어야 하므로 아래와 같이 작업합니다 // 만약 레포트 출력에 속도가 문제가 발생된다면.. // 쿼리를 하나만 날리고 저장된 리스트를 각각 모두 추출해서 고유한 그룹만 선별해서 별도로 그룹 헤더 코드를 생성해야 합니다. // //** TB_GROUP 테이블에서 출력그룹을 모두 가지고 온다 DataRowCollection DB_TABLE_GROUP = _Db.ExecuteRead_SqlDataAdapter(_Sql.SearchAll_Table_Value("TB_GROUP", "GROUP_ID", Receiver_Id)); int Group_Header_No = 0; if (DB_TABLE_GROUP != null && DB_TABLE_GROUP.Count != 0) { foreach (DataRow GROUP in DB_TABLE_GROUP) { //** TB_GROUP_DEVICE 테이블에서 해당그룹을 모두 가지고 보여준다 DataRowCollection DB_TABLE_DETAIL = _Db.ExecuteRead_SqlDataAdapter(_Sql.Search_Gruop_DeviceTable(GROUP[1].ToString(), Receiver_Id)); int Group_No = 0; if (DB_TABLE_DETAIL != null && DB_TABLE_DETAIL.Count != 0) { // 그룹별 고유 코드 Group_Header_No++; foreach (DataRow DETAIL in DB_TABLE_DETAIL) { // 내용별 순번 Group_No++; if (_Convert.Exception_Into_object(DETAIL[6], DETAIL[7], DETAIL[8], DETAIL[9], DETAIL[10]) == true) { // 회로번호 추출 // 매개변수 순서 => COMM_ID, BOARD_ID, LOOP_NO, REPEATER_ID, DEVICE_ID, INOUT_TYPE MskDeviceIDString dev_s = new MskDeviceIDString( _Convert.Null_to_IntZero(DETAIL[6].ToString()), _Convert.Null_to_IntZero(DETAIL[7].ToString()), _Convert.Null_to_IntZero(DETAIL[8].ToString()), _Convert.Null_to_IntZero(DETAIL[9].ToString()), _Convert.Null_to_IntZero(DETAIL[10].ToString()), DETAIL[11].ToString(), Receiver_Id); // cyim 2016.12.05 : 수신기 모델별 내부 로직 변경 // 레포트 출력용 클래스 생성 _Report_OperGroup Report_OperGroup = new _Report_OperGroup(); // 그룹별로 고유 코드 (중복이 안된다고 가정한다) Report_OperGroup.Group_Header = Group_Header_No.ToString(); // 그룹 순번 Report_OperGroup.Group_No = Group_Header_No; // 그룹 아이디 Report_OperGroup.Group_ID = GROUP[1].ToString(); // 그룹 이름 Report_OperGroup.Group_Name = GROUP[2].ToString(); // 내용 순번 Report_OperGroup.Detail_No = Group_No; // 내용 회로번호 Report_OperGroup.Detail_Circuit = dev_s.MskId; // 내용 회로타입 Report_OperGroup.Detail_Type = DETAIL[0].ToString(); // 내용 회로위치 Report_OperGroup.Detail_Location = DETAIL[1].ToString(); // 내용 회로이름 Report_OperGroup.Detail_Name = DETAIL[2].ToString(); // 레포트 출력용 데이타 (세부내용을 포함) Report_Data.Add(Report_OperGroup); } } } // 세부 내용이 없어도 일단 추가 (차후에 필요없으면 삭제) else { // 그룹별 고유 코드 Group_Header_No++; // 레포트 출력용 클래스 생성 _Report_OperGroup Report_OperGroup = new _Report_OperGroup(); // 그룹별로 고유 코드 (중복이 안된다고 가정한다) Report_OperGroup.Group_Header = Group_Header_No.ToString(); // 그룹 순번 Report_OperGroup.Group_No = Group_Header_No; // 그룹 아이디 Report_OperGroup.Group_ID = GROUP[1].ToString(); // 그룹 이름 Report_OperGroup.Group_Name = GROUP[2].ToString(); // 내용 순번 Report_OperGroup.Detail_No = Group_No; // 내용 회로번호 Report_OperGroup.Detail_Circuit = _Text.Minus; // 내용 회로타입 Report_OperGroup.Detail_Type = _Text.Minus; // 내용 회로위치 Report_OperGroup.Detail_Location = _Text.Minus; // 내용 회로이름 Report_OperGroup.Detail_Name = _Text.Minus; // 레포트 출력용 데이타 Report_Data.Add(Report_OperGroup); } Group_No = 0; } } // 개요 int All_Group_Cnt = 0; if (DB_TABLE_GROUP != null) All_Group_Cnt = DB_TABLE_GROUP.Count; // 레포트뷰어에 정보를 전달 Form_ActiveReport_Viewer Report = new Form_ActiveReport_Viewer( ACTIVE_REPORT_DATA.OPER_GROUP, Report_Data, Column_Info, "연동 그룹 보고서", string.Format("프로젝트명 [{0}] 수신기ID [{1}] 그룹개수 [{2}]", _Data.Project_Name, Receiver_Id, All_Group_Cnt.ToString()), 0.21F, 9); // 출력 _Form.Create(Report, null); } else _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 350, 150, _Text.UsingReportViewer, 0); } // 연동 설정 레포트 public static void Create_ReportViewer_OperSet(string Receiver_Id) { // 레포트 폼생성 if (_Data.ActiveReportViewer_Enable == false) { // 컬럼키값 _Report_Operset dummy = new _Report_Operset(); ArrayList Column_Info = _Reflection.GetMemberName_ToArrayList(dummy); // 레포트 특정 클래스 데이타 집합 ArrayList Report_Data = new ArrayList(); // // 데이타베이스 접근 경로 지정부 // _Data.DataBaseFilePath_Set(null);//Receiver_Id); // // 레포트용 데이타 생성부 // 현재 쿼리가 많아지는 루틴이다. 그룹별 쿼리를 날리게 되어 효율적이지 못하지만 // 그룹헤더 정보가 고유하게 셋팅되어 리스트에 저장되어야 하므로 아래와 같이 작업합니다 // 만약 레포트 출력에 속도가 문제가 발생된다면.. // 쿼리를 하나만 날리고 저장된 리스트를 각각 모두 추출해서 고유한 그룹만 선별해서 별도로 그룹 헤더 코드를 생성해야 합니다. // //** TB_MAP 테이블에서 맵명을 모두 가지고 온다 DataRowCollection DB_TABLE_MAP = _Db.ExecuteRead_SqlDataAdapter(_Sql.SearchAll_Table_Value("TB_MAP", "MAP_ID", Receiver_Id)); int Group_Header_No = 0; if (DB_TABLE_MAP != null && DB_TABLE_MAP.Count != 0) { foreach (DataRow MAP in DB_TABLE_MAP) { // 그룹별 고유 코드 Group_Header_No++; // // 입력이든 출력이든 일단 하나라도 있는지 확인하자 // // 입력 DataRowCollection DB_TABLE_MAP_IN = _Db.ExecuteRead_SqlDataAdapter(_Sql.Search_Map_ProcessTable(MAP[1].ToString(), "I", Receiver_Id)); // 출력 - 회로 DataRowCollection DB_TB_MAP_OUT = _Db.ExecuteRead_SqlDataAdapter(_Sql.Search_Map_ProcessTable(MAP[1].ToString(), "O", "D", Receiver_Id)); // 출력 - 그룹 DataRowCollection DB_MAP_OUT_GROUP = _Db.ExecuteRead_SqlDataAdapter(_Sql.Search_Map_ProcessTable(MAP[1].ToString(), "O", "G", Receiver_Id)); // 디바이스가 없을 경우 if (DB_TABLE_MAP_IN.Count == 0 && DB_TB_MAP_OUT.Count == 0 && DB_MAP_OUT_GROUP.Count == 0) { // 레포트 출력용 클래스 생성 _Report_Operset Report_Operset = new _Report_Operset(); // 그룹별로 고유 코드 (중복이 안된다고 가정한다) Report_Operset.Group_Header = Group_Header_No.ToString(); // 그룹 순번 Report_Operset.Group_No = Group_Header_No; // 그룹 아이디 Report_Operset.Group_ID = MAP[2].ToString(); // 그룹 이름 Report_Operset.Group_Name = MAP[3].ToString(); // 서브 그룹별 코드 Report_Operset.Group_Header_Sub = _Text.Minus; // 내용 IO Report_Operset.Detail_IO = _Text.Minus; // 수신기 ID Report_Operset.Detail_Receiver = _Text.Minus; // 내용 아이디 Report_Operset.Detail_ID = _Text.Minus; // 내용 타입 Report_Operset.Detail_Type = _Text.Minus; // 내용 위치 Report_Operset.Detail_Location = _Text.Minus; // 내용 이름 Report_Operset.Detail_Name = _Text.Minus; // 레포트 출력용 데이타 (세부내용을 포함) Report_Data.Add(Report_Operset); } // // 입력 // int Group_Header_Sub_No = 0; bool Group_Header_Sub_No_Enable = false; // 출력중에는 디바이스 및 그룹이 구분되어서 나오게 되므로 하나로 그룹을 통합하기 위한 변수 if (DB_TABLE_MAP_IN != null && DB_TABLE_MAP_IN.Count != 0) { Group_Header_Sub_No++; foreach (DataRow DETAIL in DB_TABLE_MAP_IN) { if (_Convert.Exception_Into_object(DETAIL[7], DETAIL[8], DETAIL[9], DETAIL[10], DETAIL[11]) == true) { // 매개변수 순서 => COMM_ID, BOARD_ID, LOOP_NO, REPEATER_ID, DEVICE_ID, INOUT_TYPE MskDeviceIDString dev_s = new MskDeviceIDString( _Convert.Null_to_IntZero(DETAIL[7].ToString()), _Convert.Null_to_IntZero(DETAIL[8].ToString()), _Convert.Null_to_IntZero(DETAIL[9].ToString()), _Convert.Null_to_IntZero(DETAIL[10].ToString()), _Convert.Null_to_IntZero(DETAIL[11].ToString()), DETAIL[12].ToString(), DETAIL[6].ToString()); // cyim 2016.12.05 : 수신기 모델별 내부 로직 변경 // 레포트 출력용 클래스 생성 _Report_Operset Report_Operset = new _Report_Operset(); // 그룹별로 고유 코드 (중복이 안된다고 가정한다) Report_Operset.Group_Header = Group_Header_No.ToString(); // 그룹 순번 Report_Operset.Group_No = Group_Header_No; // 그룹 아이디 Report_Operset.Group_ID = MAP[2].ToString(); // 그룹 이름 Report_Operset.Group_Name = MAP[3].ToString(); // 서브 그룹별 코드 Report_Operset.Group_Header_Sub = Group_Header_Sub_No.ToString(); // 내용 IO Report_Operset.Detail_IO = "입력"; // 수신기 ID Report_Operset.Detail_Receiver = DETAIL[6].ToString(); // 내용 아이디 Report_Operset.Detail_ID = dev_s.MskId; // 내용 타입 Report_Operset.Detail_Type = DETAIL[0].ToString(); // 내용 위치 Report_Operset.Detail_Location = DETAIL[1].ToString(); // 내용 이름 Report_Operset.Detail_Name = DETAIL[2].ToString(); // 레포트 출력용 데이타 (세부내용을 포함) Report_Data.Add(Report_Operset); } } } // // 출력 (디바이스) // if (DB_TB_MAP_OUT != null && DB_TB_MAP_OUT.Count != 0) { // 그룹별 고유 코드 //Group_Header_No++; if (Group_Header_Sub_No == 1) { Group_Header_Sub_No++; // 출력 디바이스 만 있는 경우 Group_Header_Sub_No_Enable = true; } else Group_Header_Sub_No++; foreach (DataRow DETAIL in DB_TB_MAP_OUT) { if (_Convert.Exception_Into_object(DETAIL[7], DETAIL[8], DETAIL[9], DETAIL[10], DETAIL[11]) == true) { // 매개변수 순서 => COMM_ID, BOARD_ID, LOOP_NO, REPEATER_ID, DEVICE_ID, INOUT_TYPE MskDeviceIDString dev_s = new MskDeviceIDString( _Convert.Null_to_IntZero(DETAIL[7].ToString()), _Convert.Null_to_IntZero(DETAIL[8].ToString()), _Convert.Null_to_IntZero(DETAIL[9].ToString()), _Convert.Null_to_IntZero(DETAIL[10].ToString()), _Convert.Null_to_IntZero(DETAIL[11].ToString()), DETAIL[12].ToString(), DETAIL[6].ToString()); // cyim 2016.12.05 : 수신기 모델별 내부 로직 변경 // 레포트 출력용 클래스 생성 _Report_Operset Report_Operset = new _Report_Operset(); // 그룹별로 고유 코드 (중복이 안된다고 가정한다) Report_Operset.Group_Header = Group_Header_No.ToString(); // 그룹 순번 Report_Operset.Group_No = Group_Header_No; // 그룹 아이디 Report_Operset.Group_ID = MAP[2].ToString(); // 그룹 이름 Report_Operset.Group_Name = MAP[3].ToString(); // 서브 그룹별 코드 Report_Operset.Group_Header_Sub = Group_Header_Sub_No.ToString(); // 내용 IO Report_Operset.Detail_IO = "출력"; // 수신기 ID Report_Operset.Detail_Receiver = DETAIL[6].ToString(); // 내용 아이디 Report_Operset.Detail_ID = dev_s.MskId; // 내용 타입 Report_Operset.Detail_Type = DETAIL[0].ToString(); // 내용 위치 Report_Operset.Detail_Location = DETAIL[1].ToString(); // 내용 이름 Report_Operset.Detail_Name = DETAIL[2].ToString(); // 레포트 출력용 데이타 (세부내용을 포함) Report_Data.Add(Report_Operset); } } } // // 출력 (그룹) // if (DB_MAP_OUT_GROUP != null && DB_MAP_OUT_GROUP.Count != 0) { // 그룹별 고유 코드 //Group_Header_No++; if (Group_Header_Sub_No_Enable == false) Group_Header_Sub_No++; foreach (DataRow DETAIL in DB_MAP_OUT_GROUP) { // TB_GROUP 테이블에 접근 DataRowCollection DB_TABLE_TB_DEVICE_TYPE = _Db.ExecuteRead_SqlDataAdapter(_Sql.SearchAll_Table_Value("TB_GROUP", "GROUP_ID", DETAIL[5].ToString(), null)); // 맵연동 설정에서 확인하는 출력그룹은 오로지 그룹아이디로만 판단 if (DB_TABLE_TB_DEVICE_TYPE != null && DB_TABLE_TB_DEVICE_TYPE.Count != 0) { foreach (DataRow Dr in DB_TABLE_TB_DEVICE_TYPE) { // 레포트 출력용 클래스 생성 _Report_Operset Report_Operset = new _Report_Operset(); // 그룹별로 고유 코드 (중복이 안된다고 가정한다) Report_Operset.Group_Header = Group_Header_No.ToString(); // 그룹 순번 Report_Operset.Group_No = Group_Header_No; // 그룹 아이디 Report_Operset.Group_ID = MAP[2].ToString(); // 그룹 이름 Report_Operset.Group_Name = MAP[3].ToString(); // 서브 그룹별 코드 Report_Operset.Group_Header_Sub = Group_Header_Sub_No.ToString(); // 내용 IO Report_Operset.Detail_IO = "출력"; // 수신기 ID Report_Operset.Detail_Receiver = Dr[0].ToString(); // 내용 아이디 Report_Operset.Detail_ID = DETAIL[5].ToString(); // 내용 타입 Report_Operset.Detail_Type = null; // 내용 위치 Report_Operset.Detail_Location = null; // 내용 이름 Report_Operset.Detail_Name = Dr[2].ToString(); // 레포트 출력용 데이타 (세부내용을 포함) Report_Data.Add(Report_Operset); } } } } } } // 개요 int All_Group_Cnt = 0; if (DB_TABLE_MAP != null) All_Group_Cnt = DB_TABLE_MAP.Count; // 레포트뷰어에 정보를 전달 Form_ActiveReport_Viewer Report = new Form_ActiveReport_Viewer( ACTIVE_REPORT_DATA.OPER_SET, Report_Data, Column_Info, "연동 설정 보고서", string.Format("프로젝트명 [{0}] 수신기ID [{1}] 맵 개수 [{2}]", _Data.Project_Name, Receiver_Id, All_Group_Cnt.ToString()), 0.21F, 9); // 출력 _Form.Create(Report, null); } else _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 350, 150, _Text.UsingReportViewer, 0); } // 화면 설정 레포트 public static void Create_ReportViewer_Page(string RECEIVER_ID) { // 레포트 폼생성 if (_Data.ActiveReportViewer_Enable == false) { // 컬럼키값 _Report_Page dummy = new _Report_Page(); ArrayList Column_Info = _Reflection.GetMemberName_ToArrayList(dummy); // 레포트 특정 클래스 데이타 집합 ArrayList Report_Data = new ArrayList(); // // 해쉬테이블을 이용해서 페이지 정보 추출 // // 페이지당 현재 설정된 이름을 전부 가져온다 foreach (string PAGE_ID in ((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).LIST_PAGE_ID) { if (((_Page)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).HASH_PAGE[PAGE_ID]).Receiver_ID == RECEIVER_ID) { // 아이콘 명 ArrayList NewColumnHeader = new ArrayList(); // 아이콘 개수 int Button_Icon_Count = 0; int Device_Icon_Count = 0; foreach (string ICON_ID in ((_Page)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).HASH_PAGE[PAGE_ID]).LIST_ICON_ID) { // 현재 설정된 아이콘의 이름을 모두 가져온다 string TempDeviceIconName = ((_PictureBoxItem)((_Page)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).HASH_PAGE[PAGE_ID]).HASH_ICON[ICON_ID]).Device_DB_Name; // 중복 배제 및 공백 제거 (널값 허용안함) if (NewColumnHeader.Contains(TempDeviceIconName) == false && TempDeviceIconName != null && TempDeviceIconName.Length != 0) { NewColumnHeader.Add(TempDeviceIconName); } if (((_PictureBoxItem)((_Page)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).HASH_PAGE[PAGE_ID]).HASH_ICON[ICON_ID]).ItemType == Item_Type.Button) Button_Icon_Count++; else if (((_PictureBoxItem)((_Page)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).HASH_PAGE[PAGE_ID]).HASH_ICON[ICON_ID]).ItemType == Item_Type.Device) Device_Icon_Count++; } // etc string Etc = null; for (int i = 0 ; i < NewColumnHeader.Count; i++) { Etc = Etc + NewColumnHeader[i].ToString() + ":" + Get_Count_By_Device_Icon_Name(RECEIVER_ID, PAGE_ID, NewColumnHeader[i].ToString()) + " , "; } if (Etc == null) Etc = " ※ Not Setted Device Icon"; else { Etc = Etc.Trim(); Etc = Etc.TrimEnd(','); Etc = " ※ 참고 : " + Etc; } // 레포트 출력용 클래스 생성 _Report_Page Report_Page = new _Report_Page(); Report_Page.Group_Header = PAGE_ID; Report_Page.Group_No = ((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).LIST_PAGE_ID.IndexOf(PAGE_ID); Report_Page.Group_Name = ((_Page)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).HASH_PAGE[PAGE_ID]).NodeText; Report_Page.Group_Cnt = string.Format(" Device_Icon : {0} , Button Icon : {1}", Device_Icon_Count, Button_Icon_Count); Report_Page.Group_Etc = Etc; //Report_Page.Detail_Image = Image.FromFile(((_Page)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).HASH_PAGE[PAGE_ID]).PictureBoxItem_BackGround.FullPath_FileName); Report_Page.Detail_Image = ((_Page)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).HASH_PAGE[PAGE_ID]).Capure_Image_Page; // 레포트 출력용 데이타 (세부내용을 포함) Report_Data.Add(Report_Page); } } // 레포트뷰어에 정보를 전달 Form_ActiveReport_Viewer Report = new Form_ActiveReport_Viewer( ACTIVE_REPORT_DATA.PAGE, Report_Data, Column_Info, "페이지 설정 보고서", string.Format("프로젝트명 [{0}] 수신기ID [{1}] 페이지 개수 [{2}]", _Data.Project_Name, RECEIVER_ID, ((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).LIST_PAGE_ID.Count.ToString()), 0.21F, 9); // 출력 _Form.Create(Report, null); } else _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 350, 150, _Text.UsingReportViewer, 0); } // 해당 이름에 대한 디바이스 총개수 private static int Get_Count_By_Device_Icon_Name(string RECEIVER_ID, string Page_ID, string Data) { int result = 0; foreach (string ICON_ID in ((_Page)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).HASH_PAGE[Page_ID]).LIST_ICON_ID) { if (((_PictureBoxItem)((_Page)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).HASH_PAGE[Page_ID]).HASH_ICON[ICON_ID]).Device_DB_Name == Data) result++; } return result; } } }