データ標準チェックツールv1.34_20221215展開
MS-SQL ServerのVARCHAR(MAX)を使用して標準チェックを実行すると、「形式が一致しません」というエラーが発生します。このエラーを解決したデータ標準チェックツールv1.34_20221215を展開します。
データ標準チェックツール_2.1.画面構成、2.2.標準チェック機能 - 生産性Skill(prodskill.com)
この記事には次のようなコメントがありました。
1.現象
データ標準チェックツールv1.33でVARCHAR(MAX)形式のプロパティ標準チェックを試みると、
次のように、「 '13'ランタイムエラーが発生しました。フォーマットが一致しません。」エラーが発生します。
2.原因
属性のData Typeに指定された長さは、整数型(たとえば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
次のようにエラーなしでチェック結果を表示します。
4. データ標準チェックツール v1.34_20221215 ダウンロード
パッチバージョンをgithubにアップロードし、以下のURLからダウンロードできます。
https://github.com/DAToolset/ToolsForDataStandard/raw/main/属性標準チェックツール_v1.34_20221215_1.xlsm