private void ContinueWithLinkRecords(List <UPCRMRecord> linkRecords) { this.OpenChildRecords = null; string parentLinkString = null; string sourceRecordIdentification = null; foreach (UPCRMRecord linkRecord in linkRecords) { UPCRMLink link = linkRecord.SingleLink; if (link == null) { continue; } UPCRMRecord childRecord = link.Record; if (childRecord.Mode == "ParentUpdate" || !string.IsNullOrEmpty(sourceRecordIdentification)) { if (this.OpenChildRecords == null) { this.OpenChildRecords = new List <UPCRMRecord> { childRecord }; } else { this.OpenChildRecords.Add(childRecord); } continue; } if (!childRecord.RecordIdentification.IsRecordIdentification()) { continue; } sourceRecordIdentification = childRecord.RecordIdentification; this.CurrentCheckedLinkRecord = linkRecord; parentLinkString = link.LinkId > 0 ? $"{linkRecord.InfoAreaId}:{link.LinkId}" : linkRecord.InfoAreaId; } if (string.IsNullOrEmpty(parentLinkString) || string.IsNullOrEmpty(sourceRecordIdentification)) { this.ContinueWithRecords(this.RecordsToSave); return; } this.LinkReader = new UPCRMLinkReader(sourceRecordIdentification, parentLinkString, UPRequestOption.FastestAvailable, this); if (!this.LinkReader.Start()) { this.ContinueWithRecords(this.RecordsToSave); } }
/// <summary> /// Returns changed child records list for given parent record /// </summary> /// <param name="parentRecord">Parent record</param> /// <param name="userChangesOnly">User changes only</param> /// <returns> /// <see cref="List{UPCRMRecord}" /> /// </returns> public override List <UPCRMRecord> ChangedChildRecordsForParentRecord(UPCRMRecord parentRecord, bool userChangesOnly) { List <UPCRMRecord> changedChildRecords = null; if (this.ChildEditContexts != null) { foreach (UPChildEditContext childEditContext in this.ChildEditContexts.Values) { List <UPCRMRecord> records = this.ChangedRecordsForContextNewRecordLinkUserChangesOnly(childEditContext, false, null, userChangesOnly); if (records?.Count > 0) { if (changedChildRecords != null) { changedChildRecords.AddRange(records); } else { changedChildRecords = new List <UPCRMRecord>(records); } } } if (this.AddedChildEditContexts != null) { UPCRMLink link = new UPCRMLink(parentRecord, -1); foreach (UPChildEditContext childEditContext in this.AddedChildEditContexts) { List <UPCRMRecord> records = this.ChangedRecordsForContextNewRecordLinkUserChangesOnly(childEditContext, true, link, userChangesOnly); if (records?.Count > 0) { if (changedChildRecords != null) { changedChildRecords.AddRange(records); } else { changedChildRecords = new List <UPCRMRecord>(records); } } } } } return(changedChildRecords?.Count > 0 ? changedChildRecords : null); }
/// <summary> /// Returns changed links for given info area id /// </summary> /// <param name="infoAreaId">Info Area Id</param> /// <param name="userChangesOnly">Handles user changes only if set to true</param> /// <returns><see cref="Dictionary{string, UPCRMLink}"/></returns> public override Dictionary <string, UPCRMLink> ChangedLinksForInfoAreaId(string infoAreaId, bool userChangesOnly) { if (this.isNew && !userChangesOnly) { UPCRMLinkParticipant participant = this.ParticipantsControl.FirstLinkParticipant(); if (!string.IsNullOrEmpty(participant?.LinkRecordIdentification)) { string val = participant.Options.ValueOrDefault("parentlink") as string; if (Convert.ToInt32(val) != 0) { UPCRMLinkInfo linkInfo = UPCRMDataStore.DefaultStore.LinkInfoForInfoAreaTargetInfoAreaLinkId(infoAreaId, participant.LinkRecordIdentification.InfoAreaId(), 0); if (linkInfo != null) { UPCRMLink link = new UPCRMLink(participant.LinkRecordIdentification); return(new Dictionary <string, UPCRMLink> { { linkInfo.Key, link } }); } } } } return(null); }
/// <summary> /// Creates the record. /// </summary> /// <param name="record">The record.</param> /// <param name="undo">if set to <c>true</c> [undo].</param> /// <returns>Record</returns> public DAL.Record CreateRecord(UPCRMRecord record, bool undo) { string infoAreaId = record.InfoAreaId; List <FieldIdType> fieldIds; List <string> linkFieldNames; bool checkDataModel = true; TableInfo tableInfo = this.DatabaseInstance.GetTableInfoByInfoArea(infoAreaId); if (tableInfo == null) { return(null); } int statNoField = 0, lnrField = 0; bool saveOfflineStationNumber = false; if (!undo && record.OfflineRecordNumber > 0 && record.OfflineStationNumber > 0) { statNoField = tableInfo.GetStatNoFieldId(); if (statNoField >= 0) { lnrField = tableInfo.GetLNrFieldId(); if (lnrField >= 0 && tableInfo.GetFieldInfo(statNoField) != null && tableInfo.GetFieldInfo(lnrField) != null) { saveOfflineStationNumber = true; } } } List <UPCRMFieldValue> fieldValues = record.FieldValues; int fieldCount = fieldValues?.Count ?? 0; int linkCount = record.Links?.Count ?? 0; if (undo) { linkCount = 0; } List <string> recordFieldValues = new List <string>(); if (fieldCount == 0) { fieldIds = null; } else { fieldIds = new List <FieldIdType>(); for (int i = 0; i < fieldCount; i++) { UPCRMFieldValue fieldValue = fieldValues[i]; FieldInfo fieldInfo = tableInfo.GetFieldInfo(fieldValue.FieldId); if (!checkDataModel || fieldInfo != null) { int currentFieldId = fieldValue.FieldId; fieldIds.Add((FieldIdType)currentFieldId); recordFieldValues.Add(undo ? fieldValue.OldValue : fieldValue.Value); if (saveOfflineStationNumber && (currentFieldId == statNoField || currentFieldId == lnrField)) { saveOfflineStationNumber = false; } } } if (saveOfflineStationNumber) { fieldIds.Add((FieldIdType)statNoField); recordFieldValues.Add(record.OfflineStationNumber.ToString()); fieldIds.Add((FieldIdType)lnrField); recordFieldValues.Add(record.OfflineRecordNumber.ToString()); } } if (record.Links != null && (record.Links.Count == 0 || undo)) { linkFieldNames = null; linkCount = 0; } else { linkFieldNames = new List <string>(); for (int i = 0; i < linkCount; i++) { UPCRMLink link = record.Links[i]; LinkInfo linkInfo = tableInfo.GetLink(link.LinkFieldName()) ?? tableInfo.GetLink(link.InfoAreaId, link.LinkId); if (linkInfo != null && linkInfo.HasColumn) { if (linkInfo.IsGeneric) { string targetInfoAreaId = this.RootPhysicalInfoAreaIdForInfoAreaId(link.InfoAreaId); recordFieldValues.Add(targetInfoAreaId); linkFieldNames.Add(linkInfo.InfoAreaColumnName); } recordFieldValues.Add(link.RecordId); linkFieldNames.Add(linkInfo.ColumnName); } } } var recordTemplate = new RecordTemplate( this.DatabaseInstance, false, infoAreaId, fieldIds?.Count ?? 0, fieldIds?.ToArray(), linkFieldNames.Count, linkFieldNames, false, false); Record rec = new Record(infoAreaId, record.RecordId); rec.SetTemplate(recordTemplate); for (var i = 0; i < recordFieldValues.Count; i++) { rec.SetValue(i, recordFieldValues[i]); } return(rec); }
/// <summary> /// Adds the changed links from record parent link. /// </summary> /// <param name="record"> /// The record. /// </param> /// <param name="parentLink"> /// The parent link. /// </param> public void AddChangedLinksFromRecordParentLink(UPCRMRecord record, UPCRMLink parentLink) { // TODO }
/// <summary> /// Applies the changes to serial entry. /// </summary> /// <param name="serialEntry">The serial entry.</param> /// <returns></returns> public UPOfflineSerialEntryApplyResult ApplyChangesToSerialEntry(/*UPSerialEntry*/ dynamic serialEntry) { UPOfflineSerialEntryApplyResult result = new UPOfflineSerialEntryApplyResult(); bool ok = true; bool rowCreated; List <UPCRMRecordWithHierarchy> recordArray = new List <UPCRMRecordWithHierarchy>(); foreach (UPCRMRecordWithHierarchy record in this.RecordStructure()) { if (record.InfoAreaId == serialEntry.DestInfoAreaId) { recordArray.Add(record); } if (record.InfoAreaId == serialEntry.Record.InfoAreaId) { foreach (UPCRMRecordWithHierarchy subRecord in record.Children) { if (subRecord.InfoAreaId == serialEntry.DestInfoAreaId) { recordArray.Add(subRecord); } } } } foreach (UPCRMRecordWithHierarchy record in recordArray) { /*UPSERow*/ dynamic row = serialEntry.ExistingRowForRecordIdentification(record.RecordIdentification); if (row == null) { UPCRMLink link = record.LinkWithInfoAreaIdLinkId(serialEntry.SourceInfoAreaId, -1); if (link == null) { continue; } row = serialEntry.CreateRowForSourceRecordIdentification(link.RecordIdentification); rowCreated = true; } else { rowCreated = false; } if (row != null) { bool recordsApplied = row.ApplyRecordHierarchy(record); if (!recordsApplied) { ok = false; } else if (rowCreated) { serialEntry.AddPosition(row); } } } if (!ok) { result.Error = new Exception("serial entry conflict handling was not implemented yet"); } return(result); }
/// <summary> /// Changeds the records for context new record link user changes only. /// </summary> /// <param name="childEditContext">The child edit context.</param> /// <param name="newRecord">if set to <c>true</c> [new record].</param> /// <param name="link">The link.</param> /// <param name="userChangesOnly">if set to <c>true</c> [user changes only].</param> /// <returns></returns> public List <UPCRMRecord> ChangedRecordsForContextNewRecordLinkUserChangesOnly(UPChildEditContext childEditContext, bool newRecord, UPCRMLink link, bool userChangesOnly) { if (childEditContext.DeleteRecord) { if (newRecord) { return(null); } UPCRMRecord record = new UPCRMRecord(childEditContext.RecordIdentification); record.Deleted = true; return(new List <UPCRMRecord> { record }); } Dictionary <string, UPEditFieldContext> changedFields = null; if (newRecord && !userChangesOnly) { if (this.combinedInitialValues != null) { foreach (string fieldIdentification in this.combinedInitialValues.Keys) { int fieldId = fieldIdentification.FieldIdFromStringWithInfoAreaId(this.ChildInfoAreaId); if (fieldId >= 0) { UPEditFieldContext initialValueEditField = new UPEditFieldContext(fieldId, this.combinedInitialValues[fieldIdentification] as string); if (changedFields == null) { changedFields = new Dictionary <string, UPEditFieldContext> { { initialValueEditField.Key, initialValueEditField } }; } else { changedFields.SetObjectForKey(initialValueEditField, initialValueEditField.Key); } } } } } foreach (UPEditFieldContext editFieldContext in childEditContext.EditFieldContext.Values) { if (editFieldContext.WasChanged(userChangesOnly)) { if (changedFields != null) { changedFields.SetObjectForKey(editFieldContext, editFieldContext.Key); } else { changedFields = new Dictionary <string, UPEditFieldContext> { { editFieldContext.Key, editFieldContext } }; } } } List <UPCRMRecord> additionalRecords = null; ICollection <UPCRMLink> changedLinks = (ICollection <UPCRMLink>)childEditContext.ChangedLinkArray ?? new List <UPCRMLink>(); if (changedFields?.Count > 0 || changedLinks?.Count > 0) { UPCRMRecord record; if (newRecord) { record = childEditContext.RecordIdentification.RecordId().Length > 6 ? new UPCRMRecord(childEditContext.RecordIdentification) : UPCRMRecord.CreateNew(childEditContext.RecordIdentification.InfoAreaId()); record.AddLink(link); UPConfigFilter createFilter = ConfigurationUnitStore.DefaultStore.FilterByName($"{record.InfoAreaId}.ChildCreateTemplate"); createFilter = createFilter.FilterByApplyingDefaultReplacements(); additionalRecords = record.ApplyValuesFromTemplateFilter(createFilter, false); } else { record = new UPCRMRecord(childEditContext.RecordIdentification); } foreach (UPEditFieldContext changedField in changedFields.Values) { if (newRecord) { record.NewValueFieldId(changedField.Value, changedField.FieldId); } else { record.NewValueFromValueFieldId(changedField.Value, changedField.OriginalValue, changedField.FieldId); } } foreach (UPCRMLink changedLink in changedLinks) { record.AddLink(changedLink); } if (additionalRecords?.Count > 0) { List <UPCRMRecord> arr = new List <UPCRMRecord> { record }; arr.AddRange(additionalRecords); return(arr); } return(new List <UPCRMRecord> { record }); } return(null); }