Exportfile for AOT version 1.0 or later Formatversion: 1 ***Element: DBT ; Microsoft Dynamics AX Table : NVMPSqlDictionaryIdChanges unloaded ; -------------------------------------------------------------------------------- TABLEVERSION 1 TABLE #NVMPSqlDictionaryIdChanges PROPERTIES Name #NVMPSqlDictionaryIdChanges Label #@HEL287 FormRef #NVMPTmpSqlDictionaryIdChanges TitleField1 #OldTableId TitleField2 #Name ConfigurationKey #DataExport SecurityKey #BasicTables CacheLookup #Found SaveDataPerCompany #No TableGroup #WorksheetLine PrimaryIndex #TableIdFieldIdIdx ClusterIndex #TableIdFieldIdIdx ENDPROPERTIES FIELDS FIELD #OldTableId INT PROPERTIES Name #OldTableId AllowEdit #No Table #NVMPSqlDictionaryIdChanges ExtendedDataType ARRAY #NVMPTableId # ENDARRAY ENDPROPERTIES FIELD #OldFieldId INT PROPERTIES Name #OldFieldId AllowEdit #No Table #NVMPSqlDictionaryIdChanges ExtendedDataType ARRAY #NVMPFieldId # ENDARRAY ENDPROPERTIES FIELD #Name STRING PROPERTIES Name #Name Mandatory #Yes Table #NVMPSqlDictionaryIdChanges ExtendedDataType ARRAY #NVMPIdentifierName # ENDARRAY StringSize #40 ENDPROPERTIES FIELD #NewTableId INT PROPERTIES Name #NewTableId Table #NVMPSqlDictionaryIdChanges ExtendedDataType ARRAY #NVMPTableId # ENDARRAY ENDPROPERTIES FIELD #NewFieldId INT PROPERTIES Name #NewFieldId Table #NVMPSqlDictionaryIdChanges ExtendedDataType ARRAY #NVMPFieldId # ENDARRAY ENDPROPERTIES ENDFIELDS GROUPS GROUP #AutoReport PROPERTIES Name #AutoReport ENDPROPERTIES GROUPFIELDS #OldFieldId #Name #NewFieldId #NewTableId #OldTableId ENDGROUPFIELDS ENDGROUP GROUP #Identification PROPERTIES Name #Identification Label #@SYS5711 ENDPROPERTIES GROUPFIELDS #OldTableId #OldFieldId ENDGROUPFIELDS ENDGROUP GROUP #Overview PROPERTIES Name #Overview Label #@SYS9039 ENDPROPERTIES GROUPFIELDS #Name #OldTableId #OldFieldId #NewTableId #NewFieldId ENDGROUPFIELDS ENDGROUP ENDGROUPS INDICES #TableIdFieldIdIdx PROPERTIES Name #TableIdFieldIdIdx AllowDuplicates #No ENDPROPERTIES INDEXFIELDS #OldTableId #OldFieldId ENDINDEXFIELDS ENDINDICES REFERENCES ENDREFERENCES DELETEACTIONS ENDDELETEACTIONS METHODS Version: 3 SOURCE #checkExist #public static Boolean checkExist(NVMPTableId _tableId, # NVMPFieldId _fieldId) #{ # Boolean ret = true; # ; # # if (!NVMPSqlDictionaryIdChanges::exist(_tableId, _fieldId)) # { # ret = checkFailed(strfmt(NVMPSqlDictionaryIdChanges::txtNotExist(), _tableId, _fieldId)); # } # # return ret; #} ENDSOURCE SOURCE #clearData #public static void clearData() #{ # NVMPSqlDictionaryIdChanges changes; # ; # # ttsBegin; # # delete_from changes; # # ttsCommit; #} ENDSOURCE SOURCE #exist #public static Boolean exist(NVMPTableId _tableId, # NVMPFieldId _fieldId) #{ # return (NVMPSqlDictionaryIdChanges::find(_tableId, _fieldId).RecId != 0); #} ENDSOURCE SOURCE #find #public static NVMPSqlDictionaryIdChanges find(NVMPTableId _tableId, # NVMPFieldId _fieldId, # Boolean _forUpdate = false) #{ # NVMPSqlDictionaryIdChanges nVMPSqlDictionaryIdChanges; # ; # # if (_tableId && _fieldId) # { # nVMPSqlDictionaryIdChanges.selectForUpdate(_forUpdate); # # select firstonly nVMPSqlDictionaryIdChanges # index hint TableIdFieldIdIdx # where nVMPSqlDictionaryIdChanges.OldTableId == _tableId && # nVMPSqlDictionaryIdChanges.OldFieldId == _fieldId; # } # # return nVMPSqlDictionaryIdChanges; #} ENDSOURCE SOURCE #findFieldRecordByTableIdAndName #public static NVMPSqlDictionaryIdChanges findFieldRecordByTableIdAndName( TableId _oldTableId, # FieldName _fieldName, # Boolean _forUpdate = false) #{ # NVMPSqlDictionaryIdChanges nVMPSqlDictionaryIdChanges; # ; # # if (_fieldName && _oldTableId) # { # nVMPSqlDictionaryIdChanges.selectForUpdate(_forUpdate); # # select firstonly nVMPSqlDictionaryIdChanges # where nVMPSqlDictionaryIdChanges.OldTableId == _oldTableId # && nVMPSqlDictionaryIdChanges.Name == _fieldName; # } # # return nVMPSqlDictionaryIdChanges; #} ENDSOURCE SOURCE #findTableRecordByName #public static NVMPSqlDictionaryIdChanges findTableRecordByName( TableName _tableName, # Boolean _forUpdate = false) #{ # NVMPSqlDictionaryIdChanges nVMPSqlDictionaryIdChanges; # ; # # if (_tableName) # { # nVMPSqlDictionaryIdChanges.selectForUpdate(_forUpdate); # # select firstonly nVMPSqlDictionaryIdChanges # where nVMPSqlDictionaryIdChanges.Name == _tableName # && nVMPSqlDictionaryIdChanges.OldFieldId == 0; # } # # return nVMPSqlDictionaryIdChanges; #} ENDSOURCE SOURCE #logChangeRecord #public static void logChangeRecord( IdentifierName _name # , TableId _oldTableId # , TableId _newTableId # , FieldId _oldFieldId # , FieldId _newFieldId) #{ # NVMPSqlDictionaryIdChanges sqlDictionaryChanges; # ; # ttsBegin; # # sqlDictionaryChanges.clear(); # sqlDictionaryChanges.OldTableId = _oldTableId; # sqlDictionaryChanges.OldFieldId = _oldFieldId; # sqlDictionaryChanges.NewTableId = _newTableId; # sqlDictionaryChanges.NewFieldId = _newFieldId; # sqlDictionaryChanges.Name = _name; # sqlDictionaryChanges.insert(); # # ttsCommit; #} ENDSOURCE SOURCE #txtNotExist #public static TxtNotExist txtNotExist() #{ # return "Dictionary Id changes does not exist."; // TODO - Use label! #} ENDSOURCE SOURCE #updateFieldRecordNewIdData #public static void updateFieldRecordNewIdData( TableId _oldTableId # , FieldName _fieldName # , TableId _newTableId # , FieldId _newFieldId) #{ # NVMPSqlDictionaryIdChanges dictionaryChanges; # ; # # ttsBegin; # # dictionaryChanges = NVMPSqlDictionaryIdChanges::findFieldRecordByTableIdAndName(_oldTableId, _fieldName, true); # # if(dictionaryChanges.RecId) # { # dictionaryChanges.NewTableId = _newTableId; # dictionaryChanges.NewFieldId = _newFieldId; # dictionaryChanges.doUpdate(); # } # else # { # // Do not throw error because there could already be fields in the destination layer that were not part of the move # //throw error(strFmt("Field %1 of table %2 not found in the dictionary changes table", _fieldName, TableId2Name(_oldTableId))); # } # # ttsCommit; #} ENDSOURCE ENDMETHODS ENDTABLE nl Identificatie @SYS5711 0 0 nl Overzicht @SYS9039 0 0 ***Element: UTE ; Microsoft Dynamics AX Enum: NVMPUtilEntryLevelId unloaded ; -------------------------------------------------------------------------------- USERTYPEVERSION 6 USERTYPE #NVMPUtilEntryLevelId ENUM PROPERTIES Name #NVMPUtilEntryLevelId EnumType #UtilEntryLevel ENDPROPERTIES TYPEELEMENTS ENDTYPEELEMENTS TYPEREFERENCES ENDTYPEREFERENCES ENDUSERTYPE ***Element: UTE ; Microsoft Dynamics AX Enum: NVMPSourceUtilEntryLevelId unloaded ; -------------------------------------------------------------------------------- USERTYPEVERSION 6 USERTYPE #NVMPSourceUtilEntryLevelId ENUM PROPERTIES Name #NVMPSourceUtilEntryLevelId Label #Source Layer HelpText #Source layer of an AOT object EnumType #UtilEntryLevel ENDPROPERTIES TYPEELEMENTS ENDTYPEELEMENTS TYPEREFERENCES ENDTYPEREFERENCES ENDUSERTYPE ***Element: UTE ; Microsoft Dynamics AX Enum: NVMPDestinationUtilEntryLevelId unloaded ; -------------------------------------------------------------------------------- USERTYPEVERSION 6 USERTYPE #NVMPDestinationUtilEntryLevelId ENUM PROPERTIES Name #NVMPDestinationUtilEntryLevelId Label #Destination Layer HelpText #Destination layer of an AOT object EnumType #UtilEntryLevel ENDPROPERTIES TYPEELEMENTS ENDTYPEELEMENTS TYPEREFERENCES ENDTYPEREFERENCES ENDUSERTYPE ***Element: UTS ; Microsoft Dynamics AX String: NVMPIdentifierName unloaded ; -------------------------------------------------------------------------------- USERTYPEVERSION 6 USERTYPE #NVMPIdentifierName STRING PROPERTIES Name #NVMPIdentifierName Extends #identifiername StringSize #40 ENDPROPERTIES TYPEELEMENTS ENDTYPEELEMENTS TYPEREFERENCES ENDTYPEREFERENCES ENDUSERTYPE ***Element: UTI ; Microsoft Dynamics AX Integer: NVMPTableId unloaded ; -------------------------------------------------------------------------------- USERTYPEVERSION 6 USERTYPE #NVMPTableId INT PROPERTIES Name #NVMPTableId Extends #tableId ENDPROPERTIES TYPEELEMENTS ENDTYPEELEMENTS TYPEREFERENCES ENDTYPEREFERENCES ENDUSERTYPE ***Element: UTI ; Microsoft Dynamics AX Integer: NVMPFieldId unloaded ; -------------------------------------------------------------------------------- USERTYPEVERSION 6 USERTYPE #NVMPFieldId INT PROPERTIES Name #NVMPFieldId Extends #fieldId ENDPROPERTIES TYPEELEMENTS ENDTYPEELEMENTS TYPEREFERENCES ENDTYPEREFERENCES ENDUSERTYPE ***Element: DBE ; Microsoft Dynamics AX Enumtype : NVMPPrePostLayerMove unloaded ; -------------------------------------------------------------------------------- ENUMTYPEVERSION 1 ENUMTYPE #NVMPPrePostLayerMove PROPERTIES Name #NVMPPrePostLayerMove Label #Pre / Post Layer Move Help #Before or after an object move from one layer to another UseEnumValue #Yes ENDPROPERTIES TYPEELEMENTS #Pre PROPERTIES Name #Pre Label #Pre EnumValue #0 ENDPROPERTIES #Post PROPERTIES Name #Post Label #@SYS41360 EnumValue #1 ENDPROPERTIES ENDTYPEELEMENTS ENDENUMTYPE nl Post @SYS41360 0 0 ***Element: MCR ; Microsoft Dynamics AX Macro: NVMPTableLayerMoveWizardSteps unloaded ; -------------------------------------------------------------------------------- JOBVERSION 1 SOURCE #NVMPTableLayerMoveWizardSteps ##Define.Welcome (1) ##Define.Parameters (2) ##Define.TableNames (3) ##Define.DictionaryChanges (4) ##Define.Finish (5) ENDSOURCE ***Element: CLS ; Microsoft Dynamics AX Class: NVMPTableLayerMoveWizard unloaded ; -------------------------------------------------------------------------------- CLSVERSION 1 CLASS #NVMPTableLayerMoveWizard PROPERTIES Name #NVMPTableLayerMoveWizard Extends #SysWizard RunOn #Client ENDPROPERTIES METHODS Version: 3 SOURCE #accessMenuFunction #public MenuFunction accessMenuFunction() #{ # return new MenuFunction(menuitemdisplaystr(NVMPTableLayerMoveWizard),MenuItemType::Display); #} ENDSOURCE SOURCE #buildTableListFromExistingChangesData #private void buildTableListFromExistingChangesData() #{ # NVMPSqlDictionaryIdChanges dictionaryChanges; # ; # // Here we start from the existing data in the NVMPSqlDictionaryIdChanges table # while select Name # from dictionaryChanges # group by Name // Select distinct on table name # where dictionaryChanges.OldFieldId == 0 // 0 indicates that is a table and not a field # { # mTmpTableName.clear(); # mTmpTableName.TableName = dictionaryChanges.Name; # mTmpTableName.insert(); # } #} ENDSOURCE SOURCE #classDeclaration #public class NVMPTableLayerMoveWizard extends SysWizard #{ # NVMPPrePostLayerMove mPrePostLayerMove; # NVMPSourceUtilEntryLevelId mSourceLayer; # NVMPDestinationUtilEntryLevelId mDestinationLayer; # # TmpTableName mTmpTableName; # NVMPSqlDictionaryIdChanges mSQLDictionaryIdChanges; # # #NVMPTableLayerMoveWizardSteps #} # ENDSOURCE SOURCE #clearPreviousData #private void clearPreviousData() #{ # NVMPITableMoveAction theAction = NVMPTableMoveAction_ClearPreviousData::construct(); # ; # theAction.run(); #} ENDSOURCE SOURCE #formName #FormName formName() #{ # return formstr(NVMPTableLayerMoveWizard); #} # ENDSOURCE SOURCE #parmDestinationLayer #public NVMPDestinationUtilEntryLevelId parmDestinationLayer(NVMPDestinationUtilEntryLevelId _destinationLayer = mDestinationLayer) #{ # ; # mDestinationLayer = _destinationLayer; # return mDestinationLayer; #} # ENDSOURCE SOURCE #parmPrePostLayerMove #public NVMPPrePostLayerMove parmPrePostLayerMove(NVMPPrePostLayerMove _prePostLayerMove = mPrePostLayerMove) #{ # ; # mPrePostLayerMove = _prePostLayerMove; # return mPrePostLayerMove; #} # ENDSOURCE SOURCE #parmSourceLayer #public NVMPSourceUtilEntryLevelId parmSourceLayer(NVMPSourceUtilEntryLevelId _sourceLayer = mSourceLayer) #{ # ; # mSourceLayer = _sourceLayer; # return mSourceLayer; #} # ENDSOURCE SOURCE #parmSQLDictionaryIdChanges #public NVMPSqlDictionaryIdChanges parmSQLDictionaryIdChanges(NVMPSqlDictionaryIdChanges _sqlDictionaryIdChanges = mSQLDictionaryIdChanges) #{ # ; # mSQLDictionaryIdChanges = _sqlDictionaryIdChanges; # return mSQLDictionaryIdChanges; #} # ENDSOURCE SOURCE #parmTmpTableName #public TmpTableName parmTmpTableName(TmpTableName _tmpTableName = mTmpTableName) #{ # ; # mTmpTableName = _tmpTableName; # return mTmpTableName; #} # ENDSOURCE SOURCE #processTablesDictionaryData #/// #/// Gathers dictionary data of the tables / fields that are moved from layer and logs it into a dictionary changes table #/// #/// #/// Depending of the moment (pre or post layer move) the oldTableId / oldFieldId fields or the newTableId / newFieldId fields are filled #/// #public void processTablesDictionaryData() #{ # // Create object once # NVMPITableMoveAction theAction; # ; # # switch(this.parmPrePostLayerMove()) # { # case NVMPPrePostLayerMove::Pre: # # // Only erase data when starting a layer move, not after because then we need to keep the old id's # // Before processing the tables, clear data from previous runs # NVMPTableMoveAction_ClearPreviousData::construct().run(); # # // Process the tables specified in the wizard # while select mTmpTableName # { # theAction = NVMPTableMoveAction_CollectIdsPreMove::newFromTableMoveWizard(this.parmSourceLayer(), mTmpTableName.TableName); # theAction.run(); # } # # break; # # case NVMPPrePostLayerMove::Post: # # // Build a table list starting from the changes data from the pre-layermove run # this.buildTableListFromExistingChangesData(); # # // Process the tables found # while select mTmpTableName # { # theAction = NVMPTableMoveAction_CollectIdsPostMove::newFromTableMoveWizard(this.parmDestinationLayer(), mTmpTableName.TableName); # theAction.run(); # } # # break; # } #} ENDSOURCE SOURCE #renameSqlLongTableNames #/// #/// Check the length of table names and renames the tables in the SQL backend #/// This is needed because long tables names contain the table id when shortened #/// and when the table is moved from layer, then we need to rename the table #/// to contain the new tableid so that the synchronisation will see the table in SQL #/// #public void renameSqlLongTableNames() #{ # NVMPITableMoveAction theAction = NVMPTableMoveAction_RenameSQLTableNames::construct(); # ; # theAction.run(); #} # ENDSOURCE SOURCE #run #void run() #{ # #} # ENDSOURCE SOURCE #setupNavigation #/* #Use this method to setup the two arrays: nextEnabled[] and backEnabled[] #Call this.nextEnabled(boolean) and this.backEnabled(boolean) to enable/disable the buttons runtime. #*/ #void setupNavigation() #{ # ; # nextEnabled[#Welcome] = true; # backEnabled[#Welcome] = false; # finishEnabled[#Welcome] = false; #} # ENDSOURCE SOURCE #skipTab #public boolean skipTab(int _idx, boolean _skip) #{ # boolean ret; # # ret = super(_idx, _skip); # # return ret; #} ENDSOURCE SOURCE #updateSqlDictionaryWithNewIds #public void updateSqlDictionaryWithNewIds() #{ # NVMPITableMoveAction theAction = NVMPTableMoveAction_UpdateSqlDictionary::construct(); # ; # theAction.run(); #} ENDSOURCE SOURCE #validate #boolean validate() #{ # return true; #} # ENDSOURCE SOURCE #construct #public static NVMPTableLayerMoveWizard construct() #{ # NVMPTableLayerMoveWizard NVMPTableLayerMoveWizard = new NVMPTableLayerMoveWizard(); # ; # # return NVMPTableLayerMoveWizard; #} ENDSOURCE SOURCE #main #static void main(args args) #{ # NVMPTableLayerMoveWizard wizard = new NVMPTableLayerMoveWizard(); # ; # # if (wizard.prompt()) # wizard.run(); #} ENDSOURCE ENDMETHODS ENDCLASS ***Element: CLS ; Microsoft Dynamics AX Class: NVMPITableMoveAction unloaded ; -------------------------------------------------------------------------------- CLSVERSION 1 INTERFACE #NVMPITableMoveAction PROPERTIES Name #NVMPITableMoveAction Extends # RunOn #Server ENDPROPERTIES METHODS Version: 3 SOURCE #classDeclaration #interface NVMPITableMoveAction #{ #} ENDSOURCE SOURCE #run #public void run() #{ #} ENDSOURCE ENDMETHODS ENDCLASS ***Element: CLS ; Microsoft Dynamics AX Class: NVMPTableMoveAction_ClearPreviousData unloaded ; -------------------------------------------------------------------------------- CLSVERSION 1 CLASS #NVMPTableMoveAction_ClearPreviousData PROPERTIES Name #NVMPTableMoveAction_ClearPreviousData Extends # RunOn #Called from ENDPROPERTIES METHODS Version: 3 SOURCE #classDeclaration #class NVMPTableMoveAction_ClearPreviousData implements NVMPITableMoveAction #{ #} ENDSOURCE SOURCE #new #protected void new() #{ #} ENDSOURCE SOURCE #run #public void run() #{ # ; # // When the wizard is initiated, clear the data of previous runs # NVMPSqlDictionaryIdChanges::clearData(); #} ENDSOURCE SOURCE #construct #public static NVMPTableMoveAction_ClearPreviousData construct() #{ # return new NVMPTableMoveAction_ClearPreviousData(); #} ENDSOURCE ENDMETHODS ENDCLASS ***Element: CLS ; Microsoft Dynamics AX Class: NVMPTableMoveAction_CollectIds unloaded ; -------------------------------------------------------------------------------- CLSVERSION 1 CLASS #NVMPTableMoveAction_CollectIds PROPERTIES Name #NVMPTableMoveAction_CollectIds Extends # RunOn #Server ENDPROPERTIES METHODS Version: 3 SOURCE #classDeclaration #abstract class NVMPTableMoveAction_CollectIds implements NVMPITableMoveAction #{ # NVMPSourceUtilEntryLevelId mLayerId; # TableName mTableName; # # #Define.SystemFieldsRangeMin(61000) #} ENDSOURCE SOURCE #collectFieldData #protected void collectFieldData() #{ # throw error(Error::missingOverride(funcName())); #} ENDSOURCE SOURCE #collectTableData #protected void collectTableData() #{ # throw error(Error::missingOverride(funcName())); #} ENDSOURCE SOURCE #parmLayerId #public NVMPSourceUtilEntryLevelId parmLayerId(NVMPSourceUtilEntryLevelId _layerId = mLayerId) #{ # ; # mLayerId = _layerId; # return mLayerId; #} ENDSOURCE SOURCE #parmTableName #public TableName parmTableName(TableName _tableName = mTableName) #{ # ; # mTableName = _tableName; # return mTableName; #} # ENDSOURCE SOURCE #run #public void run() #{ # DictTable dictTable = new DictTable(tableName2Id(this.parmTableName())); # boolean tmpTable = false; # ; # # // Check if the table is temporary (then data content is not applicable) # if(dictTable) # { # if(!dictTable.isTmp()) # { # this.collectTableData(); # this.collectFieldData(); # } # } #} ENDSOURCE SOURCE #validateTableLayerPresence #protected void validateTableLayerPresence() #{ # UtilElements utilElements; # ; # // First check if the table is actually in the layer # select firstonly utilElements # where utilElements.recordType == UtilElementType::Table # && utilElements.utilLevel == this.parmLayerId() # && utilElements.name == this.parmTableName(); # # // TODO KeSae : label ! # if(!utilElements.RecId) # throw error(strFmt('Table %1 does not exist in layer %2', this.parmTableName(), this.parmLayerId())); #} ENDSOURCE ENDMETHODS ENDCLASS ***Element: CLS ; Microsoft Dynamics AX Class: NVMPTableMoveAction_CollectIdsPreMove unloaded ; -------------------------------------------------------------------------------- CLSVERSION 1 CLASS #NVMPTableMoveAction_CollectIdsPreMove PROPERTIES Name #NVMPTableMoveAction_CollectIdsPreMove Extends #NVMPTableMoveAction_CollectIds RunOn #Server ENDPROPERTIES METHODS Version: 3 SOURCE #classDeclaration #class NVMPTableMoveAction_CollectIdsPreMove extends NVMPTableMoveAction_CollectIds #{ #} ENDSOURCE SOURCE #collectFieldData #protected void collectFieldData() #{ # UtilElements utilElements; # SQLDictionary sqlDictionary; # TableId tableId = TableName2Id(this.parmTableName()); # ; # # // Select all the field of this table that reside in that layer # while select utilElements # where utilElements.recordType == UtilElementType::TableField # && utilElements.utilLevel == this.parmLayerId() # && utilElements.parentId == TableName2Id(this.parmTableName()) // Find with the current table id # { # NVMPSqlDictionaryIdChanges::logChangeRecord(utilElements.name, tableId, 0, FieldName2Id(tableId, utilElements.name), 0); # } # # // Also process the system fields (located in the rage > 60000) # while select sqlDictionary # where sqlDictionary.tabId == tableId # && sqlDictionary.fieldId >= #SystemFieldsRangeMin # { # NVMPSqlDictionaryIdChanges::logChangeRecord(sqlDictionary.name, tableId, 0, FieldName2Id(tableId, sqlDictionary.name), 0); # } #} ENDSOURCE SOURCE #collectTableData #protected void collectTableData() #{ # ; # this.validateTableLayerPresence(); # # NVMPSqlDictionaryIdChanges::logChangeRecord(this.parmTableName(), TableName2Id(this.parmTableName()), 0, 0, 0); #} ENDSOURCE SOURCE #construct #private static NVMPTableMoveAction_CollectIdsPreMove construct() #{ # return new NVMPTableMoveAction_CollectIdsPreMove(); #} ENDSOURCE SOURCE #newFromTableMoveWizard #public static NVMPTableMoveAction_CollectIdsPreMove newFromTableMoveWizard( NVMPSourceUtilEntryLevelId _layerId # , TableName _tableName) #{ # NVMPTableMoveAction_CollectIdsPreMove NVMPTableMoveAction_CollectIdsPreMove = new NVMPTableMoveAction_CollectIdsPreMove(); # ; # # NVMPTableMoveAction_CollectIdsPreMove.parmLayerId(_layerId); # NVMPTableMoveAction_CollectIdsPreMove.parmTableName(_tableName); # # return NVMPTableMoveAction_CollectIdsPreMove; #} ENDSOURCE ENDMETHODS ENDCLASS ***Element: CLS ; Microsoft Dynamics AX Class: NVMPTableMoveAction_CollectIdsPostMove unloaded ; -------------------------------------------------------------------------------- CLSVERSION 1 CLASS #NVMPTableMoveAction_CollectIdsPostMove PROPERTIES Name #NVMPTableMoveAction_CollectIdsPostMove Extends #NVMPTableMoveAction_CollectIds RunOn #Server ENDPROPERTIES METHODS Version: 3 SOURCE #classDeclaration #class NVMPTableMoveAction_CollectIdsPostMove extends NVMPTableMoveAction_CollectIds #{ #} ENDSOURCE SOURCE #collectFieldData #protected void collectFieldData() #{ # UtilElements utilElements; # SQLDictionary sqlDictionary; # NVMPSqlDictionaryIdChanges theOldChangesRecord; # # TableId tableId = TableName2Id(this.parmTableName()); # ; # # theOldChangesRecord = NVMPSqlDictionaryIdChanges::findTableRecordByName(this.parmTableName(), true); # # // Select all the field of this table that reside in that layer # while select utilElements # where utilElements.recordType == UtilElementType::TableField # && utilElements.utilLevel == this.parmLayerId() # && utilElements.parentId == tableId // Find with the current table id # { # NVMPSqlDictionaryIdChanges::updateFieldRecordNewIdData(theOldChangesRecord.OldTableId, utilElements.name, tableId, fieldName2Id(tableId, utilElements.name)); # } # # // Also process the system fields (located in the rage > 60000) # while select sqlDictionary # where sqlDictionary.tabId == theOldChangesRecord.OldTableId # && sqlDictionary.fieldId >= #SystemFieldsRangeMin # { # NVMPSqlDictionaryIdChanges::updateFieldRecordNewIdData(theOldChangesRecord.OldTableId, sqlDictionary.name, tableId, fieldName2Id(tableId, sqlDictionary.name)); # } #} ENDSOURCE SOURCE #collectTableData #protected void collectTableData() #{ # NVMPSqlDictionaryIdChanges theOldRecord; # ; # # ttsBegin; # # // After moving, first look with the name of the table to find the old record logged before the layer move # theOldRecord = NVMPSqlDictionaryIdChanges::findTableRecordByName(this.parmTableName(), true); # # if(theOldRecord.RecId) # { # theOldRecord.NewTableId = TableName2Id(this.parmTableName()); # theOldRecord.doUpdate(); # } # else # { # //TODO KeSae : Label! # throw error(strFmt("Table %1 not found in the pending dictionary changes table. Did you include it before the layer move?")); # } # # ttsCommit; # #} ENDSOURCE SOURCE #construct #private static NVMPTableMoveAction_CollectIdsPostMove construct() #{ # return new NVMPTableMoveAction_CollectIdsPostMove(); #} ENDSOURCE SOURCE #newFromTableMoveWizard #public static NVMPTableMoveAction_CollectIdsPostMove newFromTableMoveWizard(NVMPSourceUtilEntryLevelId _layerId # , TableName _tableName) #{ # NVMPTableMoveAction_CollectIdsPostMove NVMPTableMoveAction_CollectIdsPostMove = new NVMPTableMoveAction_CollectIdsPostMove(); # ; # # NVMPTableMoveAction_CollectIdsPostMove.parmLayerId(_layerId); # NVMPTableMoveAction_CollectIdsPostMove.parmTableName(_tableName); # # return NVMPTableMoveAction_CollectIdsPostMove; #} # ENDSOURCE ENDMETHODS ENDCLASS ***Element: CLS ; Microsoft Dynamics AX Class: NVMPTableMoveAction_RenameSQLTableNames unloaded ; -------------------------------------------------------------------------------- CLSVERSION 1 CLASS #NVMPTableMoveAction_RenameSQLTableNames PROPERTIES Name #NVMPTableMoveAction_RenameSQLTableNames Extends # RunOn #Server ENDPROPERTIES METHODS Version: 3 SOURCE #classDeclaration #class NVMPTableMoveAction_RenameSQLTableNames implements NVMPITableMoveAction #{ #} ENDSOURCE SOURCE #renameSqlLongTableNames #/// #/// Check the length of table names and renames the tables in the SQL backend #/// This is needed because long tables names contain the table id when shortened #/// and when the table is moved from layer, then we need to rename the table #/// to contain the new tableid so that the synchronisation will see the table in SQL #/// #private void renameSqlLongTableNames() #{ # NVMPSqlDictionaryIdChanges dictionaryChanges; # SqlDictionary sqlDictionary; # str 50 newSqlTableName; # str 50 oldSqlTableName; # str sqlUpdateStr; # # void executeStatement() # { # Connection connection; # Statement statement; # int updatedRows; # ; # # // create connection object # connection = new Connection(); # # // create statement # statement = connection.createStatement(); # # // assert SQL statement execute permission # new SqlStatementExecutePermission(sqlUpdateStr).assert(); # # // run the statement # updatedRows = statement.executeUpdate(sqlUpdateStr); # # // Revert the permission assert # CodeAccessPermission::revertAssert(); # } # ; # # try # { # ttsBegin; # # // Loop every changed table # while select dictionaryChanges # where dictionaryChanges.OldFieldId == 0 # && dictionaryChanges.NewFieldId == 0 # { # if(strLen(dictionaryChanges.Name) > 30) # { # oldSqlTableName = substr(dictionaryChanges.Name, 1, 25) + int2str(dictionaryChanges.OldTableId); # newSqlTableName = substr(dictionaryChanges.Name, 1, 25) + int2str(dictionaryChanges.NewTableId); # # sqlUpdateStr = strFmt('EXEC sp_rename \'%1\', \'%2\';', oldSqlTableName, newSqlTableName); # # executeStatement(); # # // Also rename the table name in the SYSSqlDictionary table otherwise the kernel will issue a create table statement # update_recordset sqlDictionary # setting sqlName = newSqlTableName # where sqlDictionary.sqlName == oldSqlTableName # && sqlDictionary.fieldId == 0; # } # } # # ttsCommit; # } # catch # { # ttsAbort; # # //TODO KeSae : Label # throw error(strFmt('Table %1 could not be renamed to %2', oldSqlTableName, newSqlTableName)); # } #} # ENDSOURCE SOURCE #run #public void run() #{ # ; # this.renameSqlLongTableNames(); #} ENDSOURCE SOURCE #construct #public static NVMPTableMoveAction_RenameSQLTableNames construct() #{ # return new NVMPTableMoveAction_RenameSQLTableNames(); #} ENDSOURCE ENDMETHODS ENDCLASS ***Element: CLS ; Microsoft Dynamics AX Class: NVMPTableMoveAction_UpdateSqlDictionary unloaded ; -------------------------------------------------------------------------------- CLSVERSION 1 CLASS #NVMPTableMoveAction_UpdateSqlDictionary PROPERTIES Name #NVMPTableMoveAction_UpdateSqlDictionary Extends # RunOn #Called from ENDPROPERTIES METHODS Version: 3 SOURCE #classDeclaration #class NVMPTableMoveAction_UpdateSqlDictionary implements NVMPITableMoveAction #{ #} ENDSOURCE SOURCE #run #/// #/// Updates the SQL Dictionary with the new object id's found in the NVMPSqlDictionaryIdChanges table #/// #public void run() #{ # SQLDictionary sqlDictionary; # NVMPSqlDictionaryIdChanges dictionaryChanges; # DictTable dictTable; # int i = 0; # ; # # ttsBegin; # # // Loop every changed table / field id # while select dictionaryChanges # { # dictTable = new DictTable(dictionaryChanges.NewTableId); # # if(dictTable && !dictTable.isTmp()) # { # ttsBegin; # # // Fetch the sqlDictionary data # select firstonly forupdate sqlDictionary # where sqlDictionary.tabId == dictionaryChanges.OldTableId # && sqlDictionary.fieldId == dictionaryChanges.OldFieldId; # # if(sqlDictionary.RecId) # { # // Fill in the newly created id's # sqlDictionary.tabId = dictionaryChanges.NewTableId; # sqlDictionary.fieldId = dictionaryChanges.NewFieldId; # sqlDictionary.doUpdate(); # } # # ttsCommit; # } # } # # ttsCommit; #} ENDSOURCE SOURCE #construct #public static NVMPTableMoveAction_UpdateSqlDictionary construct() #{ # return new NVMPTableMoveAction_UpdateSqlDictionary(); #} ENDSOURCE ENDMETHODS ENDCLASS ***Element: FRM ; Microsoft Dynamics AX Forms unloaded ; -------------------------------------------------------------------------------- FRMVERSION 5 FORM #NVMPTableLayerMoveWizard PROPERTIES Name #NVMPTableLayerMoveWizard ENDPROPERTIES METHODS Version: 3 SOURCE #classDeclaration #class FormRun extends ObjectRun #{ # NVMPTableLayerMoveWizard sysWizard; # # boolean skipTabChangeMethod; # # #NVMPTableLayerMoveWizardSteps #} # ENDSOURCE SOURCE #tabChange #void tabChange(int _FromTab) #{ # ; # switch(_fromTab) # { # case #Parameters: # // Pass the parameter fields to the wizard class # element.wizard().parmPrePostLayerMove (PrePostLayerMove.selection()); # element.wizard().parmSourceLayer (SourceLayer.selection()); # element.wizard().parmDestinationLayer (DestinationLayer.selection()); # # // If the wizard is used to gather id's after the layer move # // Then call the processing after the parameters # if(element.wizard().parmPrePostLayerMove() == NVMPPrePostLayerMove::Post) # { # element.wizard().processTablesDictionaryData(); # } # # break; # # case #TableNames: # // Pass the table names to the wizard class # element.wizard().parmTmpTableName(TmpTableName); # # // Let the wizard process the data for the entered tables (Gather tableId's and fieldId's) # element.wizard().processTablesDictionaryData(); # # break; # # case #DictionaryChanges: # # // When after the layer move and leaving the dictionary change results # if(element.wizard().parmPrePostLayerMove() == NVMPPrePostLayerMove::Post) # { # // Update the sql dictionary # element.wizard().updateSqlDictionaryWithNewIds(); # # // Rename long tablenames in sql # element.wizard().renameSqlLongTableNames(); # } # # break; # } # # // After the processing, execute the query on the NVMPSqlDictionaryIdChanges_DS to see the current data # NVMPSqlDictionaryIdChanges_DS.executeQuery(); #} ENDSOURCE SOURCE #run #void run() #{ # element.setTexts(); # # super(); #} # ENDSOURCE SOURCE #setTexts #void setTexts() #{ # ; # WizardInfoText.height(50); # WizardInfoText.text('Use this wizard to update the SQL Dictionary information\nafter moving a table from one layer to another'); #} # ENDSOURCE SOURCE #init #void init() #{ # ; # super(); # # if (element.Args().caller()) # { # sysWizard = element.Args().caller(); # } # else # { # NVMPTableLayerMoveWizard::main(new args()); # element.closeCancel(); # } #} # ENDSOURCE SOURCE #wizard #NVMPTableLayerMoveWizard wizard() #{ # return sysWizard; #} # ENDSOURCE SOURCE #tab #FormTabControl tab() #{ # return tab; #} # ENDSOURCE ENDMETHODS OBJECTBANK PROPERTIES ENDPROPERTIES DATASOURCE OBJECTPOOL PROPERTIES Name #TmpTableName Table #TmpTableName ENDPROPERTIES FIELDLIST ENDFIELDLIST ENDOBJECTPOOL METHODS Version: 3 SOURCE #executeQuery #public void executeQuery() #{ # ; # // If the wizard already contains tables passed to it, show them # if(sysWizard.parmTmpTableName().RecId) # { # TmpTableName.setTmpData(sysWizard.parmTmpTableName()); # } # # super(); #} ENDSOURCE SOURCE #init #public void init() #{ # ; # super(); #} ENDSOURCE ENDMETHODS ENDDATASOURCE DATASOURCE OBJECTPOOL PROPERTIES Name #NVMPSqlDictionaryIdChanges Table #NVMPSqlDictionaryIdChanges ENDPROPERTIES FIELDLIST ENDFIELDLIST ENDOBJECTPOOL ENDDATASOURCE ENDOBJECTBANK JOINS ENDJOINS DESIGN PROPERTIES Caption #SQL Dictionary Update Wizard ENDPROPERTIES CONTAINER CONTROL TAB PROPERTIES Name #Tab AutoDeclaration #Yes Width #Column width Columns #1 ENDPROPERTIES METHODS Version: 3 SOURCE #tabChanged #public void tabChanged(int _FromTab, int _ToTab) #{ # super(_FromTab, _ToTab); # # // TODO KeSae : use tabchanged instead of tabchange #} ENDSOURCE SOURCE #tabChange #public boolean tabChange(int _FromTab) #{ # boolean ret; # ; # # ret = super(_FromTab); # # element.tabChange(_FromTab); # # return ret; #} ENDSOURCE ENDMETHODS CONTAINER CONTROL TABPAGE PROPERTIES Name #WelcomeTab Width #Column width Height #Column height Caption #SQL Dictionary update after layer move ENDPROPERTIES CONTAINER CONTROL STATICTEXT PROPERTIES Name #WizardInfoText AutoDeclaration #Yes ENDPROPERTIES ENDCONTROL ENDCONTAINER ENDCONTROL CONTROL TABPAGE PROPERTIES Name #ParameterTab Width #Column width Height #Column height HelpText #Specify move information Caption #Layer move parameters ENDPROPERTIES CONTAINER CONTROL COMBOBOX PROPERTIES Name #PrePostLayerMove AutoDeclaration #Yes EnumType #NVMPPrePostLayerMove ENDPROPERTIES METHODS Version: 3 SOURCE #modified #public boolean modified() #{ # boolean ret = super(); # ; # # if(PrePostLayerMove.selection() == NVMPPrePostLayerMove::Post) # { # element.wizard().skipTab(#TableNames, true); # } # else # { # element.wizard().skipTab(#TableNames, false); # } # # return ret; #} ENDSOURCE ENDMETHODS ENDCONTROL CONTROL COMBOBOX PROPERTIES Name #SourceLayer AutoDeclaration #Yes ExtendedDataType ARRAY #NVMPSourceUtilEntryLevelId # ENDARRAY ENDPROPERTIES ENDCONTROL CONTROL COMBOBOX PROPERTIES Name #DestinationLayer AutoDeclaration #Yes ExtendedDataType ARRAY #NVMPDestinationUtilEntryLevelId # ENDARRAY ENDPROPERTIES ENDCONTROL ENDCONTAINER ENDCONTROL CONTROL TABPAGE PROPERTIES Name #SourceTablesTab Width #Column width Height #Column height HelpText #Specify the tables that have changed dictionary id's Caption #Select tables ENDPROPERTIES CONTAINER CONTROL GRID PROPERTIES Name #SourceTableGrid Width #Column width Height #Column height DataSource #TmpTableName ENDPROPERTIES CONTAINER CONTROL STRINGEDIT PROPERTIES Name #TmpTableName_TableName DataSource #TmpTableName DataField #TableName ENDPROPERTIES ENDCONTROL ENDCONTAINER ENDCONTROL ENDCONTAINER ENDCONTROL CONTROL TABPAGE PROPERTIES Name #DictionaryChangesTable Width #Column width Height #Column height HelpText #Table and field Id's collected from the selected tables Caption #Pending dictionary change results ENDPROPERTIES CONTAINER CONTROL GRID PROPERTIES Name #DictionaryChanges Width #Column width Height #Column height DataSource #NVMPSqlDictionaryIdChanges DataGroup #Overview ENDPROPERTIES CONTAINER CONTROL INTEDIT PROPERTIES Name #DictionaryChanges_OldTableId DataSource #NVMPSqlDictionaryIdChanges DataField #OldTableId ENDPROPERTIES ENDCONTROL CONTROL INTEDIT PROPERTIES Name #DictionaryChanges_OldFieldId DataSource #NVMPSqlDictionaryIdChanges DataField #OldFieldId ENDPROPERTIES ENDCONTROL CONTROL STRINGEDIT PROPERTIES Name #DictionaryChanges_Name DataSource #NVMPSqlDictionaryIdChanges DataField #Name ENDPROPERTIES ENDCONTROL CONTROL INTEDIT PROPERTIES Name #DictionaryChanges_NewFieldId DataSource #NVMPSqlDictionaryIdChanges DataField #NewFieldId ENDPROPERTIES ENDCONTROL CONTROL INTEDIT PROPERTIES Name #DictionaryChanges_NewTableId DataSource #NVMPSqlDictionaryIdChanges DataField #NewTableId ENDPROPERTIES ENDCONTROL ENDCONTAINER ENDCONTROL ENDCONTAINER ENDCONTROL CONTROL TABPAGE PROPERTIES Name #Finish Caption #Finish ENDPROPERTIES CONTAINER ENDCONTAINER ENDCONTROL ENDCONTAINER ENDCONTROL ENDCONTAINER ENDDESIGN ENDFORM ***Element: FRM ; Microsoft Dynamics AX Forms unloaded ; -------------------------------------------------------------------------------- FRMVERSION 5 FORM #NVMPSqlDictionaryIdChanges PROPERTIES Name #NVMPSqlDictionaryIdChanges ENDPROPERTIES METHODS Version: 3 SOURCE #classDeclaration #public class FormRun extends ObjectRun #{ #} ENDSOURCE ENDMETHODS OBJECTBANK PROPERTIES ENDPROPERTIES DATASOURCE OBJECTPOOL PROPERTIES Name #NVMPTmpSqlDictionaryIdChanges Table #NVMPSqlDictionaryIdChanges InsertIfEmpty #No ENDPROPERTIES FIELDLIST ENDFIELDLIST ENDOBJECTPOOL ENDDATASOURCE ENDOBJECTBANK JOINS ENDJOINS DESIGN PROPERTIES Caption #@HEL287 TitleDatasource #NVMPTmpSqlDictionaryIdChanges ENDPROPERTIES CONTAINER CONTROL TAB PROPERTIES Name #Tab Width #Column width Height #Column height ENDPROPERTIES CONTAINER CONTROL TABPAGE PROPERTIES Name #Overview Caption #@SYS9039 ENDPROPERTIES CONTAINER CONTROL GRID PROPERTIES Name #Grid Width #Column width Height #Column height DataSource #NVMPTmpSqlDictionaryIdChanges DataGroup #Overview AutoDataGroup #Yes ENDPROPERTIES CONTAINER ENDCONTAINER ENDCONTROL ENDCONTAINER ENDCONTROL CONTROL TABPAGE PROPERTIES Name #General Caption #@SYS19924 ENDPROPERTIES CONTAINER CONTROL GROUP PROPERTIES Name #Identification DataSource #NVMPTmpSqlDictionaryIdChanges DataGroup #Identification AutoDataGroup #Yes ENDPROPERTIES CONTAINER ENDCONTAINER ENDCONTROL ENDCONTAINER ENDCONTROL ENDCONTAINER ENDCONTROL ENDCONTAINER ENDDESIGN ENDFORM nl Overzicht @SYS9039 0 0 nl Algemeen @SYS19924 0 0 ***Element: FTM ; Microsoft Dynamics AX MENUITEM : NVMPTableLayerMoveWizard unloaded ; -------------------------------------------------------------------------------- VERSION 1 MENUITEM #NVMPTableLayerMoveWizard Type: 1 PROPERTIES Name #NVMPTableLayerMoveWizard ObjectType #Class Object #NVMPTableLayerMoveWizard ENDPROPERTIES ENDMENUITEM ***Element: FTM ; Microsoft Dynamics AX MENUITEM : NVMPSqlDictionaryIdChanges unloaded ; -------------------------------------------------------------------------------- VERSION 1 MENUITEM #NVMPSqlDictionaryIdChanges Type: 1 PROPERTIES Name #NVMPSqlDictionaryIdChanges Label #@HEL287 Object #NVMPSqlDictionaryIdChanges ENDPROPERTIES ENDMENUITEM ***Element: PRN ; Microsoft Dynamics AX Project : KeSae_TableMove unloaded ; -------------------------------------------------------------------------------- PROJECTVERSION 2 PROJECT #KeSae_TableMove SHARED PROPERTIES Name #KeSae_TableMove ENDPROPERTIES PROJECTCLASS ProjectNode GROUP #DataDictionary PROPERTIES Name #DataDictionary ProjectGroupType #DataDictionary GroupMask # PreventEditProperties #No ENDPROPERTIES GROUP #Tables PROPERTIES Name #Tables ProjectGroupType #Tables GroupMask # PreventEditProperties #No ENDPROPERTIES BEGINNODE FILETYPE 0 UTILTYPE 44 UTILOBJECTID 30031 NODETYPE 204 NAME #NVMPSqlDictionaryIdChanges ENDNODE ENDGROUP GROUP #ExtendedDataTypes PROPERTIES Name #ExtendedDataTypes ProjectGroupType #ExtendedDataTypes GroupMask # PreventEditProperties #No ENDPROPERTIES BEGINNODE FILETYPE 0 UTILTYPE 41 UTILOBJECTID 30186 NODETYPE 228 NAME #NVMPUtilEntryLevelId ENDNODE BEGINNODE FILETYPE 0 UTILTYPE 41 UTILOBJECTID 30184 NODETYPE 228 NAME #NVMPSourceUtilEntryLevelId ENDNODE BEGINNODE FILETYPE 0 UTILTYPE 41 UTILOBJECTID 30181 NODETYPE 228 NAME #NVMPDestinationUtilEntryLevelId ENDNODE BEGINNODE FILETYPE 0 UTILTYPE 41 UTILOBJECTID 30183 NODETYPE 234 NAME #NVMPIdentifierName ENDNODE BEGINNODE FILETYPE 0 UTILTYPE 41 UTILOBJECTID 30185 NODETYPE 232 NAME #NVMPTableId ENDNODE BEGINNODE FILETYPE 0 UTILTYPE 41 UTILOBJECTID 30182 NODETYPE 232 NAME #NVMPFieldId ENDNODE ENDGROUP GROUP #BaseEnums PROPERTIES Name #BaseEnums ProjectGroupType #BaseEnums GroupMask # PreventEditProperties #No ENDPROPERTIES BEGINNODE FILETYPE 0 UTILTYPE 40 UTILOBJECTID 30031 NODETYPE 209 NAME #NVMPPrePostLayerMove ENDNODE ENDGROUP ENDGROUP GROUP #Macros PROPERTIES Name #Macros ProjectGroupType #Macros GroupMask # PreventEditProperties #No ENDPROPERTIES BEGINNODE FILETYPE 0 UTILTYPE 4 UTILOBJECTID 0 NODETYPE 218 NAME #NVMPTableLayerMoveWizardSteps ENDNODE ENDGROUP GROUP #Classes PROPERTIES Name #Classes ProjectGroupType #Classes GroupMask # PreventEditProperties #No ENDPROPERTIES BEGINNODE FILETYPE 0 UTILTYPE 45 UTILOBJECTID 30290 NODETYPE 329 NAME #NVMPTableLayerMoveWizard ENDNODE BEGINNODE FILETYPE 0 UTILTYPE 45 UTILOBJECTID 30292 NODETYPE 329 NAME #NVMPITableMoveAction ENDNODE BEGINNODE FILETYPE 0 UTILTYPE 45 UTILOBJECTID 30299 NODETYPE 329 NAME #NVMPTableMoveAction_ClearPreviousData ENDNODE BEGINNODE FILETYPE 0 UTILTYPE 45 UTILOBJECTID 30294 NODETYPE 329 NAME #NVMPTableMoveAction_CollectIds ENDNODE BEGINNODE FILETYPE 0 UTILTYPE 45 UTILOBJECTID 30300 NODETYPE 329 NAME #NVMPTableMoveAction_CollectIdsPreMove ENDNODE BEGINNODE FILETYPE 0 UTILTYPE 45 UTILOBJECTID 30301 NODETYPE 329 NAME #NVMPTableMoveAction_CollectIdsPostMove ENDNODE BEGINNODE FILETYPE 0 UTILTYPE 45 UTILOBJECTID 30297 NODETYPE 329 NAME #NVMPTableMoveAction_RenameSQLTableNames ENDNODE BEGINNODE FILETYPE 0 UTILTYPE 45 UTILOBJECTID 30298 NODETYPE 329 NAME #NVMPTableMoveAction_UpdateSqlDictionary ENDNODE ENDGROUP GROUP #Forms PROPERTIES Name #Forms ProjectGroupType #Forms GroupMask # PreventEditProperties #No ENDPROPERTIES BEGINNODE FILETYPE 0 UTILTYPE 11 UTILOBJECTID 0 NODETYPE 201 NAME #NVMPTableLayerMoveWizard ENDNODE BEGINNODE FILETYPE 0 UTILTYPE 11 UTILOBJECTID 0 NODETYPE 201 NAME #NVMPSqlDictionaryIdChanges ENDNODE ENDGROUP GROUP #Reports PROPERTIES Name #Reports ProjectGroupType #Reports GroupMask # PreventEditProperties #No ENDPROPERTIES ENDGROUP GROUP #Queries PROPERTIES Name #Queries ProjectGroupType #Queries GroupMask # PreventEditProperties #No ENDPROPERTIES ENDGROUP GROUP #Jobs PROPERTIES Name #Jobs ProjectGroupType #Jobs GroupMask # PreventEditProperties #No ENDPROPERTIES ENDGROUP GROUP #Menus PROPERTIES Name #Menus ProjectGroupType #Menus GroupMask # PreventEditProperties #No ENDPROPERTIES ENDGROUP GROUP #MenuItems PROPERTIES Name #MenuItems ProjectGroupType #MenuItems GroupMask # PreventEditProperties #No ENDPROPERTIES GROUP #Action PROPERTIES Name #Action ProjectGroupType #Action GroupMask # PreventEditProperties #No ENDPROPERTIES ENDGROUP GROUP #Display PROPERTIES Name #Display ProjectGroupType #Display GroupMask # PreventEditProperties #No ENDPROPERTIES BEGINNODE FILETYPE 0 UTILTYPE 1 UTILOBJECTID 0 NODETYPE 296 NAME #NVMPTableLayerMoveWizard ENDNODE BEGINNODE FILETYPE 0 UTILTYPE 1 UTILOBJECTID 0 NODETYPE 296 NAME #NVMPSqlDictionaryIdChanges ENDNODE ENDGROUP GROUP #Output PROPERTIES Name #Output ProjectGroupType #Output GroupMask # PreventEditProperties #No ENDPROPERTIES ENDGROUP ENDGROUP GROUP #Services PROPERTIES Name #Services ProjectGroupType #Services GroupMask # PreventEditProperties #No ENDPROPERTIES ENDGROUP ENDPROJECT ***Element: END