Herramienta de verificación de estándares de distribución de datos v1.35_20230321

Al utilizar la función de verificación estándar basada en el nombre físico, se produjo un error de tiempo de ejecución "'424'. Necesitamos un objeto”. Hay casos en los que se produce un error en el mensaje. Distribuimos la herramienta de verificación estándar de datos v1.35_20230321, que corrige este error.

*(Referencia) Último artículo distribuido: Implementar herramienta de verificación de estándares de datos v1.34_20221215

1. Fenómeno

Cuando ingresa un nombre de columna en la columna C (nombre de columna (nombre físico)) en la hoja "Verificación estándar (basada en el nombre físico)" y hace clic en el botón de verificación estándar, se produce el siguiente error de tiempo de ejecución "424". Necesitamos un objeto”. Se produce un error.

'424' 런타임 오류가 발생하였습니다. 개체가 필요합니다.
'424' Se produjo un error de tiempo de ejecución. Se requiere un objeto.

2. causa

Este error no siempre ocurre y ocurre cuando el nombre físico se divide por un delimitador (_, guión bajo) y cada token no está en el nombre físico en el diccionario de palabras.

Private Sub cmdRun_Click()
...
    '------------------------------------------------------------------------------------------
    '물리명 기준으로 논리명 찾기
    Dim aColNamePart() As String, lColNamePartIdx As Long, oColNamePartAsStdWord As Collection
    Dim oStdWordObj As Object, oStdWord As CStdWord, sLName As String
    For lRow = LBound(vInRngArr) To UBound(vInRngArr)
        sColName = vInRngArr(lRow, 1)
        If Trim(sColName) = "" Then GoTo SkipBlank '점검할 속성명이 비어있는 경우 Skip
        aColNamePart = Split(sColName, "_")
        Set oColNamePartAsStdWord = Nothing
        Set oColNamePartAsStdWord = New Collection
        sLName = ""
        For lColNamePartIdx = LBound(aColNamePart) To UBound(aColNamePart)
            Set oStdWordObj = oStdWordDic.ItemP(aColNamePart(lColNamePartIdx)) '<-- 오류 발생
            oColNamePartAsStdWord.Add oStdWordObj
            If TypeOf oStdWordObj Is CStdWord Then
                Set oStdWord = oStdWordObj
                sLName = sLName + IIf(sLName = "", "", "_") + oStdWord.m_s단어논리명
            End If
            oOutRange.Offset(lRow - 1, 0).Value2 = sLName
        Next lColNamePartIdx
SkipBlank:
    Next lRow
...
End Sub

En la línea 15 del código anterior, aColNamePart(lColNamePartIdx) significa el enésimo valor de los tokens dividido por el carácter de subrayado. Se produce un error cuando este valor no existe en ItemP (un objeto de diccionario que administra nombres físicos como claves y objetos de palabras como valores) de oStdWordDic (objeto de diccionario de palabras).

3. Medidas

El código se cambió de la siguiente manera.

Private Sub cmdRun_Click()
...
    '------------------------------------------------------------------------------------------
    '물리명 기준으로 논리명 찾기
    Dim aColNamePart() As String, lColNamePartIdx As Long, oColNamePartAsStdWord As Collection
    Dim oStdWordObj As Object, oStdWord As CStdWord, sLName As String
    Dim sTokenP As String, sTokenL As String
    For lRow = LBound(vInRngArr) To UBound(vInRngArr)
        sColName = vInRngArr(lRow, 1)
        If Trim(sColName) = "" Then GoTo SkipBlank '점검할 속성명이 비어있는 경우 Skip
        aColNamePart = Split(sColName, "_")
        Set oColNamePartAsStdWord = Nothing
        Set oColNamePartAsStdWord = New Collection
        sLName = ""
        For lColNamePartIdx = LBound(aColNamePart) To UBound(aColNamePart)
            sTokenP = aColNamePart(lColNamePartIdx)
            sTokenL = ""
            If oStdWordDic.ExistsP(sTokenP) Then '단어 물리명이 사전에 있는 경우
                Set oStdWordObj = oStdWordDic.ItemP(aColNamePart(lColNamePartIdx))
                oColNamePartAsStdWord.Add oStdWordObj
                If TypeOf oStdWordObj Is CStdWord Then
                    Set oStdWord = oStdWordObj
                    sTokenL = oStdWord.m_s단어논리명
                End If
            Else
                '단어 물리명이 사전에 없는 경우
                sTokenL = "[" + sTokenP + "]"
            End If
            sLName = sLName + IIf(sLName = "", "", "_") + sTokenL
            oOutRange.Offset(lRow - 1, 0).Value2 = sLName
        Next lColNamePartIdx
SkipBlank:
    Next lRow
...
End Sub

Para evitar errores, distinguimos entre casos donde el nombre físico de una palabra está en el diccionario (línea 18) y casos donde no está (línea 25), y cuando no está en el diccionario, “[…]” ]” y lo hizo destacar usando formato condicional.

Si el nombre físico de una palabra no está en el diccionario, se muestra como en el siguiente ejemplo. Este es un ejemplo de cómo ingresar intencionalmente YMDX, ABC y DEF, que no están en el diccionario.

데이터 표준점검 도구 v1.35_20230321 오류 수정: 단어 사전에 없는 YMDX, ABC, DEF를 입력한 예시
Herramienta de verificación estándar de datos v1.35_20230321 Corrección de errores: ejemplo de ingreso de YMDX, ABC y DEF que no están en el diccionario de palabras

4. Descargue la herramienta de verificación estándar de datos v1.35_20230321

La versión del parche se cargó en github y se puede descargar desde la siguiente URL.

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

9 Respuestas

  1. foto de avatar KSM dice:

    Esta es una consulta de diccionario estándar en Config relacionada con el repositorio de diccionario estándar.
    Base de datos de repositorio: PostgreSQL, base de datos de destino de estandarización: SQL Server

    – Consulta de diccionario de palabras estándar
    SELECCIONE ROW_NUMBER() SOBRE (ORDENAR POR D.DIC_LOG_NM) COMO NO
    ,D.DIC_LOG_NM AS “nombre lógico de palabra”
    ,D.DIC_PHY_NM AS “Nombre de física de palabras”
    ,D.DIC_PHY_FLL_NM AS “nombre de palabra en inglés”
    ,D.DIC_DESC AS “Descripción de palabra”
    ,D.STANDARD_YN AS “Si es estándar”
    ,(caso D.ATTR_CLSS_YN cuando 'Y' luego 'Y' en caso contrario 'N' END) AS “Si es una palabra de clasificación de atributos”
    ,CASO
    CUANDO D.STANDARD_YN = 'Y' Y SIM.El nombre lógico estándar ES NULO ENTONCES D.DIC_LOG_NM
    CUANDO D.STANDARD_YN = 'Y' AND SIM.El nombre lógico estándar NO ES NULO ENTONCES SIM.El nombre lógico estándar
    ELSE SIM.Nombre lógico estándar
    FIN “Nombre lógico estándar”
    ,SIM.Sinónimo
    ,G.DOM_GRP_NM AS “Nombre de clasificación del dominio”
    /*
    ,D.ENT_CLSS_YN AS “¿Palabra de clasificación de entidad o no?
    */
    DESDE software de datos.STD_AREA A
    , software de datos.STD_DIC D
    izquierda combinación externa
    (SELECCIONE DM.KEY_DOM_NM
    ,MAX(DM.DOM_GRP_ID) DOM_GRP_ID
    ,MAX(DG.DOM_GRP_NM) DOM_GRP_NM
    DESDE software de datos.STD_DOM DM
    , software de datos.STD_DOM_GRP DG
    WHERE DM.STD_AREA_ID = '¡¡¡Necesita comprobar el valor de la clave!!!'
    Y DM.AVAL_END_DT = '99991231235959'
    Y DG.STD_AREA_ID = DM.STD_AREA_ID
    Y DG.AVAL_END_DT = '99991231235959'
    Y DM.DOM_GRP_ID = DG.DOM_GRP_ID
    GRUPO POR DM.KEY_DOM_NM) G
    en D.DIC_LOG_NM = G.KEY_DOM_NM
    izquierda combinación externa
    (
    — Si es estándar
    SELECCIONE A.P_DIC_ID “ID de grupo”
    ,AP_DIC_ID DIC_ID
    ,P.DIC_LOG_NM “Nombre lógico estándar”
    ,STRING_AGG(C.DIC_LOG_NM, ',' ORDER BY A.C_DIC_ID) “Sinónimo”
    DESDE software de datos.STD_DIC_REL A
    dataware de unión externa izquierda.STD_DIC P
    en A.P_DIC_ID = P.DIC_ID AND P.AVAL_END_DT = '99991231235959'
    dataware de unión externa izquierda.STD_DIC C
    en A.C_DIC_ID = C.DIC_ID y C.AVAL_END_DT = '99991231235959'
    DONDE 1=1
    AND A.P_STD_AREA_ID = (SELECT STD_AREA_ID FROM DATAWARE.STD_AREA WHERE AVAL_END_DT = '99991231235959' AND STD_AREA_NM = 'Diccionario estándar')
    Y A.AVAL_END_DT = '99991231235959'
    GRUPO POR A.P_DIC_ID, P.DIC_LOG_NM
    UNIÓN TODOS
    — Si no es estándar
    SELECCIONE AA.P_DIC_ID “ID de grupo”
    ,AC_DIC_ID DIC_ID
    ,P.DIC_LOG_NM “Nombre lógico estándar”
    ,STRING_AGG(CASE WHEN AA.C_DIC_ID = A.C_DIC_ID THEN P.DIC_LOG_NM ELSE C.DIC_LOG_NM END, ',' ORDER by CASE WHEN AA.C_DIC_ID = A.C_DIC_ID THEN '0' ELSE AA.C_DIC_ID END) “Sinónimo”
    DESDE software de datos.STD_DIC_REL A
    , software de datos.STD_DIC_REL AA
    , software de datos.STD_DIC P
    , software de datos.STD_DIC C
    DONDE 1=1
    AND A.P_STD_AREA_ID = (SELECT STD_AREA_ID FROM DATAWARE.STD_AREA WHERE AVAL_END_DT = '99991231235959' AND STD_AREA_NM = 'Diccionario estándar')
    Y A.AVAL_END_DT = '99991231235959'
    Y A.P_DIC_ID = AA.P_DIC_ID
    Y AA.P_DIC_ID = P.DIC_ID
    Y P.AVAL_END_DT = '99991231235959'
    Y AA.C_DIC_ID = C.DIC_ID
    Y C.AVAL_END_DT = '99991231235959'
    GRUPO POR AA.P_DIC_ID, A.C_DIC_ID, P.DIC_LOG_NM
    ) Tarjeta SIM
    en D.DIC_ID = SIM.DIC_ID
    WHERE A.STD_AREA_NM = 'Diccionario estándar'
    Y A.STD_AREA_ID = D.STD_AREA_ID
    Y D.AVAL_END_DT = '99991231235959'
    AND D.DIC_GBN_CD = '0001' /* '0001': palabra */
    /* AND D.STANDARD_YN = Extrae sólo palabras estándar 'Y' */
    ORDER BY D.DIC_LOG_NM, (caso D.STANDARD_YN cuando 'Y' y luego 1 más 2 terminan)
    ;

    –Consulta del diccionario de terminología estándar
    SELECCIONE ROW_NUMBER() SOBRE (ORDENAR POR D.DIC_LOG_NM) COMO NO
    ,D.DIC_LOG_NM AS “Nombre lógico del término”
    ,
    (
    SELECCIONE STRING_AGG(X.DIC_LOG_NM, '_')
    DE
    (
    SELECCIONE WRD.DIC_LOG_NM
    DESDE STD_DIC COMO WRD
    UNIÓN EXTERNA IZQUIERDA STD_WORD_COMBI AS C
    EN WRD.STD_AREA_ID = C.STD_AREA_ID
    Y WRD.DIC_ID = C.WORD_ID
    WHERE C.STD_AREA_ID = (SELECT STD_AREA_ID FROM DATAWARE.STD_AREA WHERE AVAL_END_DT = '99991231235959' AND STD_AREA_NM = 'Diccionario estándar')
    Y C.TERM_ID = D.DIC_ID
    Y C.AVAL_END_DT = '99991231235959'
    PEDIDO POR C.ORDER_NO
    ) COMO
    ) COMO “Combinación de nombres lógicos de palabras”
    ,D.DIC_PHY_NM AS “Nombre de física del término”
    ,D.DIC_DESC AS “Glosario”
    ,DM.DOM_NM AS “Nombre lógico de dominio”
    ,UPPER(DT.DATA_TYPE) COMO “tipo de datos”
    — ,DM.DATA_LEN COMO “Longitud”
    ,(caso en que DM.DATA_LEN = -1 y luego 'MAX' en caso contrario text(DM.DATA_LEN) END) AS “Longitud”
    ,DM.DATA_SCALE AS “grado”
    ”, como “Definición de trabajo”
    , SUPERIOR (DT.DATA_TYPE)
    ||caso
    cuando DM.DATA_LEN es nulo y UPPER(DT.DATA_TYPE) no está en ('INT', 'DATETIME2'), entonces nulo
    cuando DM.DATA_LEN es nulo y UPPER(DT.DATA_TYPE) en ('INT', 'DATETIME2') entonces "
    CUANDO DM.DATA_LEN = -1 Y DM.DATA_SCALE ES NULL y SUPERIOR (DT.DATA_TYPE) en ('VARCHAR', 'VARBINARY') ENTONCES '(MAX'
    más '('||DM.DATA_LEN
    fin
    ||CASO CUANDO DM.DATA_LEN NO ES NULO Y DM.DATA_SCALE ES NULO ENTONCES ')'
    CUANDO DM.DATA_LEN NO ES NULO y DM.DATA_LEN > 0 Y DM.DATA_SCALE NO ES NULO ENTONCES ','||DM.DATA_SCALE||')'
    CUANDO DM.DATA_LEN ES NULO Y DM.DATA_SCALE ES NULO y SUPERIOR (DT.DATA_TYPE) en ('INT', 'DATETIME2') ENTONCES "
    ELSE FINAL NULO
    COMO “Tamaño de tipo”
    DESDE software de datos.STD_AREA A
    , software de datos.STD_DIC D
    , software de datos.STD_DOM DM
    , software de datos.STD_DATATYPE DT
    WHERE A.STD_AREA_NM = 'Diccionario estándar'
    Y A.STD_AREA_ID = D.STD_AREA_ID
    Y D.AVAL_END_DT = '99991231235959'
    AND D.DIC_GBN_CD = '0002' /* '0002': término */
    AND D.STANDARD_YN = 'Y' /* Extraer solo términos estándar */
    Y DM.STD_AREA_ID = D.STD_AREA_ID
    Y DM.AVAL_END_DT = '99991231235959'
    Y DM.DOM_ID = D.DOM_ID
    Y DT.DB_TYPE = '0006' –SERVIDOR SQL
    Y DT.CD_NO = DM.DATA_TYPE_CD
    ;

    –Consulta de diccionario de dominio estándar
    SELECCIONE ROW_NUMBER() SOBRE (ORDENAR POR DG.DOM_GRP_NM, DM.DOM_NM) COMO NO
    ,DG.DOM_GRP_NM AS “Nombre de clasificación del dominio”
    ,DM.DOM_NM AS “Nombre lógico de dominio”
    ,DM.KEY_DOM_PHY_NM AS “Nombre físico del dominio clave”
    ,(caso DM.DOM_DESC cuando es nulo y luego DM.KEY_DOM_NM en caso contrario DM.DOM_DESC END) COMO “Descripción del dominio”
    ,UPPER(DT.DATA_TYPE) AS “Nombre del tipo de datos”
    ,(caso en que DM.DATA_LEN = -1 y luego 'MAX' en caso contrario text(DM.DATA_LEN) END) AS “Longitud”
    ,DM.DATA_SCALE AS “grado”
    , SUPERIOR (DT.DATA_TYPE)
    ||caso
    cuando DM.DATA_LEN es nulo y UPPER(DT.DATA_TYPE) no está en ('INT', 'DATETIME2'), entonces nulo
    cuando DM.DATA_LEN es nulo y UPPER(DT.DATA_TYPE) en ('INT', 'DATETIME2') entonces "
    CUANDO DM.DATA_LEN = -1 Y DM.DATA_SCALE ES NULL y SUPERIOR (DT.DATA_TYPE) en ('VARCHAR', 'VARBINARY') ENTONCES '(MAX'
    más '('||DM.DATA_LEN
    fin
    ||CASO CUANDO DM.DATA_LEN NO ES NULO Y DM.DATA_SCALE ES NULO ENTONCES ')'
    CUANDO DM.DATA_LEN NO ES NULO y DM.DATA_LEN > 0 Y DM.DATA_SCALE NO ES NULO ENTONCES ','||DM.DATA_SCALE||')'
    CUANDO DM.DATA_LEN ES NULO Y DM.DATA_SCALE ES NULO y SUPERIOR (DT.DATA_TYPE) en ('INT', 'DATETIME2') ENTONCES "
    ELSE FINAL NULO
    COMO “Tamaño de tipo”
    /*
    ,DM.KEY_DOM_NM AS “Nombre de dominio clave”
    */
    DESDE software de datos.STD_DOM DM
    , software de datos.STD_DOM_GRP DG
    , software de datos.STD_DATATYPE DT
    WHERE DM.STD_AREA_ID = (SELECT STD_AREA_ID FROM DATAWARE.STD_AREA WHERE AVAL_END_DT = '99991231235959' AND STD_AREA_NM = 'Diccionario estándar')
    Y DM.AVAL_END_DT = '99991231235959'
    Y DG.STD_AREA_ID = DM.STD_AREA_ID
    Y DG.AVAL_END_DT = '99991231235959'
    Y DG.DOM_GRP_ID = DM.DOM_GRP_ID
    Y DT.DB_TYPE = '0006'
    Y DT.CD_NO = DM.DATA_TYPE_CD
    ;

    • foto de avatar Zerom dice:

      Gracias por compartir el SQL de búsqueda de diccionario estándar.
      También lo usaré cuando use la versión PostgreSQL.

      La sangría de los espacios no se muestra en los comentarios.
      Encontremos una manera.

  2. foto de avatar KSM dice:

    Al verificar el estándar, si el nombre de la propiedad (NÚMERO DE CLIENTE) se combina solo con palabras en inglés, hay un síntoma de que la combinación de palabras estándar y la coincidencia en inglés estándar no se pueden verificar incluso si el término estándar está registrado. Me pregunto si tiene algo que ver con la lógica que trata a los delimitadores como guiones bajos y espacios.
    EX)
    *Palabras estándar, abreviaturas
    CLIENTES, CLIENTES
    NÚMERO, NO
    *Término estándar, dominio
    NÚMERO DE CLIENTE, NÚMERO V10
    *Dominio estándar, tipo de datos
    NÚMERO V10, VARCHAR(10)

    • foto de avatar Zerom dice:

      https://prodskill.com/ko/data-standard-checker-4-case-study/#33_%ED%91%9C%EC%A4%80%EC%A0%90%EA%B2%80_%EC%98%88%EC%8B%9C_Case_2_%ED%91%9C%EC%A4%80%EB%8B%A8%EC%96%B4_%EC%A1%B0%ED%95%A9

      Este artículo contiene lo siguiente:
      —————————————————————
      El atributo “Personal o no” (Fila# 9) contiene un espacio. El hecho de que "[Asunto personal]_Si" se muestra en la sección "Combinación de nombres lógicos de palabras estándar" significa que "[Asunto personal]" no está en el diccionario estándar y "si" está en el diccionario estándar. Esta celda también contiene caracteres no registrados, por lo que el color de fondo se establece en rojo. Si se incluye un delimitador en el nombre de la propiedad, "(Especificado por el usuario)" se muestra en el elemento "Resultado de la verificación del nombre de la propiedad".
      —————————————————————

      Los caracteres de espacio en los nombres de atributos sujetos a inspección estándar se utilizan intencionalmente para separar palabras.
      Con la función implementada actualmente, si se permite un espacio en el nombre lógico de un término estándar, no se verifica la coincidencia según el término estándar.

      Parece que la inspección deseada se puede realizar creando una opción para seleccionar si se deben tratar los espacios ingresados en el nombre de la propiedad para ser inspeccionados como "delimitadores de palabras previstos" o como "caracteres de espacio" en sí mismos.

      ¿Lo necesitas? ^^

      • foto de avatar KSM dice:

        En el caso de modelar en inglés, es difícil identificar palabras si el nombre de la propiedad se adjunta como una palabra coreana, por lo que si necesita separar las palabras en inglés con un espacio, necesitará una opción. ^^;;

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

es_ESEspañol