Public Class Calculator

    Public WithEvents Zone As CZone    '//존에클래스할당
    Public WithEvents AirHandling As CAirHandling    '//존에클래스할당
    Public WithEvents Cooling As CCooling    '//존에클래스할당
    Public WithEvents Heating As CHeating    '//존에클래스할당
    Public WithEvents Renewable As CRenewable    '//존에클래스할당
    Public WithEvents Summary As CSummary
    Public WithEvents Pub As CShared

    Public IsError As Boolean = False
    Public IsSimulation As Boolean = False

    Enum ECalc
        All = 0
        REq = 1
        Use = 2
        설계개선안 = 3
    End Enum

    Private DSET As DS
    Private DSETR As DSR
    Private Result As CResult
    Public Sub New(ByVal Version As String, ByRef pds As DS, ByRef pdsetr As DSR, ByRef prresult As CResult, p_simul As Boolean)
        Me.IsError = False
        DSET = pds
        DSETR = pdsetr
        Result = prresult
        IsSimulation = p_simul  '//평가계산에의해서는 시뮬레이션모드로 작동
        Select Case Version
            Case "2009123100", StartVersion
                Me.Zone = New CZone(DSET, DSETR, Result) '//존
                Me.AirHandling = New CAirHandling(DSET, DSETR, Result)   '//공기
                Me.Cooling = New CCooling(DSET, DSETR, Result)
                Me.Heating = New CHeating(DSET, DSETR, Result)
                Me.Renewable = New CRenewable(DSET, Result)   '//신재상
                Me.Summary = New CSummary(DSETR, Result)   '//계산결과 집계
                Me.Pub = New CShared    '//공용변수(여기추가됬을거에요)- 기상오류처리
                Me.IsError = Me.Pub.IsError '//공용변수값에 오류확인
            Case Else
                MsgBox("LG계산식에 지원되지않는 버젼(" & StartVersion & "/" & Version & ")입니다", MsgBoxStyle.Critical, "확인")
                Me.IsError = True
        End Select
    End Sub

    Private Function 설계개선안사용여부(findcode As String) As Boolean
        Dim retval As Boolean = False
        For Each dr As DS.tbl_monuseRow In DSET1.tbl_monuse.Select("code='" + findcode + "'", "월")
            If dr.도시가스 <> "0" Then
                retval = True
                Exit For
            End If
            If dr.전력 <> "0" Then
                retval = True
                Exit For
            End If
            If dr.지역난방 <> "0" Then
                retval = True
                Exit For
            End If
        Next
        Return retval
    End Function

    Private Sub 입력값계수변환(code As String)
        If 설계개선안사용여부(code) Then
            For Each dr As DS.tbl_monuseRow In DSET1.tbl_monuse.Select("code='" + code + "'", "월")
                Dim newdr As DSR.월별1차에너지사용량Row = DSETR1.월별1차에너지사용량.NewRow
                newdr.도시가스 = dr.도시가스 * Result2.E변환계수.LNG
                newdr.전력 = dr.전력 * Result2.E변환계수.전력
                newdr.지역난방 = dr.지역난방 * Result2.E변환계수.지역난방
                newdr.code = dr.code
                newdr.년 = dr.년
                newdr.월 = dr.월
                DSETR1.월별1차에너지사용량.Rows.Add(newdr)
            Next
        End If
    End Sub


    '''130824
    Public Function 설계개선안계산() As Boolean
        Dim dr_desc As DS.tbl_DescRow = DSET.tbl_Desc.Rows(0)

        '//년면적값확인
        Dim 년면적 As Decimal = 0
        If IsNumeric(dr_desc.buildm23) = False Then dr_desc.buildm23 = "0"
        년면적 = CDec(dr_desc.buildm23)
        If 년면적 = 0 Then
            MsgBox("년면적값이 없습니다.", MsgBoxStyle.Critical, "확인")
            Return False
        End If

        '//월별에너지사용량에서 입력한 값
        Dim 사용자입력값에너지사용량(12) As Decimal

        '//현재계산되어있는 1차에너지사용량
        Dim 년면적당(12) As Decimal
        Dim 년면적당원본(12) As Decimal

        Dim ok As Boolean = True
        Dim 오차계산횟수 As Decimal = 0
        Dim 난방설정온도 As Decimal = 20
        Dim 냉방설정온도 As Decimal = 26
        Dim 실내발열 As Decimal = 0

        Dim 전반기최저입력 As Decimal = 999999
        Dim 하반기최저입력 As Decimal = 999999
        Dim 전반기최저 As Decimal = 999999
        Dim 하반기최저 As Decimal = 999999

        For i As Integer = 1 To 12
            사용자입력값에너지사용량(i) = 0
            년면적당(i) = 0
            Zone_Message("계산데이터와 입력데이터 집계중(" + i.ToString() + "/3)...", i, 0, 12)

            '//사용자에의해서 입력된 값을 누적한다.
            For Each dr1 As DSR.월별1차에너지사용량Row In DSETR.월별1차에너지사용량.Select("월='" + i.ToString("00") + "'")
                사용자입력값에너지사용량(i) += TOSG(dr1.도시가스) + TOSG(dr1.전력) + TOSG(dr1.지역난방)
            Next

            '//임시계산저장소의 값을 이용한다.
            년면적당원본(i) = (Result1.일차E소요량(i).난방소요량 / 년면적) + (Result1.일차E소요량(i).냉방소요량 / 년면적) _
               + (Result1.일차E소요량(i).급탕소요량 / 년면적) + (Result1.일차E소요량(i).조명소요량 / 년면적) _
                + (Result1.일차E소요량(i).환기소요량 / 년면적)

            If i <= 6 Then
                If 사용자입력값에너지사용량(i) < 전반기최저입력 Then 전반기최저입력 = 사용자입력값에너지사용량(i)
                If 년면적당원본(i) < 전반기최저 Then 전반기최저 = 년면적당원본(i)
            Else
                If 사용자입력값에너지사용량(i) < 하반기최저입력 Then 하반기최저입력 = 사용자입력값에너지사용량(i)
                If 년면적당원본(i) < 하반기최저 Then 하반기최저 = 년면적당원본(i)
            End If
        Next

        Dim 입력값평균 As Decimal = (하반기최저입력 + 전반기최저입력) / 2
        Dim 계산값평균 As Decimal = (하반기최저 + 전반기최저) / 2
        Dim 오차 As Decimal = 계산값평균 - 입력값평균
        Dim 오차재계산횟수 As Integer = 5


        While (True)

            For i As Integer = 1 To 12
                사용자입력값에너지사용량(i) = 0
                년면적당(i) = 0
                Zone_Message("계산데이터와 입력데이터 집계중(" + i.ToString() + "/3)...", i, 0, 12)

                '//사용자에의해서 입력된 값을 누적한다.
                For Each dr1 As DSR.월별1차에너지사용량Row In DSETR.월별1차에너지사용량.Select("월='" + i.ToString("00") + "'")
                    사용자입력값에너지사용량(i) += TOSG(dr1.도시가스) + TOSG(dr1.전력) + TOSG(dr1.지역난방)
                Next

                '//임시계산저장소의 값을 이용한다.
                년면적당(i) = (Result2.일차E소요량(i).난방소요량 / 년면적) + (Result2.일차E소요량(i).냉방소요량 / 년면적) _
                   + (Result2.일차E소요량(i).급탕소요량 / 년면적) + (Result2.일차E소요량(i).조명소요량 / 년면적) _
                    + (Result2.일차E소요량(i).환기소요량 / 년면적)

                년면적당(i) += (-1 * 오차)

            Next

            '//여름피크확인(8월)
            '//겨울피크확인(1월)
            Dim 오차겨울 As Decimal = Math.Abs(년면적당(1) - 사용자입력값에너지사용량(1))
            Dim 오차여름 As Decimal = Math.Abs(년면적당(8) - 사용자입력값에너지사용량(8))

            Dim 원본겨울 As Decimal = 년면적당원본(1)
            Dim 원본여름 As Decimal = 년면적당원본(8)

            Dim 오차발생여름 As Boolean = False
            Dim 오차발생겨울 As Boolean = False

            Dim 오차겨울퍼센트 As Decimal = (오차겨울 / 년면적당(1)) * 100
            Dim 오차여름퍼센트 As Decimal = (오차여름 / 년면적당(8)) * 100

            '//오차계산에따른 반복제어
            If 오차계산횟수 > 오차재계산횟수 Then
                ' MsgBox("오차계산횟수를 초과하였습니다" + vbCrLf + "개선작업이 종료됩니다.", MsgBoxStyle.Information, "확인")
                ok = False
                Exit While
            End If

            If 오차겨울퍼센트 > 0.1 Then
                오차발생겨울 = True
                If 년면적당(1) < 사용자입력값에너지사용량(1) Then
                    난방설정온도 += 0.5
                Else
                    난방설정온도 -= 0.5
                End If
            End If

            If 오차여름퍼센트 > 0.1 Then
                오차발생여름 = True
                If 년면적당(8) < 사용자입력값에너지사용량(8) Then
                    냉방설정온도 -= 0.5
                Else
                    냉방설정온도 += 0.5
                End If
            End If

            '//오차가발생하지않았다면 더이상 진행하지 않는다.
            If Not 오차발생여름 AndAlso Not 오차발생겨울 Then
                ok = True
                Exit While
            End If



            '//변경될 온도정보를 가지고 다시 계산합니다.
            If Me.Start("설계개선작업(" + (오차계산횟수 + 1).ToString() + "/" + 오차재계산횟수.ToString + ")" + vbCrLf + vbCrLf + _
                        "(겨울/여름)오차발생율:" + 오차겨울퍼센트.ToString("#0.00") + "%/" + 오차여름퍼센트.ToString("#0.00") + "%" + vbCrLf, ECalc.All, LogSB, (-1 * 오차), 난방설정온도, 냉방설정온도) Then   '//파라미터 True 라면 소요량이 추가로 게산된다.
                오차계산횟수 += 1
                Me.Summary.All()
                '오차 = 0
                'Continue While
            Else
                MsgBox("설계개선작업중 오류가 발생하였습니다." + vbCrLf + LogSB.ToString, MsgBoxStyle.Critical, "확인")
                ok = False
                Exit While
            End If

        End While


        '//가상결과데이터(DSR2)를 집계해서 실제결과DSR1에 넣는다.
        DSETR1.설계계산결과.Clear()
        DSETR1.설계계산결과.AcceptChanges()

        For i As Integer = 1 To 12
            Dim ndr As DSR.설계계산결과Row = DSETR1.설계계산결과.New설계계산결과Row
            ndr.월 = i.ToString("00")
            ndr.난방전 = (Result2.일차E소요량(i).난방소요량 / 년면적)
            ndr.냉방전 = (Result2.일차E소요량(i).냉방소요량 / 년면적)
            ndr.조명전 = (Result2.일차E소요량(i).조명소요량 / 년면적)
            ndr.급탕전 = +(Result2.일차E소요량(i).급탕소요량 / 년면적)
            ndr.환기전 = (Result2.일차E소요량(i).환기소요량 / 년면적)
            DSETR1.설계계산결과.Rows.Add(ndr)
        Next


        '//벽체 열관류율, 창호 열관류율, 일사투과율, 장비 효율, 조명밀도 등 적용
        '//면형태 : 벽체 - 외,내벽 :: tbl_yk 모든 열관류율을  = 0.1 *get열관류율을 마지막에 한번만 작동하도록 상수지정
        '//면형태 : 창호 - 외부창,내부창 = 1.0
        '//면형태 : 창호 - 외부창,내부창  일사투과율 = 0.3
        For Each drmn As DS.tbl_ykRow In DSET.tbl_yk.Select("code <> '0'")
            Dim 면형태코드 As String = drmn.면형태
            If 면형태코드.Trim = "" Then Continue For
            Dim 면형태 As String = Get_CName("1088", 면형태코드)
            Select Case 면형태
                Case "외벽(벽체)", "내벽(벽체)", "지중벽"
                    drmn.열관류율 = "0.1"
                Case "외부창", "내부창"
                    drmn.열관류율 = "1"
                    drmn.일사에너지투과율 = "0.3"
            End Select
        Next : DSET.tbl_yk.AcceptChanges()

        '//난방기기 , 정격보일러효율=0.9 , 히트난방정격7=4.5
        For Each drmn As DS.tbl_nanbangkikiRow In DSET.tbl_nanbangkiki.Select("code <> '0'")
            If CDec(drmn.정격보일러효율) < 90 Then
                drmn.정격보일러효율 = "90"
            End If
            If CDec(drmn.히트난방정격7) < 4.5 Then
                drmn.히트난방정격7 = "4.5"
            End If
        Next : DSET.tbl_nanbangkiki.AcceptChanges()

        '//냉방기기 , 열성능비 = 5.0
        For Each drmn As DS.tbl_nangbangkikiRow In DSET.tbl_nangbangkiki.Select("code <> '0'")
            If CDec(drmn.열성능비) < 5 Then
                drmn.열성능비 = "5.0"
            End If
        Next : DSET.tbl_nangbangkiki.AcceptChanges()

        '//조명밀도 : 조명에너지부하율입력치 : 6
        For Each drmn As DS.tbl_zoneRow In DSET.tbl_zone.Select("code <> '0'")
            If drmn.조명부하산출방법 = "입력치" Then
                drmn.조명에너지부하율입력치 = 6
            End If
        Next : DSET.tbl_zone.AcceptChanges()

        '//보정데이터유지하고 계산실행
        '//그래프출력시 발생한 오차를 데이터테이블에 표시
        '//변경될 온도정보를 가지고 다시 계산합니다.
        If Me.Start("설계개선작업II" + vbCrLf, ECalc.All, LogSB, (-1 * 오차), 난방설정온도, 냉방설정온도) Then   '//파라미터 True 라면 소요량이 추가로 게산된다.
            Me.Summary.All()
            ok = False
        End If

        For i As Integer = 1 To 12
            Dim ndr As DSR.설계계산결과Row = DSETR1.설계계산결과.Rows(i - 1)
            ndr.난방 = (Result2.일차E소요량(i).난방소요량 / 년면적)
            ndr.냉방 = (Result2.일차E소요량(i).냉방소요량 / 년면적)
            ndr.조명 = (Result2.일차E소요량(i).조명소요량 / 년면적)
            ndr.급탕 = +(Result2.일차E소요량(i).급탕소요량 / 년면적)
            ndr.환기 = (Result2.일차E소요량(i).환기소요량 / 년면적)
            ndr.AcceptChanges()
        Next

        DSETR1.설계계산결과.AcceptChanges()

        '//파라미터저장
        DSETR1.설계계산파라미터.Clear()
        Dim ndr3 As DSR.설계계산파라미터Row = DSETR1.설계계산파라미터.New설계계산파라미터Row
        ndr3.난방 = 난방설정온도.ToString
        ndr3.냉방 = 냉방설정온도.ToString
        ndr3.기저비율 = CDec(-1 * 오차).ToString()
        DSETR1.설계계산파라미터.Rows.Add(ndr3)
        DSETR1.설계계산파라미터.AcceptChanges()

        If ok Then
            Return True
        Else
            Return False
        End If
        Return True
    End Function

    Public Function Start(showmsg As String, ByVal CalcType As ECalc, ByRef logBuffer As System.Text.StringBuilder, 기저비율 As Decimal, Optional ByVal 난방설정온도 As Decimal = 20, Optional ByVal 냉방설정온도 As Decimal = 26) As Boolean

        pLog.Add("=====================================")
        pLog.Add("Calc Start")
        pLog.Add("=====================================", True)

        Me.Pub = New CShared    '//공용변수

        '//계산을 시작  p_CalcUse : 는 소요량 계산도 할건지으 ㅣ플래그 나중에 분리해야겠따.
        'Dim ST As Date = Now

        If Me.Pub.IsError Then

            MsgBox("계산준비중 오류발생", MsgBoxStyle.Critical + MsgBoxStyle.Question, "확인")
            Return False
        End If

        logBuffer = New System.Text.StringBuilder("")
        Dim Cnt As Integer = FixData()
        'log.AppendLine(">>데이터보정(" & Cnt.ToString & ")개의 데이터가 보정되었습니다")
        'log.AppendLine(">>유효성검사시작")
        If validation() = False Then Return False '//유효성 체크를 수행한다.

        If CalcType <> ECalc.Use AndAlso CalcType <> ECalc.설계개선안 Then
            'log.AppendLine(">>계산영역초기화")
            Clear_ResultArea()  '//과거의 계산영역을 클리어시킨다.
            'log.AppendLine(">>각존의 사용면적 계산")
            Result.사용면적.Calc() '//A_H,C,W,L,V 의 누적값을 계산(사용면적) : 개별프로시져로 할당
            'log.AppendLine(">>주계산시작")
        End If



        '//사용자가입력한 1차에너지사용량(=월별에너지사용량)을 변환계수를 이용해 값을 생성한다.
        DSETR1.월별1차에너지사용량.Rows.Clear() : DSETR2.월별1차에너지사용량.Rows.Clear()
        DSETR1.월별1차에너지사용량.AcceptChanges() : DSETR2.월별1차에너지사용량.AcceptChanges()
        Zone_Message("설계개선안 입력데이터 변환중(1/3)...", 1, 0, 3) : 입력값계수변환("0001")
        Zone_Message("설계개선안 입력데이터 변환중(2/3)...", 2, 0, 3) : 입력값계수변환("0002")
        Zone_Message("설계개선안 입력데이터 변환중(3/3)...", 1, 0, 3) : 입력값계수변환("0003")
        DSETR1.월별1차에너지사용량.AcceptChanges()
        DSETR2.월별1차에너지사용량.Merge(DSETR1.월별1차에너지사용량)
        DSETR2.월별1차에너지사용량.AcceptChanges()

        '//clear exportdata
        DSET1.tbl_exportdata.Clear()
        DSET1.tbl_exportdata.AcceptChanges()



        Dim Retval As Boolean
        Select Case CalcType
            Case ECalc.All
                pLog.LogEnable = False
                Retval = Zone.Calc_LoadOfZones(showmsg, IsSimulation, 기저비율, 난방설정온도, 냉방설정온도)
                pLog.LogEnable = True
                If Retval Then Retval = Zone.Calc_Useage(showmsg)
                Return Retval
            Case ECalc.REq
                pLog.LogEnable = True
                Return Zone.Calc_LoadOfZones(showmsg, IsSimulation, 기저비율, 난방설정온도, 냉방설정온도)
            Case ECalc.Use
                pLog.LogEnable = True
                Return Zone.Calc_Useage(showmsg)
            Case ECalc.설계개선안
                pLog.LogEnable = True
                Return 설계개선안계산()
        End Select

        pLog.LogEnable = True

    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 DSET.tbl_myoun.Select("code <> '0'")
            If DR면.건축부위방식 = "내벽" Or DR면.건축부위방식 = "간벽" Then
                If DR면.방위 <> Null Then
                    RetCnt += 1
                    DR면.방위 = Null
                End If
            End If
        Next
        For Each DR존 As DS.tbl_zoneRow In DSET.tbl_zone.Select("code <> '0'")
            If DR존.조명방식.ToString = "0" OrElse DR존.조명방식.ToString = "" Then
                RetCnt += 1
                LogSB.AppendLine("Zone " & DR존.설명.ToString & "] 의 조명방식이 없음으로 설정됩니다.")
                DR존.조명방식 = "(없음)"
            End If
            If DR존.인공광원.ToString = "0" OrElse DR존.인공광원.ToString = "" Then
                RetCnt += 1
                LogSB.AppendLine("Zone " & DR존.설명.ToString & "] 의 인공광원이 없음으로 설정됩니다.")
                DR존.인공광원 = "(없음)"
            End If
            If DR존.외기부하처리여부.ToString = "0" OrElse DR존.외기부하처리여부.ToString = "" Then
                RetCnt += 1
                LogSB.AppendLine("Zone " & DR존.설명.ToString & "] 의 외기부하처리여부가 아니오로 설정됩니다.")
                DR존.외기부하처리여부 = "아니오"
            End If

            'If DR존.조명방식.ToString.Trim = "" Then DR존.조명방식 = "(없음)"
            'If DR존.인공광원.ToString.Trim = "" Then DR존.인공광원 = "(없음)"
        Next

        DSET.AcceptChanges()  '//변경내용 적용
        Return RetCnt
    End Function
    Public Function validation() As Boolean
        pLog.Add("Calc Validation")
        '//존이 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, DSET.tbl_zone, "(없음)")   '//데이터를 기본값 셋팅해주는구문이구요 없는데이터는 넓값처리
        Set_Null(ColumnC, DSET.tbl_zone, "(없음)")   '//공용코드값이 아에없는 데이터를 기본값 셋팅해주는구문이구요 없는데이터는 넓값처리
        'Set_CheckCommon(ColumnC, DSET.tbl_zone, CGubun)    '//이거는 // 공용코드오류난 데이터 검색하는부분이에요
        Set_Null(Columnst, DSET.tbl_zone, "0")

        Title = "신재생에너지"
        Columns = New String() {"기기종류", "가동연료", "태양열종류", "집열기유형", _
                                "집열판방위", "태양열시스템의성능", "축열탱크설치장소", _
                                "태양광모듈기울기", "태양광모듈방위", _
                                "태양광모듈종류", "태양광모듈적용타입", _
                                "열교환기설치여부", "팽창탱크설치여부"}
        Set_Null(Columns, DSET.tbl_new, "(없음)")
        'Set_Null(Columnst, DSET.tbl_bunbae, "0")

        Title = "난방분배시스템"
        Columns = New String() {"생산기기구분", "표준치적용", "배관망유형", _
                                "배관구간방식", "배관설치장소", _
                                "배관설치장소", "지관장소"}
        Set_Null(Columns, DSET.tbl_nbunbae, "(없음)")
        'Set_Null(Columnst, DSET.tbl_bunbae, "0")

        Title = "난방기기"
        Columns = New String() {"열생산기기방식", "사용연료", "운전방식", "보일러방식", _
                                "지역난방방식", "단열등급", "축열탱크방식", _
                                "배관망유형", "펌프교정계수", "펌프제어유형", _
                                "분배시스템방식", "순환유무", "펌프제어", _
                                "히트펌프시스템종류", "신재생연결여부"}
        Columnst = New String() {"연결된시스템"}
        Set_Null(Columns, DSET.tbl_nanbangkiki, "(없음)")
        Set_Null(Columnst, DSET.tbl_nanbangkiki, "0")

        Title = "냉방기기"
        Columns = New String() {"냉동기방식", "냉동기종류", "냉동기압축방식", _
                                "압축기제어방식", "냉동기설비시스템", _
                                "냉동기설비시스템", "제어방식", _
                                "열생산연결방식", "사용연료", "증발식건식냉각기", _
                                "증발식냉각기", "보조방음기유무", "신재생연결여부"}
        Columnst = New String() {"온수열생산기기", "연결된시스템"}
        Set_Null(Columns, DSET.tbl_nangbangkiki, "(없음)")
        Set_Null(Columnst, DSET.tbl_nangbangkiki, "0")


        Title = "입력면"
        Columns = New String() {"건축부위방식", "블라인드유무", _
                                "블라인드위치", "방위", "블라인드빛종류", _
                                "블라인드색상", "블라인드각도"}
        Columnst = New String() {"존분류", "대차대조존"}
        Set_Null(Columns, DSET.tbl_myoun, "(없음)")
        Set_Null(Columnst, DSET.tbl_myoun, "0")


        Title = "난방공급시스템"
        Columns = New String() {"열공급시스템", "노출형제어", "바닥난방열제어", _
                                "바닥난방열건축부위", "바닥난방전기제어", "바닥난방전기건축부위", "전기난방제어"}
        Columnst = New String() {"열공급생산기기"}
        Set_Null(Columns, DSET.tbl_kongkub, "(없음)")
        Set_Null(Columnst, DSET.tbl_kongkub, "0")


        Title = "공조처리"
        Columns = New String() {"공조방식", "리턴공기혼합여부", "가습기유형", "외기냉방제어유무", "열교환기유형"}
        Set_Null(Columns, DSET.tbl_kongjo, "(없음)")
        'Set_Null(Columnst, DSET.tbl_bunbae, "0")

        Title = "냉방분배시스템"
        Columns = New String() {"냉매방식", "펌프운전제어유무"}
        Columnst = New String() {"냉동기"}
        Set_Null(Columns, DSET.tbl_bunbae, "(없음)")
        Set_Null(Columnst, DSET.tbl_bunbae, "0")


        '//모든공조데이터 순환
        For Each DR As DS.tbl_kongjoRow In DSET.tbl_kongjo.Select("code<>'0'")
            DR.팬효율산출방식 = DR.팬효율산출방식.Trim
            'MsgBox(DR.설명 & "==현재저장된값 : " & DR.팬효율산출방식 & " 길이 = " & DR.팬효율산출방식.Length)
            If DR.팬효율산출방식.Trim = "" Then DR.팬효율산출방식 = "입력치"
        Next
        'DSET.tbl_kongjo.AcceptChanges()
        DSET.AcceptChanges()

        '
        Dim waterok As Boolean = True
        For Each dr As DS.tbl_newRow In DSET1.tbl_new.Rows
            If dr.기기종류 = "수열" AndAlso dr.가동연료.Contains("없음") Then '//
                MsgBox("수열시스템의 가동연료가 정의되어 있지 않습니다.")
                Return False
            End If
        Next


        '//그값이 존에잇어요?cnrkehlsrp?추가된게?공조기기요
        For Each Dr As DS.tbl_zoneRow In DSET.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

        '//여기에서 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).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_commonRow = DSET.tbl_common.Select("gubun='" & gubunval(index) & "' and name='" & V & "'")
                    If Cdr.GetUpperBound(0) = -1 Then
                        MsgBox("값이있으나 공용코드에없음(여기에 경고문구좀 날려주시면되구요")
                    End If
                End If
                index += 1
            Next
        Next
    End Sub


    ''' <summary>
    ''' 계산결과 영역을 초기화시킵니다.
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub Clear_ResultArea()
        pLog.Add("Clear_ResultArea")

        DSETR.Clear() : DSETR.AcceptChanges() '//기존데이터 클리어

        '//0번시트의 결과값을 저장할 장소를 생성한다. Zone=00 은 합계필드이다(이것이 일률적이지않아서 00으로 할당을 따로 해서 나중에 합산작업을 할 예정)
        '//00번 존을포함하여 현재 존의 갯수+1개를 생성한다.

        '//최대냉난방/E분석
        Dim ZoneCode As String
        For Each Dr존 As DS.tbl_zoneRow In DSET.tbl_zone.Select("", "code")
            If Dr존.code = "0" Then
                ZoneCode = "00"
            Else
                ZoneCode = Dr존.code
            End If

            Dim Res1 As DSR.최대냉난방부하Row = DSETR.최대냉난방부하.New최대냉난방부하Row
            Res1.Zone = ZoneCode : DSETR.최대냉난방부하.Add최대냉난방부하Row(Res1)
            For ii As Integer = 1 To 12
                Dim DrE분석 As DSR.월별에너지분석Row = DSETR.월별에너지분석.New월별에너지분석Row
                DrE분석.월 = "M" & Format(ii, "00")  '//정렬을위해서 00숫자형태로 기록한다. 앞으로 모든 월데이터는 그렇게 기록함
                DrE분석.존 = ZoneCode
                DSETR.월별에너지분석.Add월별에너지분석Row(DrE분석)
                'MsgBox("M" & Format(ii, "00"), MsgBoxStyle.Information, ZoneCo'de)
            Next
        Next

        '//월별로 움직이는데이터
        Dim Mon As String
        Dim Dr As DataRow
        For ii As Integer = 0 To 12
            Mon = "M" & Format(ii, "00")

            Dr = DSETR.생산에너지.NewRow
            Dr("mon") = Mon  '//정렬을위해서 00숫자형태로 기록한다. 앞으로 모든 월데이터는 그렇게 기록함
            DSETR.생산에너지.Rows.Add(Dr)

            Dr = DSETR.에너지소요량.NewRow
            Dr("mon") = Mon  '//정렬을위해서 00숫자형태로 기록한다. 앞으로 모든 월데이터는 그렇게 기록함
            DSETR.에너지소요량.Rows.Add(Dr)

            Dr = DSETR.에너지소요량1.NewRow
            Dr("mon") = Mon  '//정렬을위해서 00숫자형태로 기록한다. 앞으로 모든 월데이터는 그렇게 기록함
            DSETR.에너지소요량1.Rows.Add(Dr)

        Next
        '//전부다시 구성해야함 
        DSETR.AcceptChanges()
    End Sub


    '''열관류율값ㅇㄹ 반환
    Public Function Get_열관류율(ByVal Dr As DS.tbl_myounRow) As Decimal
        Dim 열관류율2 As String = Dr.열관류율2  '//저장된 코드값 cmb_열관류율

        If IsNumeric(열관류율2) Then
            If CInt(열관류율2) > 0 Then
                Try
                    Dim Drow As DS.tbl_ykRow = DSET.tbl_yk.Select("code='" & 열관류율2 & "'")(0)
                    Return TOSG(Drow.열관류율) '//코드내에 저장된 값을 보낸다
                Catch ex As Exception
                    MsgBox("열관류율코드값(" & 열관류율2 & ") 값오류" & vbCrLf & ex.Message.ToString, MsgBoxStyle.Critical, "확인")
                    Return 0
                End Try
            End If
        End If

        Dim 열관 As Single = 0
        Try
            열관 = Single.Parse(Dr.열관류율)
        Catch ex As Exception
            열관 = 0
        End Try

        Return TOSG(Dr.열관류율)
        'If 열관 = 0 Then    '//0이므로 코드값을 찾는다.

        '    Try
        '        Dim Drow As DS.tbl_ykRow = DSET.tbl_yk.Select("code='" & 열관류율2 & "'")(0)
        '        Return TOSG(Drow.열관류율) '//코드내에 저장된 값을 보낸다
        '    Catch ex As Exception
        '        MsgBox("열관류율코드값(" & 열관류율2 & ") 값오류" & vbCrLf & ex.Message.ToString, MsgBoxStyle.Critical, "확인")
        '        Return 0
        '    End Try
        'Else    '//입력값이 잇으므로 입력값을 바로사용한다.

        'End If
    End Function


    Private Sub Zone_Message(Msg As String, pval As Integer, pmin As Integer, pmax As Integer) Handles Zone.Message
        If Not msgf Is Nothing Then
            msgf.Label1.Text = Msg
            msgf.ProgressBar1.Minimum = pmin
            msgf.ProgressBar1.Maximum = pmax
            msgf.ProgressBar1.Value = pval
            msgf.Label1.Refresh()
        Else
            msgf = New Frm_Work("계산중...")
            msgf.Label1.Text = Msg
            msgf.ProgressBar1.Minimum = pmin
            msgf.ProgressBar1.Maximum = pmax
            msgf.ProgressBar1.Value = pval
            msgf.TopMost = True
            msgf.Show()
        End If

        msgf.Refresh()
    End Sub

End Class

