Public Class CalculatorOD Dim T As String = "계산" Public WithEvents Zone As CZoneOD '//존에클래스할당 Public WithEvents AirHandling As CAirHandlingOD '//존에클래스할당 Public WithEvents Cooling As CCoolingOD '//존에클래스할당 Public WithEvents Heating As CHeatingOD '//존에클래스할당 Public WithEvents Renewable As CRenewableOD '//존에클래스할당 Public WithEvents Summary As CSummaryOD Public WithEvents Pub As CSharedOD Public IsError As Boolean = False Enum ECalc All = 0 REq = 1 Use = 2 End Enum Public Sub New(ByVal Version As String) Me.IsError = False Me.Zone = New CZoneOD '//존 Me.AirHandling = New CAirHandlingOD '//공기 Me.Cooling = New CCoolingOD Me.Heating = New CHeatingOD Me.Renewable = New CRenewableOD '//신재상 Me.Summary = New CSummaryOD '//계산결과 집계 Me.Pub = New CSharedOD '//공용변수 Me.IsError = Me.Pub.IsError '//공용변수값에 오류확인 'Select Case Version ' Case "2009123100", StartVersion, "2017041400" ' Case Else ' MsgBox("LG계산식에 지원되지않는 버젼(" & StartVersion & "/" & Version & ")입니다", MsgBoxStyle.Critical, "확인") ' Me.IsError = True 'End Select End Sub Public Function Start(ByVal CalcType As ECalc, ByRef log As System.Text.StringBuilder) As Boolean '//계산을 시작 p_CalcUse : 는 소요량 계산도 할건지으 ㅣ플래그 나중에 분리해야겠따. Setup_Zone9() 'Dim ST As Date = Now If Me.IsError Then MsgBox("계산준비중 오류발생", MsgBoxStyle.Critical, "확인") Return False End If log = New System.Text.StringBuilder("") Dim Cnt As Integer = FixData() 'log.AppendLine(">>데이터보정(" & Cnt.ToString & ")개의 데이터가 보정되었습니다") 'log.AppendLine(">>유효성검사시작") If Validation() = False Then Return False '//유효성 체크를 수행한다. '/////////////////////////////////////////////////////////////////////////// ' 2017. 12. 19 '/////////////////////////////////////////////////////////////////////////// '//모드난방기기는 헤더적용 For Each dr As DS.tbl_nanbangkikiRow In DSET1.tbl_nanbangkiki.Rows dr.헤더적용 = True dr.개별기기적용 = False Next DSET1.tbl_nanbangkiki.AcceptChanges() If CalcType <> ECalc.Use Then 'log.AppendLine(">>계산영역초기화") Clear_ResultArea() '//과거의 계산영역을 클리어시킨다. 'log.AppendLine(">>각존의 사용면적 계산") Result1o.사용면적.Calc() '//A_H,C,W,L,V 의 누적값을 계산(사용면적) : 개별프로시져로 할당 'log.AppendLine(">>주계산시작") End If Dim Retval As Boolean Select Case CalcType Case ECalc.All Retval = CalcO.Zone.Calc_LoadOfZones If Retval Then Retval = CalcO.Zone.Calc_Useage Return Retval Case ECalc.REq Return CalcO.Zone.Calc_LoadOfZones Case ECalc.Use Return CalcO.Zone.Calc_Useage End Select End Function Private Function FixData() As Integer Dim RetCnt As Integer = 0 Dim Null As String = "(없음)" '//보정할수있는데이터를 보정합니다. ';//입력면 - 건축부위방식이 .내벽 or 간벽일경우 방위는 (없음)이다 For Each DR면 As DS.tbl_myounRow In DSET1.tbl_myoun.Select("code <> '0'") If DR면.건축부위방식 = "내벽" Or DR면.건축부위방식 = "간벽" Then If DR면.방위 <> Null AndAlso DR면.방위 <> "일사없음" Then RetCnt += 1 DR면.방위 = Null End If End If Next For Each DR존 As DS.tbl_zoneRow In DSET1.tbl_zone.Select("code <> '0'") If DR존.조명방식.ToString = "0" OrElse DR존.조명방식.ToString = "" Then RetCnt += 1 Log.AppendLine("Zone " & DR존.설명.ToString & "] 의 조명방식이 없음으로 설정됩니다.") DR존.조명방식 = "(없음)" End If If DR존.인공광원.ToString = "0" OrElse DR존.인공광원.ToString = "" Then RetCnt += 1 Log.AppendLine("Zone " & DR존.설명.ToString & "] 의 인공광원이 없음으로 설정됩니다.") DR존.인공광원 = "(없음)" End If If DR존.외기부하처리여부.ToString = "0" OrElse DR존.외기부하처리여부.ToString = "" Then RetCnt += 1 Log.AppendLine("Zone " & DR존.설명.ToString & "] 의 외기부하처리여부가 아니오로 설정됩니다.") DR존.외기부하처리여부 = "아니오" End If 'If DR존.조명방식.ToString.Trim = "" Then DR존.조명방식 = "(없음)" 'If DR존.인공광원.ToString.Trim = "" Then DR존.인공광원 = "(없음)" Next DSET1.AcceptChanges() '//변경내용 적용 Return RetCnt End Function Public Function Validation() As Boolean '//존이 2개이상있어야한다 (없음데이터로인해서 반드시 1개는 있기때문이다.) '//여기보정데이터가잇네요.; Dim NoErr As Boolean = True '//콤보박스들의 값이 지정되어잇는지 확인한다. 무조건 있어야한다 Dim Title As String Dim Columns() As String '//(없음)이 들어가는 콤보필드 Dim ColumnC() As String '//공용코드전용 필드들 Dim CGubun() As String '//공용코드필드의 구분값이 저장됨 Dim Columnst() As String '//0이 들어가는 콤보필드 '//ZONE Title = "Zone" Columns = New String() {"냉난방열공급시스템", "열저장능력", "열교가산치", "주말운전방식", "야간운전방식", "외기부하처리여부", "냉난방공조", "냉난방방식", "조명부하산출방법", "조명방식", "인공광원"} ColumnC = New String() {"열저장능력", "열교가산치", "주말운전방식", "야간운전방식", "외기부하처리여부"} ' '//다를지도 모르니 나중에 함 확인하시구요 CGubun = New String() {"1023", "1022", "1002", "1002", "1054"} '//공용코드있는데는 모조리 설정하시구요 물론 길이는 바로위하고 같아야합닌다. '//여기에 각 공용코드의 구분값 1009 뭐 이런것들을 같게 넣어주세요 column 가 8개가있었따면 cgubun 도 8개가 잇으면됩니다. Columnst = New String() {"프로필", "냉난방공조처리시스템", "열생산난방생산기기", "열생산급탕생산기기", "열생산냉방생산기기", "열생산가습생산기기", "냉난방공조분배시스템", "냉난방분배시스템", "공조냉방생산기기", "공조난방생산기기"} Set_Null(Columns, DSET1.tbl_zone, "(없음)") '//데이터를 기본값 셋팅해주는구문이구요 없는데이터는 넓값처리 Set_Null(ColumnC, DSET1.tbl_zone, "(없음)") '//공용코드값이 아에없는 데이터를 기본값 셋팅해주는구문이구요 없는데이터는 넓값처리 'Set_CheckCommon(ColumnC, DSET1.tbl_zone, CGubun) '//이거는 // 공용코드오류난 데이터 검색하는부분이에요 Set_Null(Columnst, DSET1.tbl_zone, "0") Title = "신재생에너지" Columns = New String() {"기기종류", "가동연료", "태양열종류", "집열기유형", "집열판방위", "태양열시스템의성능", "축열탱크설치장소", "태양광모듈기울기", "태양광모듈방위", "태양광모듈종류", "태양광모듈적용타입", "열교환기설치여부", "팽창탱크설치여부"} Set_Null(Columns, DSET1.tbl_new, "(없음)") 'Set_Null(Columnst, DSET1.tbl_bunbae, "0") Title = "난방분배시스템" Columns = New String() {"생산기기구분", "표준치적용", "배관망유형", "배관구간방식", "배관설치장소", "배관설치장소", "지관장소"} Set_Null(Columns, DSET1.tbl_nbunbae, "(없음)") 'Set_Null(Columnst, DSET1.tbl_bunbae, "0") Title = "난방기기" Columns = New String() {"연결된시스템", "열생산기기방식", "사용연료", "난방급탕구분"} Columnst = New String() {"배관길이", "펌프동력", "보일러정격출력", "보일러대수", "정격보일러효율"} Set_Null(Columns, DSET1.tbl_nanbangkiki, "(없음)") Set_Null(Columnst, DSET1.tbl_nanbangkiki, "0") Title = "냉방기기" Columns = New String() {"냉동기방식", "냉동기종류", "냉동기용량", "열성능비", "사용연료"} Columnst = New String() {"연결된시스템", "냉수펌프동력", "냉각수펌프동력"} Set_Null(Columns, DSET1.tbl_nangbangkiki, "(없음)") Set_Null(Columnst, DSET1.tbl_nangbangkiki, "0") Title = "입력면" Columns = New String() {"건축부위방식", "블라인드유무", "블라인드위치", "방위", "블라인드빛종류", "블라인드색상", "블라인드각도"} Columnst = New String() {"존분류", "대차대조존"} Set_Null(Columns, DSET1.tbl_myoun, "(없음)") Set_Null(Columnst, DSET1.tbl_myoun, "0") 'Title = "난방공급시스템" 'Columns = New String() {"열공급시스템", "노출형제어", "바닥난방열제어", _ ' "바닥난방열건축부위", "바닥난방전기제어", "바닥난방전기건축부위", "전기난방제어"} 'Columnst = New String() {"열공급생산기기"} 'Set_Null(Columns, DSET1.tbl_kongkub, "(없음)") 'Set_Null(Columnst, DSET1.tbl_kongkub, "0") Title = "공조처리" Columns = New String() {"공조방식"} Set_Null(Columns, DSET1.tbl_kongjo, "(없음)") 'Set_Null(Columnst, DSET1.tbl_bunbae, "0") 'Title = "냉방분배시스템" ''Columns = New String() {"냉매방식", "펌프운전제어유무"} 'Columnst = New String() {"냉동기"} ''Set_Null(Columns, DSET1.tbl_bunbae, "(없음)") 'Set_Null(Columnst, DSET1.tbl_bunbae, "0") 'DSET1.tbl_kongjo.AcceptChanges() DSET1.AcceptChanges() '//그값이 존에잇어요?cnrkehlsrp?추가된게?공조기기요 For Each Dr As DS.tbl_zoneRow In DSET1.tbl_zone.Select("code <> '0'") '//모든존을 검사 없음(0)은 빼고 'If Dr.공조난방생산기기 = "0" And Dr.공조냉방생산기기 = "0" Then '//둘다 0일경우 '//오류를 내고싶으면 여기서 return false 해버리면됩니다.'다른족건이 잇다면.. 아까처럼.. 'Return False 냉난방공조 라는 공조에 냉난방이 있으면 : : 'End If 'If Dr.냉난방공조 = "냉난방" Then '// ' If Dr.공조난방생산기기 = "0" OrElse Dr.공조냉방생산기기 = "0" Then ' MsgBox("입력존에서 공조방식에 대응하는 공조냉난방생산기기가 지정되지 않은 것이 있습니다.") ' Return False ' End If 'End If 'If Dr.냉난방공조 = "난방" OrElse (Dr.냉난방공조 = "냉방" And Dr.외기부하처리여부 = "예") Then '// ' If Dr.공조난방생산기기 = "0" Then ' MsgBox("입력존에서 공조방식에 대응하는 공조난방생산기기가 지정되지 않은 것이 있습니다.") ' Return False ' End If 'End If 'If Dr.냉난방공조 = "냉방" OrElse (Dr.냉난방공조 = "난방" And Dr.외기부하처리여부 = "예") Then '// ' If Dr.공조냉방생산기기 = "0" Then ' MsgBox("입력존에서 공조방식에 대응하는 공조냉방생산기기가 지정되지 않은 것이 있습니다.") ' Return False ' End If 'End If 'If Dr.냉난방공조 = "환기" And Dr.외기부하처리여부 = "예" Then '// ' If Dr.공조난방생산기기 = "0" OrElse Dr.공조냉방생산기기 = "0" Then ' MsgBox("입력존에서 외기부하처리에 따른 공조냉난방생산기기가 지정되지 않은 것이 있습니다.") ' Return False ' End If 'End If Next '//부위명 업데이트 171021 For Each drm As DS.tbl_myounRow In DSET1.tbl_myoun.Select("code<>'0'") If drm.열관류율2 <> "" Then Dim ykcode As String = drm.열관류율2 Dim dr() As DS.tbl_ykRow = DSET1.tbl_yk.Select("code='" & ykcode & "'") If dr.GetUpperBound(0) <> -1 Then Select Case dr(0).면형태 Case "외벽(직접)", "0" drm.면형태 = "외벽(직접)" Case "지붕(직접)", "0001" drm.면형태 = "지붕(직접)" Case "바닥(직접)", "0002" drm.면형태 = "바닥(직접)" Case "외벽(간접)", "0003" drm.면형태 = "외벽(간접)" Case "지붕(간접)", "0004" drm.면형태 = "지붕(간접)" Case "바닥(간접)", "0005" drm.면형태 = "바닥(간접)" Case "간벽", "0006" drm.면형태 = "간벽" Case "창(직접)", "창(간접)", "문(직접)", "문(간접)", "세대현관문(직접)", "세대현관문(간접)", "0007", "0008", "0010", "0011", "0012", "0013" If dr(0).면형태 = "0007" Then drm.면형태 = "창(직접)" ElseIf dr(0).면형태 = "0008" Then drm.면형태 = "창(간접)" ElseIf dr(0).면형태 = "0010" Then drm.면형태 = "문(직접)" ElseIf dr(0).면형태 = "0011" Then drm.면형태 = "문(간접)" ElseIf dr(0).면형태 = "0012" Then drm.면형태 = "세대현관문(직접)" ElseIf dr(0).면형태 = "0013" Then drm.면형태 = "세대현관문(간접)" End If Case "지중벽", "0009" drm.면형태 = "지중벽" Case Else drm.면형태 = "--" End Select End If Else drm.면형태 = "" End If Next '//여기에서 FAlse 를 반환해버리면.. 게산은 돌지않아요 게산전에 수행되는곳이구요 '//아까 파일오픈시에도 여기를 호출합니다. 바로 윗부분이 nul l값에대한 기본값 처리구요. Return NoErr End Function Private Sub Set_Null(ByVal Columns() As String, ByRef dt As DataTable, ByVal val As String) For Each Dr As DataRow In dt.Select("code<>'0'", "code") For Each Col As String In Columns If Dr(Col) Is DBNull.Value OrElse Dr(Col).ToString.Trim = "" Then '//값이없으면 기본값(val)으로 설정 Dr(Col) = val End If Next Next End Sub '''공용코드에값이있는지확인 Private Sub Set_CheckCommon(ByVal Columns() As String, ByRef dt As DataTable, ByVal gubunval() As String) Dim index As Short = -1 For Each Dr As DataRow In dt.Select("code<>'0'", "code") index = 0 For Each Col As String In Columns If Dr(Col).ToString.Trim = "" Then '//값이없으면 기본값(val)으로 설정 'Dr(Col) = val Else '//값이있을때 Dim V As String = Dr(Col).ToString.Trim '//v의값이 공용ㅇ코드에 있는지 확인 공용코드는 name 을 저장하므로 name 으로검사를 수행 Dim Cdr() As DS.tbl_common_odRow = DSET1.tbl_common_od.Select("gubun='" & gubunval(index) & "' and name='" & V & "'") If Cdr.GetUpperBound(0) = -1 Then MsgBox("값이있으나 공용코드에없음(여기에 경고문구좀 날려주시면되구요") End If End If index += 1 Next Next End Sub ''' ''' 계산결과 영역을 초기화시킵니다. ''' ''' Private Sub Clear_ResultArea() DSETR1.Clear() : DSETR1.AcceptChanges() '//기존데이터 클리어 '//0번시트의 결과값을 저장할 장소를 생성한다. Zone=00 은 합계필드이다(이것이 일률적이지않아서 00으로 할당을 따로 해서 나중에 합산작업을 할 예정) '//00번 존을포함하여 현재 존의 갯수+1개를 생성한다. '//최대냉난방/E분석 Dim ZoneCode As String For Each Dr존 As DS.tbl_zoneRow In DSET1.tbl_zone.Select("", "code") If Dr존.code = "0" Then ZoneCode = "00" Else ZoneCode = Dr존.code End If Dim Res1 As DSR.최대냉난방부하Row = DSETR1.최대냉난방부하.New최대냉난방부하Row Res1.Zone = ZoneCode : DSETR1.최대냉난방부하.Add최대냉난방부하Row(Res1) For ii As Integer = 1 To 12 Dim DrE분석 As DSR.월별에너지분석Row = DSETR1.월별에너지분석.New월별에너지분석Row DrE분석.월 = "M" & Format(ii, "00") '//정렬을위해서 00숫자형태로 기록한다. 앞으로 모든 월데이터는 그렇게 기록함 DrE분석.존 = ZoneCode DSETR1.월별에너지분석.Add월별에너지분석Row(DrE분석) 'MsgBox("M" & Format(ii, "00"), MsgBoxStyle.Information, ZoneCo'de) Next Next ' MsgBox(DSETR1.월별에너지분석.Select("월='M01'").GetUpperBound(0)) '//월별로 움직이는데이터 Dim Mon As String Dim Dr As DataRow For ii As Integer = 0 To 12 Mon = "M" & Format(ii, "00") Dr = DSETR1.생산에너지.NewRow Dr("mon") = Mon '//정렬을위해서 00숫자형태로 기록한다. 앞으로 모든 월데이터는 그렇게 기록함 DSETR1.생산에너지.Rows.Add(Dr) Dr = DSETR1.에너지소요량.NewRow Dr("mon") = Mon '//정렬을위해서 00숫자형태로 기록한다. 앞으로 모든 월데이터는 그렇게 기록함 DSETR1.에너지소요량.Rows.Add(Dr) Dr = DSETR1.에너지소요량1.NewRow Dr("mon") = Mon '//정렬을위해서 00숫자형태로 기록한다. 앞으로 모든 월데이터는 그렇게 기록함 DSETR1.에너지소요량1.Rows.Add(Dr) Next '//전부다시 구성해야함 DSETR1.AcceptChanges() End Sub '''열관류율값ㅇㄹ 반환 Public Function Get_열관류율(ByVal Dr As DS.tbl_myounRow) As Decimal Return TOSG(T, Dr.열관류율) 'Dim 열관류율2 As String = Dr.열관류율2 'If 열관류율2 = "" OrElse 열관류율2 = "0" Then '//코드가없으므로 입력값그대로 사용 ' Return TOSG(T,Dr.열관류율) 'Else '//코드값이잇으므로 값을 찾는다. ' Try ' Dim Drow As DS.tbl_ykRow = DSET1.tbl_yk.Select("code='" & 열관류율2 & "'")(0) ' Return TOSG(T,Drow.열관류율) '//코드내에 저장된 값을 보낸다 ' Catch ex As Exception ' MsgBox("열관류율코드값(" & 열관류율2 & ") 값오류" & vbCrLf & ex.Message.ToString, MsgBoxStyle.Critical, "확인") ' Return 0 ' End Try 'End If End Function End Class