protected AxTableRelationForeignKey AddTableRelation(AxTableField field, KeyedObjectCollection <AxTableRelation> existingRelations) { if (!string.IsNullOrEmpty(field.ExtendedDataType)) { var edt = _axHelper.MetadataProvider.Edts.Read(field.ExtendedDataType); if (edt == null) { return(null); } if (string.IsNullOrEmpty(edt.ReferenceTable)) { return(null); } AxEdtTableReference firstRef = edt.TableReferences.First(); if (firstRef == null) { return(null); } string newRelationName = edt.ReferenceTable; if (existingRelations.Contains(newRelationName)) { newRelationName = edt.ReferenceTable + "_" + field.Name; } AxTableRelationForeignKey axTableRelation = new AxTableRelationForeignKey(); axTableRelation.Name = newRelationName; axTableRelation.EDTRelation = NoYes.Yes; axTableRelation.Cardinality = Cardinality.ZeroMore; axTableRelation.OnDelete = DeleteAction.Restricted; axTableRelation.RelatedTable = edt.ReferenceTable; axTableRelation.RelatedTableCardinality = IsMandatory ? RelatedTableCardinality.ExactlyOne : RelatedTableCardinality.ZeroOne; axTableRelation.RelationshipType = RelationshipType.Association; AxTableRelationConstraintField axTableRelationConstraint = new AxTableRelationConstraintField(); axTableRelationConstraint.Name = field.Name; axTableRelationConstraint.Field = field.Name; axTableRelationConstraint.SourceEDT = field.ExtendedDataType; axTableRelationConstraint.RelatedField = firstRef.RelatedField; axTableRelation.AddConstraint(axTableRelationConstraint); return(axTableRelation); } return(null); }
public void InitFromSelectedElement(AddinDesignerEventArgs e) { if (_axHelper == null) { _axHelper = new AxHelper(); } BaseField baseField = e.SelectedElements.OfType <BaseField>().First(); SelectedField = baseField.Name; TableName = baseField.Table != null?baseField.Table.GetMetadataType().Name : baseField.TableExtension?.GetMetadataType().Name; NewFieldEngine newFieldEngine = new NewFieldEngine(); newFieldEngine.GetSetHelper = _axHelper; if (TableName.Contains(".") == false) { _axTable = _axHelper.MetadataProvider.Tables.Read(TableName); AxTableField axTableField = _axTable.Fields[baseField.Name]; TableRelationForeignKey = newFieldEngine.AddTableRelation(axTableField, _axTable.Relations); } else { _axTableExtension = _axHelper.MetadataProvider.TableExtensions.Read(TableName); AxTableField axTableField = _axTableExtension.Fields[baseField.Name]; TableRelationForeignKey = newFieldEngine.AddTableRelation(axTableField, _axTableExtension.Relations); } if (TableRelationForeignKey == null) { throw new System.Exception($"Field {baseField.Name} doesn't have an EDT relation"); } RelationName = TableRelationForeignKey.Name; }
protected void AddField(AxTableField field) { AxTableFieldGroup axTableFieldGroup; AxTableFieldGroupField axTableFieldGroupField = new AxTableFieldGroupField(); axTableFieldGroupField.Name = field.Name; axTableFieldGroupField.DataField = field.Name; if (TableName.Contains(".") == false) { AxTable axTable = _axHelper.MetadataProvider.Tables.Read(TableName); if (IsDisplayMethod) { AxMethod axMethod = new AxMethod(); axMethod.Name = field.Name; axMethod.Source = $"public display {field.ExtendedDataType} {field.Name}() " + Environment.NewLine + "{" + Environment.NewLine + " return '';" + Environment.NewLine + "}"; axTable.AddMethod(axMethod); } else { axTable.Fields.Add(field); } if (GroupName != String.Empty) { if (axTable.FieldGroups.Contains(GroupName)) { axTableFieldGroup = axTable.FieldGroups.getObject(GroupName); axTableFieldGroup.AddField(axTableFieldGroupField); } else { axTableFieldGroup = new AxTableFieldGroup { Name = GroupName }; axTableFieldGroup.AddField(axTableFieldGroupField); axTable.AddFieldGroup(axTableFieldGroup); } } if (!IsDisplayMethod) { AxTableRelationForeignKey axTableRelationForeignKey = AddTableRelation(field, axTable.Relations); if (axTableRelationForeignKey != null) { axTable.AddRelation(axTableRelationForeignKey); } } _axHelper.MetadataProvider.Tables.Update(axTable, _axHelper.ModelSaveInfo); } else { AxTableExtension axTableExtension = _axHelper.MetadataProvider.TableExtensions.Read(TableName); if (!IsDisplayMethod) { axTableExtension.Fields.Add(field); } if (GroupName != String.Empty) { if (axTableExtension.FieldGroups.Contains(GroupName)) { axTableFieldGroup = axTableExtension.FieldGroups.getObject(GroupName); axTableFieldGroup.AddField(axTableFieldGroupField); } else { axTableFieldGroup = new AxTableFieldGroup { Name = GroupName }; axTableFieldGroup.AddField(axTableFieldGroupField); axTableExtension.FieldGroups.Add(axTableFieldGroup); } } if (!IsDisplayMethod) { AxTableRelationForeignKey axTableRelationForeignKey = AddTableRelation(field, axTableExtension.Relations); if (axTableRelationForeignKey != null) { axTableExtension.Relations.Add(axTableRelationForeignKey); } } _axHelper.MetadataProvider.TableExtensions.Update(axTableExtension, _axHelper.ModelSaveInfo); } }
protected AxTableRelationForeignKey AddTableRelation(AxTableField field, KeyedObjectCollection <AxTableRelation> existingRelations) { if (!string.IsNullOrEmpty(field.ExtendedDataType)) { var edt = _axHelper.MetadataProvider.Edts.Read(field.ExtendedDataType); if (edt == null) { return(null); } AxTableRelationForeignKey axTableRelation = null; if (!string.IsNullOrEmpty(edt.ReferenceTable)) { AxEdtTableReference firstRef = edt.TableReferences.First(); if (firstRef == null) { return(null); } string newRelationName = edt.ReferenceTable; if (existingRelations.Contains(newRelationName)) { newRelationName = edt.ReferenceTable + "_" + field.Name; } axTableRelation = new AxTableRelationForeignKey(); axTableRelation.Name = newRelationName; axTableRelation.EDTRelation = NoYes.Yes; axTableRelation.Cardinality = Cardinality.ZeroMore; axTableRelation.OnDelete = DeleteAction.Restricted; axTableRelation.RelatedTable = edt.ReferenceTable; axTableRelation.RelatedTableCardinality = IsMandatory ? RelatedTableCardinality.ExactlyOne : RelatedTableCardinality.ZeroOne; axTableRelation.RelationshipType = RelationshipType.Association; foreach (AxEdtTableReference tableRefLine in edt.TableReferences) { var localLineRef = tableRefLine as AxEdtTableReferenceFilter; if (localLineRef != null) { AxTableRelationConstraintRelatedFixed axTableRelationConstraint = new AxTableRelationConstraintRelatedFixed(); axTableRelationConstraint.Name = localLineRef.RelatedField; axTableRelationConstraint.RelatedField = localLineRef.RelatedField; axTableRelationConstraint.Value = localLineRef.Value; axTableRelation.AddConstraint(axTableRelationConstraint); } else { AxTableRelationConstraintField axTableRelationConstraint = new AxTableRelationConstraintField(); axTableRelationConstraint.Name = field.Name; axTableRelationConstraint.Field = field.Name; axTableRelationConstraint.SourceEDT = field.ExtendedDataType; axTableRelationConstraint.RelatedField = tableRefLine.RelatedField; axTableRelation.AddConstraint(axTableRelationConstraint); } } } else { if (edt.Relations != null && edt.Relations.Count > 0) //old style relation { AxEdtRelation firstEdtRelation = edt.Relations.First(); string newRelationName = firstEdtRelation.Table; if (existingRelations.Contains(newRelationName)) { newRelationName = edt.ReferenceTable + "_" + field.Name; } axTableRelation = new AxTableRelationForeignKey(); axTableRelation.Name = newRelationName; axTableRelation.EDTRelation = NoYes.Yes; axTableRelation.Cardinality = Cardinality.ZeroMore; axTableRelation.OnDelete = DeleteAction.Restricted; axTableRelation.RelatedTable = firstEdtRelation.Table; axTableRelation.RelatedTableCardinality = IsMandatory ? RelatedTableCardinality.ExactlyOne : RelatedTableCardinality.ZeroOne; axTableRelation.RelationshipType = RelationshipType.Association; AxTableRelationConstraintField axTableRelationConstraint = new AxTableRelationConstraintField(); axTableRelationConstraint.Name = field.Name; axTableRelationConstraint.Field = field.Name; axTableRelationConstraint.SourceEDT = field.ExtendedDataType; axTableRelationConstraint.RelatedField = firstEdtRelation.RelatedField; axTableRelation.AddConstraint(axTableRelationConstraint); } } return(axTableRelation); } return(null); }