/// <summary> /// Called when user clicks on the add-in menu /// </summary> /// <param name="e">The context of the VS tools and metadata</param> public override void OnClick(AddinDesignerEventArgs e) { try { var field = (BaseField)e.SelectedElement; var dialog = new CreateIndex(); dialog.CreateIndexVm.IndexName = field.Name + "_Idx"; dialog.ShowDialog(); var axTable = (AxTable)field.Table.GetMetadataType(); var index = new AxTableIndex(); index.Name = dialog.CreateIndexVm.IndexName; index.AllowDuplicates = dialog.CreateIndexVm.AllowDuplicates ? NoYes.Yes : NoYes.No; index.AlternateKey = dialog.CreateIndexVm.AlternativeKey ? NoYes.Yes : NoYes.No; e.SelectedElements.OfType <BaseField>() .ToList().ForEach(f => { var fieldIndex = new AxTableIndexField { DataField = f.Name, Name = f.Name }; index.AddField(fieldIndex); }); // Add the method to the class axTable.AddIndex(index); var fieldNameCamelCase = field.Name.ToCamelCase(); var tableNameCamelCase = axTable.Name.ToCamelCase(); var source = $@"public static {axTable.Name} findBy{field.Name} ({field.ExtendedDataType} _{fieldNameCamelCase}, boolean _forUpdate = false) {{ {axTable.Name} {tableNameCamelCase}; {tableNameCamelCase}.selectForUpdate(_forUpdate); if(_{fieldNameCamelCase}) select firstonly {tableNameCamelCase} where {tableNameCamelCase}.{field .Name} == _{fieldNameCamelCase}; return {tableNameCamelCase}; }}"; axTable.AddMethod(BuildMethod(field.Name, source)); var metaModelProviders = ServiceLocator.GetService(typeof(IMetaModelProviders)) as IMetaModelProviders; var metaModelService = metaModelProviders.CurrentMetaModelService; var model = DesignMetaModelService.Instance.CurrentMetadataProvider.Tables.GetModelInfo(axTable.Name) .FirstOrDefault(); // Update the file metaModelService.UpdateTable(axTable, new ModelSaveInfo(model)); } catch (Exception ex) { CoreUtility.HandleExceptionWithErrorMessage(ex); } }
void DoTableCreate() { AxTable newTable = _axHelper.MetadataProvider.Tables.Read(TableName); if (newTable == null) { newTable = new AxTable(); newTable.Name = TableName; newTable.Label = TableLabel; newTable.TitleField1 = KeyFieldName; newTable.CacheLookup = RecordCacheLevel.Found; newTable.ClusteredIndex = $"{KeyFieldName}Idx"; newTable.PrimaryIndex = newTable.ClusteredIndex; newTable.ReplacementKey = newTable.ClusteredIndex; newTable.TableGroup = TableGroup.Group; newTable.CreatedBy = NoYes.Yes; newTable.CreatedDateTime = NoYes.Yes; newTable.ModifiedBy = NoYes.Yes; newTable.ModifiedDateTime = NoYes.Yes; AxTableField primaryField = new AxTableFieldString(); primaryField.Name = KeyFieldName; primaryField.ExtendedDataType = PrimaryKeyEdtName; primaryField.IgnoreEDTRelation = NoYes.Yes; primaryField.AllowEdit = NoYes.No; primaryField.Mandatory = NoYes.Yes; newTable.AddField(primaryField); AxTableField descriptionField = new AxTableFieldString(); descriptionField.Name = "Description"; descriptionField.ExtendedDataType = "Description"; newTable.AddField(descriptionField); AxTableIndexField axTableIndexField = new AxTableIndexField(); axTableIndexField.DataField = KeyFieldName; axTableIndexField.Name = KeyFieldName; AxTableIndex axTableIndex = new AxTableIndex(); axTableIndex.Name = newTable.ClusteredIndex; axTableIndex.AlternateKey = NoYes.Yes; axTableIndex.AddField(axTableIndexField); newTable.AddIndex(axTableIndex); AxTableFieldGroup axTableFieldGroup; AxTableFieldGroupField axTableFieldGroupField; axTableFieldGroup = new AxTableFieldGroup { Name = "AutoReport", IsSystemGenerated = NoYes.Yes }; axTableFieldGroupField = new AxTableFieldGroupField { Name = KeyFieldName, DataField = KeyFieldName }; axTableFieldGroup.AddField(axTableFieldGroupField); newTable.AddFieldGroup(axTableFieldGroup); axTableFieldGroup = new AxTableFieldGroup { Name = "AutoLookup", IsSystemGenerated = NoYes.Yes }; newTable.AddFieldGroup(axTableFieldGroup); axTableFieldGroup = new AxTableFieldGroup { Name = "AutoIdentification", IsSystemGenerated = NoYes.Yes, AutoPopulate = NoYes.Yes }; newTable.AddFieldGroup(axTableFieldGroup); axTableFieldGroup = new AxTableFieldGroup { Name = "AutoSummary", IsSystemGenerated = NoYes.Yes }; newTable.AddFieldGroup(axTableFieldGroup); axTableFieldGroup = new AxTableFieldGroup { Name = "AutoBrowse", IsSystemGenerated = NoYes.Yes }; newTable.AddFieldGroup(axTableFieldGroup); axTableFieldGroup = new AxTableFieldGroup { Name = "Overview", Label = "Overview" }; axTableFieldGroupField = new AxTableFieldGroupField { Name = KeyFieldName, DataField = KeyFieldName }; axTableFieldGroup.AddField(axTableFieldGroupField); if (descriptionField != null) { axTableFieldGroupField = new AxTableFieldGroupField { Name = descriptionField.Name, DataField = descriptionField.Name }; axTableFieldGroup.AddField(axTableFieldGroupField); } newTable.AddFieldGroup(axTableFieldGroup); AddTableFindMethodParms findMethodParms = new AddTableFindMethodParms(); findMethodParms.IsCreateFind = true; findMethodParms.IsTestMode = true; findMethodParms.TableName = TableName; findMethodParms.VarName = TableVarName; findMethodParms.Fields = new List <AxTableFieldParm> { new AxTableFieldParm { FieldName = KeyFieldName, FieldType = PrimaryKeyEdtName, IsMandatory = true } }; AxMethod axMethod = new AxMethod(); axMethod.Name = "find"; axMethod.IsStatic = true; axMethod.Source = findMethodParms.GenerateResult(); newTable.AddMethod(axMethod); _axHelper.MetaModelService.CreateTable(newTable, _axHelper.ModelSaveInfo); _axHelper.AppendToActiveProject(newTable); AddLog($"Table: {newTable.Name}; "); AxEdt edtLocal = _axHelper.MetadataProvider.Edts.Read(PrimaryKeyEdtName); if (edtLocal != null) { if (String.IsNullOrEmpty(edtLocal.ReferenceTable)) //check for the existing EDT. Do not modify it { if (edtLocal.Relations == null || edtLocal.Relations.Count == 0) //no old style relations { edtLocal.ReferenceTable = TableName; edtLocal.AddTableReference(TableName, KeyFieldName); _axHelper.MetaModelService.UpdateExtendedDataType(edtLocal, _axHelper.ModelSaveInfo); _axHelper.AppendToActiveProject(edtLocal); } } //AddLog($"EDT: {edtLocal.Name}; "); } } }
/// <summary> /// Called when user clicks on the add-in menu /// </summary> /// <param name="e">The context of the VS tools and metadata</param> public override void OnClick(AddinDesignerEventArgs e) { try { var field = (BaseField)e.SelectedElement; var dialog = new CreateIndex(); dialog.CreateIndexVm.IndexName = field.Name + "_Idx"; dialog.ShowDialog(); var axTable = (AxTable)field.Table.GetMetadataType(); var index = new AxTableIndex(); index.Name = dialog.CreateIndexVm.IndexName; index.AllowDuplicates = dialog.CreateIndexVm.AllowDuplicates ? NoYes.Yes : NoYes.No; index.AlternateKey = dialog.CreateIndexVm.AlternativeKey ? NoYes.Yes : NoYes.No; e.SelectedElements.OfType <BaseField>() .ToList().ForEach(f => { var fieldIndex = new AxTableIndexField { DataField = f.Name, Name = f.Name }; index.AddField(fieldIndex); }); // Add the method to the class axTable.AddIndex(index); var source = $@"public static {axTable.Name} findBy{field.Name} ({field.ExtendedDataType} _{Kernel.LocalUtils .toCamelCase(field.Name)}, boolean _forUpdate = false) {{ {axTable.Name} {Kernel.LocalUtils.toCamelCase(axTable.Name)}; {Kernel.LocalUtils.toCamelCase(axTable.Name)}.selectForUpdate(_forUpdate); if(_{Kernel.LocalUtils.toCamelCase(field.Name)}) select firstonly {Kernel.LocalUtils.toCamelCase(axTable.Name)} where {Kernel.LocalUtils.toCamelCase(axTable.Name)}.{field .Name} == _{Kernel.LocalUtils.toCamelCase(field.Name)}; return {Kernel.LocalUtils.toCamelCase(axTable.Name)}; }}"; // Add the method to the class axTable.AddMethod(BuildMethod(field.Name, source)); // Prepare objects needed for saving var metaModelProviders = ServiceLocator.GetService(typeof(IMetaModelProviders)) as IMetaModelProviders; var metaModelService = metaModelProviders.CurrentMetaModelService; // Getting the model will likely have to be more sophisticated, such as getting the model of the project and checking // if the object has the same model. // But this shold do for demonstration. var model = DesignMetaModelService.Instance.CurrentMetadataProvider.Tables.GetModelInfo(axTable.Name) .FirstOrDefault(); // Update the file metaModelService.UpdateTable(axTable, new ModelSaveInfo(model)); } catch (Exception ex) { CoreUtility.HandleExceptionWithErrorMessage(ex); } }