데이터 표준점검 도구 v1.34_20221215 배포

MS-SQL Server의 VARCHAR(MAX)를 사용하여 표준 점검을 실행할 때, “형식이 일치하지 않습니다” 오류가 발생한다. 이 오류를 해결한 데이터 표준점검 도구 v1.34_20221215 를 배포한다.

데이터 표준점검 도구_2.1.화면 구성, 2.2.표준 점검 기능 – 생산성 Skill (prodskill.com)

이 글에 다음과 같은 댓글이 달렸다.

데이터 표준점검 도구 버그 내용 댓글
데이터 표준점검 도구 버그 내용 댓글

1. 현상

데이터 표준점검 도구 v1.33에서 VARCHAR(MAX) 형식의 속성 표준 점검을 시도하면,

데이터 표준점검 도구 v1.33에서 VARCHAR(MAX) 형식의 속성 표준 점검 시도
데이터 표준점검 도구 v1.33에서 VARCHAR(MAX) 형식의 속성 표준 점검 시도

다음과 같이 “’13’ 런타임 오류가 발생하였습니다.: 형식이 일치하지 않습니다.” 오류가 발생한다.

"'13' 런타임 오류가 발생하였습니다.: 형식이 일치하지 않습니다." 오류 발생
“’13’ 런타임 오류가 발생하였습니다.: 형식이 일치하지 않습니다.” 오류 발생

2. 원인

속성의 Data Type에 지정된 길이(Length)는 정수형(예: 10, 100 등)으로 가정하여 VBA 코드상에서 정수형 변수에 값을 할당하는데, “MAX”는 정수형이 아니라서 발생하는 오류이다.

아래 CStdDomainDic 클래스의 Load 프로시져 소스이다. 오류는 19행의 코드에서 발생한다.

'CStdDomainDic
Public Sub Load(aBaseRange As Range)
    Dim oStdDomain As CStdDomain
    Dim lRow As Long

    '목록에 아무 값이 없는 경우 exit
    If Trim(aBaseRange.Offset(1, 0)) = "" Then Exit Sub

    Dim vRngArr As Variant
    vRngArr = Range(aBaseRange, aBaseRange.End(xlDown)).Resize(, 8).Value2 '읽는 범위: 8개 컬럼

    For lRow = LBound(vRngArr) To UBound(vRngArr)
        Set oStdDomain = New CStdDomain
        With oStdDomain
            .m_s도메인분류명 = vRngArr(lRow, 1)
            .m_s도메인논리명 = vRngArr(lRow, 2)
            .m_s도메인물리명 = vRngArr(lRow, 3)
            .m_s도메인설명 = vRngArr(lRow, 4)
            .m_s데이터타입명 = vRngArr(lRow, 5)
            .m_i길이 = vRngArr(lRow, 6)  '<-- 여기에서 오류 발생
            .m_i정도 = vRngArr(lRow, 7)
            .m_s데이터타입길이명 = vRngArr(lRow, 8)
            '.m_s데이터타입길이명 = GetDataTypeStr(.m_s데이터타입명, .m_i길이, .m_i정도)
        End With

        Me.Add oStdDomain
    Next lRow
...
End Sub

3. 조치 내용

다음과 같이 데이터 형식에 따라서 다른 변수에 길이 값을 할당하도록 변경하고, 문자형 변수인 m_s길이를 데이터 길이를 비교할 때 사용하였다.

'CStdDomainDic
Public Sub Load(aBaseRange As Range)
    Dim oStdDomain As CStdDomain
    Dim lRow As Long

    '목록에 아무 값이 없는 경우 exit
    If Trim(aBaseRange.Offset(1, 0)) = "" Then Exit Sub

    Dim vRngArr As Variant
    vRngArr = Range(aBaseRange, aBaseRange.End(xlDown)).Resize(, 8).Value2 '읽는 범위: 8개 컬럼

    For lRow = LBound(vRngArr) To UBound(vRngArr)
        Set oStdDomain = New CStdDomain
        With oStdDomain
            .m_s도메인분류명 = vRngArr(lRow, 1)
            .m_s도메인논리명 = vRngArr(lRow, 2)
            .m_s도메인물리명 = vRngArr(lRow, 3)
            .m_s도메인설명 = vRngArr(lRow, 4)
            .m_s데이터타입명 = vRngArr(lRow, 5)
            If TypeName(vRngArr(lRow, 6)) = "String" Then '<-- 데이터 형식에 따라서 다른 변수에 길이 값 할당
                .m_s길이 = CStr(vRngArr(lRow, 6))
            Else
                .m_i길이 = vRngArr(lRow, 6)
            End If
            .m_i정도 = vRngArr(lRow, 7)
            .m_s데이터타입길이명 = vRngArr(lRow, 8)
            '.m_s데이터타입길이명 = GetDataTypeStr(.m_s데이터타입명, .m_i길이, .m_i정도)
        End With

        Me.Add oStdDomain
    Next lRow
...
End Sub

문자형 변수인 m_s길이를 데이터 길이를 비교할 때 사용한 코드는 다음과 같다. 13행 ~ 18행까지가 추가한 코드이다.

'CStdDomainDic
'두 Domain의 TypeSize 비교결과 return
'aDomainAtt: 비교기준 Domain (속성지정 Type/Size)
'aDomainTgt: 비교대상 Domain (용어 또는 속성분류어 Type/Size)
Public Function GetCompareResult(aCompareType As String, _
            aDomainAtt As CStdDomain, aDomainTgt As CStdDomain) As String
    Dim sResult As String
    sResult = aCompareType + " Type/Size 비교 결과"
    If aDomainAtt.m_s데이터타입명 <> aDomainTgt.m_s데이터타입명 Then
        sResult = sResult + vbLf + "타입 불일치"
    End If
    
    If aDomainAtt.IsStringLength Or aDomainTgt.IsStringLength Then
        If UCase(aDomainAtt.m_s길이) <> UCase(aDomainTgt.m_s길이) Then
            sResult = sResult + vbLf + "길이 불일치"
        Else
            sResult = aCompareType + " Type/Size 일치"
        End If
    ElseIf aDomainAtt.m_i길이 <> aDomainTgt.m_i길이 Then
        sResult = sResult + vbLf + "길이 불일치"
        If aDomainAtt.m_i길이 > aDomainTgt.m_i길이 Then '속성의 Size가 더 큰 경우(도메인 추가 또는 속성 size 조정)
            sResult = sResult + "(감소! 도메인 추가 또는 속성 Size 조정 필요)"
        ElseIf aDomainAtt.m_i길이 < aDomainTgt.m_i길이 Then '비교 대상 Domain Size가 더 큰 경우(대부분은 문제없음)
            sResult = sResult + "(증가 확인)"
        End If
    ElseIf aDomainAtt.m_i정도 <> aDomainTgt.m_i정도 Then
        sResult = sResult + vbLf + "소수점 길이 불일치"
        If aDomainAtt.m_i정도 > aDomainTgt.m_i정도 Then '속성의 Size가 더 큰 경우(도메인 추가 또는 속성 size 조정)
            sResult = sResult + "(감소! 도메인 추가 또는 속성 Size 조정 필요)"
        ElseIf aDomainAtt.m_i정도 < aDomainTgt.m_i정도 Then '비교 대상 Domain Size가 더 큰 경우(대부분은 문제없음)
            sResult = sResult + "(증가 확인)"
        End If
    Else
        sResult = aCompareType + " Type/Size 일치"
    End If
    GetCompareResult = sResult
End Function

다음과 같이 오류없이 점검결과를 표시한다.

데이터 표준점검 도구 v1.34에서 VARCHAR(MAX) 형식의 속성 표준 점검 결과
데이터 표준점검 도구 v1.34에서 VARCHAR(MAX) 형식의 속성 표준 점검 결과

4. 데이터 표준점검 도구 v1.34_20221215 다운로드

패치버전을 github에 올려 두었고, 아래 URL에서 다운로드할 수 있다.

https://github.com/DAToolset/ToolsForDataStandard/raw/main/속성%20표준점검%20도구_v1.34_20221215_1.xlsm

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

ko_KR한국어