Macro DA#(6): API del modelador DA#
Este artículo examina el modelo de objetos de la API del modelador DA# que se usa en la macro DA#, la composición del código VBA y los ejemplos de código fuente.
5. API del modelador DA#
5.1. Modelo de objetos de la API del modelador DA#
Publicación anterior (Macro DA# (1): descripción general de DA#, API DA#, macro DA#) presentó brevemente el modelo de objetos API DA#.
La lista de clases proporcionada por DA# Modeler es la siguiente. (Lo verifiqué con la función 'Buscar objeto' en Excel VBE (Editor de Visual Basic).)
El modelo de objeto de DA# Modeler API es el siguiente. (Esto no está en el manual oficial, y lo organicé yo mismo).
Entre ellos, la jerarquía de objetos desde la aplicación hasta el atributo, que es la más básica, es la siguiente.
1)Aplicación -> 2)Modelos -> 3)Modelo -> 4)Entidades -> 5)Entidad -> 6)Atributos -> 7)Atributo
Si esta capa se expresa como un modelo de ejemplo de DA# Modeler, es como sigue.
A continuación, se incluye un breve resumen de la jerarquía, el concepto y el uso del modelo de objetos de la API del modelador DA#.
5.2. Uso de la API del modelador DA# en Excel VBA
API del modelador DA# en Excel VBA Enlace anticipado Para usarlo de esta manera, primero debe agregar una referencia a la biblioteca "Modeler5".
▼ Cambie a Excel VBE (Editor de Visual Basic) (tecla de acceso directo alternativa + F11) para ejecutar el menú Herramientas > Referencia.
▼ Verifique y seleccione “Modeler5” en la lista de “Referencias disponibles” y haga clic en el botón “Aceptar”.
Ahora puedes escribir código VBA como este:
'Modeler5 Application 개체 생성 Dim odApp As Modeler5.Application Set odApp = New Modeler5.Application '새 모델 개체 생성 Dim odModel As Modeler5.Model Set odModel = odApp.GetModelMustBe("새모델") 'Entity 생성과 값 할당 Dim odEntity As Modeler5.Entity Set odEntity = odModel.GetEntityMustBe("엔터티1") odEntity.TableName = "Table1" 'Attribute 생성과 값 할당 Dim odAttribute As Modeler5.Attribute Set odAttribute = odEntity.GetAttributeMustBe("속성1") odAttribute.ColName = "Column1"
5.3. Configuración de código VBA macro DA#
La hoja de trabajo, el formulario de usuario, el módulo, la lista de clases y una breve descripción son los siguientes.
▼ Objeto de hoja de trabajo
- shtAttributeGet: Implementación de la función de interfaz de usuario de la hoja "Atributo (Obtener)"
- shtAttributeSet: Implementación de la función de interfaz de usuario de la hoja "Atributo (Conjunto)"
- shtEntityGet: Implementación de la función de interfaz de usuario de la hoja "Entidad (Obtener)"
- shtEntitySet: Implementación de la función de interfaz de usuario de la hoja "Entidad (Conjunto)"
- shtReverse: Implementar la función de interfaz de usuario de la hoja "Reverse"
▼ Objeto de formulario
- frmModelFromFile: el formulario de usuario que se muestra al hacer clic en el botón "Seleccionar modelo (archivo)"
- frmProgress: formulario de usuario para mostrar el progreso (ProgressBar) al procesar una función
▼ Objeto de módulo
- modDAConstType: declaración constante requerida para la implementación de funciones, implementación de DA# Enum y función de conversión de nombres
- modDAModeler: Implementación de funciones relacionadas con DA# (GetModel, Reverse, SetEntity, SetAttribute, etc.)
- modTest: código de prueba
- modUtil: funciones comunes (DoLog, ClearList, GetElapsedTime, etc.)
- modWinAPI: actualmente en desuso
▼ Objeto de módulo de clase
- CDAAttribute: Clase de 1 unidad de atributo
- CDAAttributeList: una clase que gestiona la lista de atributos como una estructura de diccionario (clave-valor)
- Clave: ModelName:KeyName (KeyName es nombre de entidad.nombre de propiedad o nombre de tabla.formato de nombre de columna)
- Valor: instancia de CDAAttribute
- CDAEntity: Una clase de 1 unidad de entidad
- CDAEntityList: una clase que administra la lista de entidades como una estructura de diccionario (clave-valor)
- Clave: ModelName:KeyName (KeyName es el nombre de la entidad o el nombre de la tabla)
- Valor: instancia de CDAEntity
- CDAFK: Una clase de una unidad FK
- CDAFKList: Clase que gestiona la lista FK como una estructura de Diccionario (Clave-Valor)
- Clave: ModelName: nombre de la entidad principal -> nombre de la entidad secundaria
- Valor: instancia CDAFK
- CDAModel: Clase de una unidad Modelo
- CDAModelList: una clase que gestiona la lista de modelos como una estructura de diccionario (clave-valor)
- Clave: Nombre del modelo
- Valor: instancia de CDAModel
- CDASubject: Clase de una unidad de área temática
- CDASubjectList: una clase que administra la lista de áreas temáticas como una estructura de diccionario (clave-valor)
- Clave: Nombre del modelo: Nombre del sujeto
- Valor: instancia CDASubject
- CUDPNameType: clase que administra el nombre y el destino de UDP (utilizado para UDP Get/Set)
5.4. Ejemplo de código fuente utilizando la clase principal de la API DA#
5.4.1. Crear instancia de modelo desde archivo
Implementado como función “GetModel” en el módulo “modDAModeler”.
'모델명과 파일명(경로포함)으로 Model Instance 반환 Public Function GetModel(ByRef adApp As Modeler5.Application, aModelName As String, aModelFileName As String) As Modeler5.Model Dim odModel As Modeler5.Model If adApp Is Nothing Then Set adApp = New Modeler5.Application Set odModel = adApp.GetModel(aModelName) '열려 있는 모델에서 ModelName으로 비교 If (odModel Is Nothing) And (Trim(aModelFileName) <> "") Then Set odModel = GetModelAlreadyOpened(adApp, aModelName, aModelFileName) '열려 있는 모델에서 FilePath로 비교 If odModel Is Nothing Then '모델이 열려 있지 않은 경우 adApp.OpenFile (aModelFileName) Set odModel = adApp.GetActiveModel End If End If adApp.SetActiveModel odModel Set GetModel = odModel If odModel Is Nothing Then '열려 있는 모델에도 없고 파일명도 비어있는 경우 MsgBox "GetModel Error" & vbLf & _ "ModelName: " & aModelName & vbLf & _ "ModelFileName: " & aModelFileName, vbOKOnly & vbExclamation, "GetModel Error" End If End Function
Antes de llamar a la función GetModel, cree primero la instancia de Modeler5.Application y pásela como un parámetro de la siguiente manera.
Set m_odApp = New Modeler5.Application Set odModel = GetModel(m_odApp, aFileNameOnly, aFileName)
Si no se pasa la instancia de Modeler5.Application, se crea una instancia dentro de la función (línea 4).
5.4.2. Obtener lista de entidades del archivo modelo
Implementado como función "GetEntityListFromFile" de la hoja "Entity(Get)".
Public Sub GetEntityListFromFile(aFileNameOnly As String, aFileName As String, baGetYN() As Boolean, _ aUDPNameCol As Collection, aIsSaveNClose As Boolean) Dim odModel As Modeler5.Model Dim odSubjects As Modeler5.Subjects, odSubject As Modeler5.Subject Dim odLogicalPane As Modeler5.Pane, odEntitys As Modeler5.Entitys, odEntity As Modeler5.Entity Dim sModelName As String, oBaseRange As Range, oOutRange As Range, oUDPOutRange As Range Dim vOutRngArr As Variant, vUDPRngArr As Variant Set odModel = GetModel(m_odApp, aFileNameOnly, aFileName) sModelName = odModel.Name If odModel Is Nothing Then MsgBox "DA# 모델이 없습니다." & vbLf & "<모델명: " & sModelName & ">", vbCritical GoTo Finalize_Section End If odModel.ActiveAction (False) 'Undo/Redo 해제 Set oBaseRange = Range("EntityListBase").Offset(1, 0): Set oOutRange = oBaseRange.Offset(m_lRowOffset, 0) Set oUDPOutRange = Range("EntityUDPNameBase").Offset(1, 0): Set oUDPOutRange = oUDPOutRange.Offset(m_lRowOffset, 0) Set odEntitys = odModel.Entitys Dim lEntIdx As Long ReDim vOutRngArr(1 To odEntitys.Count, DA_GETENT_ItemCount) ReDim vUDPRngArr(1 To odEntitys.Count, DA_GETENT_ItemCount) For lEntIdx = 1 To odEntitys.Count Set odEntity = odEntitys.Item(lEntIdx - 1) Dim arrayEnt() As Variant arrayEnt = odEntity.Values '엔터티 Property를 Variant Array로 한번에 받아오기 vOutRngArr(lEntIdx, DA_GETENT_Sequence_IDX) = lEntIdx vOutRngArr(lEntIdx, DA_GETENT_ModelName_IDX) = sModelName vOutRngArr(lEntIdx, DA_GETENT_EntityName_IDX) = odEntity.Name '- 엔터티 Property 직접 접근 방식 ----------------------------------------------------------------------------------------------------------------------------------------- If baGetYN(DA_GETENT_EntityTableName_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntityTableName_IDX) = odEntity.TableName If baGetYN(DA_GETENT_EntitySynonym_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntitySynonym_IDX) = odEntity.Synonym If baGetYN(DA_GETENT_EntityAltName_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntityAltName_IDX) = odEntity.AltName If baGetYN(DA_GETENT_EntityDBOwner_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntityDBOwner_IDX) = odEntity.DBOwner If baGetYN(DA_GETENT_EntityCategory_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntityCategory_IDX) = GetEntityCategoryName(odEntity.Category) If baGetYN(DA_GETENT_EntityLevel_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntityLevel_IDX) = odEntity.Level If baGetYN(DA_GETENT_EntityRank_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntityRank_IDX) = GetEntityRankName(odEntity.Rank) If baGetYN(DA_GETENT_EntityVirtual_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntityVirtual_IDX) = GetEntityTypeName(odEntity.Virtual) If baGetYN(DA_GETENT_EntityStandardType_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntityStandardType_IDX) = GetStandardTypeName(odEntity.StandardType) If baGetYN(DA_GETENT_EntityStatus_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntityStatus_IDX) = odEntity.Status If baGetYN(DA_GETENT_EntityPeriod_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntityPeriod_IDX) = odEntity.Period If baGetYN(DA_GETENT_EntityMonthly_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntityMonthly_IDX) = odEntity.Monthly If baGetYN(DA_GETENT_EntityManage_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntityManage_IDX) = odEntity.Manage If baGetYN(DA_GETENT_EntityTotal_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntityTotal_IDX) = odEntity.Total If baGetYN(DA_GETENT_EntityDesc_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntityDesc_IDX) = Replace(odEntity.Desc, vbCrLf, vbLf) '정의 If baGetYN(DA_GETENT_EntityFlow_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntityFlow_IDX) = Replace(odEntity.Flow, vbCrLf, vbLf) '데이터 처리 형태 If baGetYN(DA_GETENT_EntityRemark_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntityRemark_IDX) = Replace(odEntity.Remark, vbCrLf, vbLf) '특이사항 If baGetYN(DA_GETENT_EntityNote_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntityNote_IDX) = Replace(odEntity.Note, vbCrLf, vbLf) '노트 If baGetYN(DA_GETENT_EntityTag_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntityTag_IDX) = odEntity.TagName '- 엔터티 Property Array 접근 방식 ----------------------------------------------------------------------------------------------------------------------------------------- ' If baGetYN(DA_GETENT_EntityTableName_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntityTableName_IDX) = arrayEnt(Modeler5.ENT_TABLENAME) ' If baGetYN(DA_GETENT_EntitySynonym_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntitySynonym_IDX) = arrayEnt(Modeler5.ENT_SYNONYM) ' If baGetYN(DA_GETENT_EntityAltName_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntityAltName_IDX) = arrayEnt(Modeler5.ENT_ALTNAME) ' If baGetYN(DA_GETENT_EntityDBOwner_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntityDBOwner_IDX) = arrayEnt(Modeler5.ENT_DBOWNER) ' If baGetYN(DA_GETENT_EntityCategory_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntityCategory_IDX) = GetEntityCategoryName(arrayEnt(Modeler5.ENT_CATEGORY)) ' If baGetYN(DA_GETENT_EntityLevel_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntityLevel_IDX) = arrayEnt(Modeler5.ENT_LEVEL) ' If baGetYN(DA_GETENT_EntityRank_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntityRank_IDX) = GetEntityRankName(arrayEnt(Modeler5.ENT_RANK)) ' If baGetYN(DA_GETENT_EntityVirtual_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntityVirtual_IDX) = GetEntityTypeName(arrayEnt(Modeler5.ENT_VIRTUAL)) ' If baGetYN(DA_GETENT_EntityStandardType_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntityStandardType_IDX) = GetStandardTypeName(arrayEnt(Modeler5.ENT_STANDARDTYPE)) ' If baGetYN(DA_GETENT_EntityStatus_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntityStatus_IDX) = arrayEnt(Modeler5.ENT_STATUS) ' If baGetYN(DA_GETENT_EntityPeriod_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntityPeriod_IDX) = arrayEnt(Modeler5.ENT_PERIOD) ' If baGetYN(DA_GETENT_EntityMonthly_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntityMonthly_IDX) = arrayEnt(Modeler5.ENT_MONTHLY) ' If baGetYN(DA_GETENT_EntityManage_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntityManage_IDX) = arrayEnt(Modeler5.ENT_MANAGE) ' If baGetYN(DA_GETENT_EntityTotal_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntityTotal_IDX) = arrayEnt(Modeler5.ENT_TOTAL) ' If baGetYN(DA_GETENT_EntityDesc_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntityDesc_IDX) = Replace(arrayEnt(Modeler5.ENT_DESC), vbCrLf, vbLf) '정의 ' If baGetYN(DA_GETENT_EntityFlow_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntityFlow_IDX) = Replace(arrayEnt(Modeler5.ENT_FLOW), vbCrLf, vbLf) '데이터 처리 형태 ' If baGetYN(DA_GETENT_EntityRemark_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntityRemark_IDX) = Replace(arrayEnt(Modeler5.ENT_REMARK), vbCrLf, vbLf) '특이사항 ' If baGetYN(DA_GETENT_EntityNote_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntityNote_IDX) = Replace(arrayEnt(Modeler5.ENT_NOTE), vbCrLf, vbLf) '노트 ' If baGetYN(DA_GETENT_EntityTag_IDX) = True Then vOutRngArr(lEntIdx, DA_GETENT_EntityTag_IDX) = arrayEnt(Modeler5.ENT_TAGNAME) If Not aUDPNameCol Is Nothing Then 'Get UDP Value Dim oUDPNamePType As CUDPNameType, lUDPNameIdx As Long For lUDPNameIdx = 1 To aUDPNameCol.Count Set oUDPNamePType = aUDPNameCol(lUDPNameIdx) If oUDPNamePType.m_bUDPTargetYN = False Then GoTo SkipUDP vUDPRngArr(lEntIdx, lUDPNameIdx - 1) = odEntity.GetUDPValue(oUDPNamePType.m_sUDPName) SkipUDP: Next lUDPNameIdx End If '---------------------------------------------------------------------------------------------------- m_lRowOffset = m_lRowOffset + 1 Next lEntIdx '---------------------------------------------------------------------------------------------------- Set oOutRange = oOutRange.Resize(UBound(vOutRngArr, 1), UBound(vOutRngArr, 2)) Set oUDPOutRange = oUDPOutRange.Resize(UBound(vOutRngArr, 1), UBound(vOutRngArr, 2)) oOutRange.Value2 = vOutRngArr oUDPOutRange.Value2 = vUDPRngArr '---------------------------------------------------------------------------------------------------- Finalize_Section: odModel.ActiveAction (True) 'Undo/Redo 활성화 If aIsSaveNClose Then 'odApp.SaveActiveModelFile 'Get은 Save 하지 않도록 주석처리 m_odApp.CloseActiveModelFile End If Set odModel = Nothing Set odSubjects = Nothing Set odSubject = Nothing Set odEntity = Nothing End Sub
El enfoque de matriz de propiedades tiene un mejor rendimiento que el enfoque directo de propiedad de entidad, pero al momento de escribir este artículo, había un fenómeno en el que los valores no se podían obtener correctamente al acceder a una matriz, por lo que se volvió al enfoque directo. .
Las líneas 88 a 91 usan Variant Array para escribir una matriz 2D en la memoria en una hoja de Excel a la vez. Para obtener una explicación de esto, consulte el siguiente artículo.
Patrón de codificación VBA: Bucle de rango - Escritura
5.4.3. Estableciendo valores a las entidades
Implementado como procedimiento “SetValue” de la clase “CDAEntityList”.
Public Sub SetValue(aTargetModelList As CDAModelList, aIsAppendMode As Boolean, _ baSetYN() As Boolean, aIsSaveNClose As Boolean) On Error GoTo ErrHandling Dim odApp As Modeler5.Application, odModel As Modeler5.Model Dim odEntitys As Modeler5.Entitys, odEntity As Modeler5.Entity Set odApp = New Modeler5.Application Dim startTime As Date, endTime As Date, sElapedTime As String DoLog ("Entity(Set) Started...") startTime = Now frmProgress.Hide: frmProgress.InitProgress: frmProgress.Show Application.ScreenUpdating = False Dim lTargetDAModelIndex As Long, oTargetDAModel As CDAModel Dim lEntIndex As Long, sKey As String, oDAEntity As CDAEntity, lSetCount As Long, sProgressMsg As String lSetCount = 0 For lTargetDAModelIndex = 0 To aTargetModelList.Count - 1 'Model Level Loop Set oTargetDAModel = aTargetModelList.GetItemByIndex(lTargetDAModelIndex) Set odModel = GetModel(odApp, oTargetDAModel.m_s모델명, oTargetDAModel.m_s모델파일명) odModel.ActiveAction (False) 'Undo/Redo 해제 frmProgress.UpdateProgressBar aTargetModelList.Count, lTargetDAModelIndex + 1, oTargetDAModel.m_s모델명, True sProgressMsg = "[" + CStr(lTargetDAModelIndex + 1) + "/" + CStr(aTargetModelList.Count) + "] " + oTargetDAModel.m_s모델명 DoDisplayStatusMsg sProgressMsg DoLog sProgressMsg + " (" + oTargetDAModel.m_s모델파일명 + ")" If frmProgress.IsCanceled Then GoTo Finalize_Section Set odEntitys = odModel.Entitys For lEntIndex = 0 To odEntitys.Count - 1 'Entity Level Loop Set odEntity = odEntitys.Item(lEntIndex) If m_eDACompareType = DACompareLogicalName Then sKey = odModel.Name + ":" + odEntity.Name ElseIf m_eDACompareType = DAComparePysicalName Then sKey = odModel.Name + ":" + odEntity.TableName End If Set oDAEntity = GetItem(sKey) If oDAEntity Is Nothing Then GoTo Skip_Set '변경할 대상이 아니면 skip lSetCount = lSetCount + 1 'Set 개수 증가 '- 엔터티 Property 직접 접근 방식 ----------------------------------------------------------------------------------------------------------------------------------------- ' If baSetYN(DA_SETENT_EntityName_IDX) = True Then odEntity.Name = oDAEntity.m_s엔터티명 ' If baSetYN(DA_SETENT_EntityTableName_IDX) = True Then odEntity.TableName = oDAEntity.m_s테이블명 ' If baSetYN(DA_SETENT_EntitySynonym_IDX) = True Then odEntity.Synonym = oDAEntity.m_s동의어 ' If baSetYN(DA_SETENT_EntityAltName_IDX) = True Then odEntity.AltName = oDAEntity.m_s보조명 ' If baSetYN(DA_SETENT_EntityDBOwner_IDX) = True Then odEntity.DBOwner = oDAEntity.m_sDBOwner ' If baSetYN(DA_SETENT_EntityCategory_IDX) = True Then odEntity.Category = GetEntityCategoryEnum(oDAEntity.m_s분류) ' If baSetYN(DA_SETENT_EntityLevel_IDX) = True Then odEntity.Level = oDAEntity.m_sLevel ' If baSetYN(DA_SETENT_EntityRank_IDX) = True Then odEntity.Rank = GetEntityRankEnum(oDAEntity.m_s단계) ' If baSetYN(DA_SETENT_EntityVirtual_IDX) = True Then odEntity.Virtual = GetEntityTypeEnum(oDAEntity.m_s유형) ' If baSetYN(DA_SETENT_EntityStandardType_IDX) = True Then odEntity.StandardType = GetStandardTypeEnum(oDAEntity.m_s표준화) ' If baSetYN(DA_SETENT_EntityStatus_IDX) = True Then odEntity.Status = oDAEntity.m_s상태 ' If baSetYN(DA_SETENT_EntityPeriod_IDX) = True Then odEntity.Period = oDAEntity.m_s발생주기 ' If baSetYN(DA_SETENT_EntityMonthly_IDX) = True Then odEntity.Monthly = oDAEntity.m_s월간발생량 ' If baSetYN(DA_SETENT_EntityManage_IDX) = True Then odEntity.Manage = oDAEntity.m_s보존기한 ' If baSetYN(DA_SETENT_EntityTotal_IDX) = True Then odEntity.Total = oDAEntity.m_s총건수 ' If baSetYN(DA_SETENT_EntityDesc_IDX) = True Then odEntity.Desc = IIf(aIsAppendMode, odEntity.Desc + vbCrLf + oDAEntity.m_s정의, oDAEntity.m_s정의) ' If baSetYN(DA_SETENT_EntityFlow_IDX) = True Then odEntity.Flow = IIf(aIsAppendMode, odEntity.Flow + vbCrLf + oDAEntity.m_s데이터처리형태, oDAEntity.m_s데이터처리형태) ' If baSetYN(DA_SETENT_EntityRemark_IDX) = True Then odEntity.Remark = IIf(aIsAppendMode, odEntity.Remark + vbCrLf + oDAEntity.m_s특이사항, oDAEntity.m_s특이사항) ' If baSetYN(DA_SETENT_EntityNote_IDX) = True Then odEntity.Note = IIf(aIsAppendMode, odEntity.Note + vbCrLf + oDAEntity.m_sNote, oDAEntity.m_sNote) ' If baSetYN(DA_SETENT_EntityTag_IDX) = True Then odEntity.TagName = oDAEntity.m_sTag Dim arrEnt(Modeler5.ENT_ARRAYCOUNT) As Variant '- 엔터티 Property Array 접근 방식 ----------------------------------------------------------------------------------------------------------------------------------------- If baSetYN(DA_SETENT_EntityName_IDX) = True Then odEntity.Name = oDAEntity.m_s엔터티명 If baSetYN(DA_SETENT_EntityTableName_IDX) = True Then arrEnt(Modeler5.ENT_TABLENAME) = oDAEntity.m_s테이블명 If baSetYN(DA_SETENT_EntitySynonym_IDX) = True Then arrEnt(Modeler5.ENT_SYNONYM) = oDAEntity.m_s동의어 If baSetYN(DA_SETENT_EntityAltName_IDX) = True Then arrEnt(Modeler5.ENT_ALTNAME) = oDAEntity.m_s보조명 If baSetYN(DA_SETENT_EntityDBOwner_IDX) = True Then arrEnt(Modeler5.ENT_DBOWNER) = oDAEntity.m_sDBOwner If baSetYN(DA_SETENT_EntityCategory_IDX) = True Then arrEnt(Modeler5.ENT_CATEGORY) = GetEntityCategoryEnum(oDAEntity.m_s분류) If baSetYN(DA_SETENT_EntityLevel_IDX) = True Then arrEnt(Modeler5.ENT_LEVEL) = oDAEntity.m_sLevel If baSetYN(DA_SETENT_EntityRank_IDX) = True Then arrEnt(Modeler5.ENT_RANK) = GetEntityRankEnum(oDAEntity.m_s단계) If baSetYN(DA_SETENT_EntityVirtual_IDX) = True Then arrEnt(Modeler5.ENT_VIRTUAL) = GetEntityTypeEnum(oDAEntity.m_s유형) If baSetYN(DA_SETENT_EntityStandardType_IDX) = True Then arrEnt(Modeler5.ENT_STANDARDTYPE) = GetStandardTypeEnum(oDAEntity.m_s표준화) If baSetYN(DA_SETENT_EntityStatus_IDX) = True Then arrEnt(Modeler5.ENT_STATUS) = oDAEntity.m_s상태 If baSetYN(DA_SETENT_EntityPeriod_IDX) = True Then arrEnt(Modeler5.ENT_PERIOD) = oDAEntity.m_s발생주기 If baSetYN(DA_SETENT_EntityMonthly_IDX) = True Then arrEnt(Modeler5.ENT_MONTHLY) = oDAEntity.m_s월간발생량 If baSetYN(DA_SETENT_EntityManage_IDX) = True Then arrEnt(Modeler5.ENT_MANAGE) = oDAEntity.m_s보존기한 If baSetYN(DA_SETENT_EntityTotal_IDX) = True Then arrEnt(Modeler5.ENT_TOTAL) = oDAEntity.m_s총건수 If baSetYN(DA_SETENT_EntityDesc_IDX) = True Then arrEnt(Modeler5.ENT_DESC) = IIf(aIsAppendMode, odEntity.Desc + vbCrLf + oDAEntity.m_s정의, oDAEntity.m_s정의) If baSetYN(DA_SETENT_EntityFlow_IDX) = True Then arrEnt(Modeler5.ENT_FLOW) = IIf(aIsAppendMode, odEntity.Flow + vbCrLf + oDAEntity.m_s데이터처리형태, oDAEntity.m_s데이터처리형태) If baSetYN(DA_SETENT_EntityRemark_IDX) = True Then arrEnt(Modeler5.ENT_REMARK) = IIf(aIsAppendMode, odEntity.Remark + vbCrLf + oDAEntity.m_s특이사항, oDAEntity.m_s특이사항) If baSetYN(DA_SETENT_EntityNote_IDX) = True Then arrEnt(Modeler5.ENT_NOTE) = IIf(aIsAppendMode, odEntity.Note + vbCrLf + oDAEntity.m_sNote, oDAEntity.m_sNote) If baSetYN(DA_SETENT_EntityTag_IDX) = True Then arrEnt(Modeler5.ENT_TAGNAME) = oDAEntity.m_sTag odEntity.Values = arrEnt '-------------------- Set UDP Value -------------------- If oDAEntity.m_oUDPDic.Count = 0 Then GoTo Skip_Set 'UDP Collection이 비어 있으면 Skip Dim vUDPName As Variant, sUDPValue As String For Each vUDPName In oDAEntity.m_oUDPDic.Keys 'Dictionary에는 Set대상 UDP만 가지고 있음 sUDPValue = oDAEntity.m_oUDPDic(vUDPName) odEntity.SetUDPValue vUDPName, sUDPValue Next vUDPName Skip_Set: odEntity.UpdateDrawEntity Next lEntIndex odModel.ActiveAction (True) 'Undo/Redo 활성화 If aIsSaveNClose Then odApp.SaveActiveModelFile odApp.CloseActiveModelFile End If Next lTargetDAModelIndex frmProgress.UpdateProgressBar aTargetModelList.Count, lTargetDAModelIndex + 1, oTargetDAModel.m_s모델명, True ErrHandling: Resume Next Finalize_Section: Application.ScreenUpdating = True endTime = Now sElapedTime = GetElapsedTime(startTime, endTime) DoLog ("Entity(Set) Finished. [ElapsedTime: " + sElapedTime + "]") frmProgress.SetDoneMsg sProgressMsg, sElapedTime MsgBox "처리완료" + vbCrLf + _ "처리건수: " + CStr(lSetCount) + vbCrLf + _ "Elapsed Time: " + sElapedTime, vbInformation End Sub
- Línea 21: Deshacer/Rehacer. (para ahorrar memoria y mejorar el rendimiento)
- Líneas 10, 25, 112: registre el estado de procesamiento con la función DoLog. (Esta función es una función de usuario que utiliza la API de Windows 'OutputDebugMessage' y se publicará por separado a este respecto)
- Línea 83: establezca valores a la vez asignando Array (tipo de variante) que contiene propiedades de entidad a Entity.Values.
Hasta este punto, analizamos el modelo de objetos de la API del modelador DA# utilizado en la macro DA#, la composición del código VBA y los ejemplos de código fuente.
Para el código fuente, repetí la codificación y la refactorización de vez en cuando durante tres años, por lo que la consistencia general del código no fue muy buena. La refactorización general debería tocarse en algún momento, pero no sé cuándo.
Esperamos que esta herramienta sea útil para los modeladores de datos y DA (Arquitectos de datos) que usan DA#.
<< Lista de artículos relacionados >>
- Macro DA#(1): DA#, API DA#, descripción general de la macro DA#
- Macro DA# (2): Función macro DA# (1) - Función común, Entidad Get/Set
- Macro DA# (3): Función de macro DA# (2) - Obtener/Establecer atributo
- Macro DA# (4): Función macro DA# (3) -Reversa
- Macro DA#(5): Notas/notas de uso, descargas, funciones que se agregarán en el futuro, notas
- Macro DA#(6): API del modelador DA#
- Video de demostración de la función macro DA# (YouTube)
- Contenido de la descripción de la macro DA#, descarga