Beispiel #1
0
        protected object[] ChangeReference(PXGraph graph, DacReference reference, object childEntity, object newId)
        {
            PXCache cache                        = graph.Caches[reference.ReferenceField.DeclaringType];
            string  changingFieldName            = reference.ReferenceField.Name;
            Func <object, object[]> keysSelector = (item) => cache.Keys.Select(k => cache.GetValue(item, k)).ToArray();

            //for selectors
            cache.Current = childEntity;

            object oldValue = cache.GetValue(childEntity, changingFieldName);

            if (oldValue != null && oldValue.Equals(newId) ||
                oldValue == null && newId == null)
            {
                return(keysSelector(childEntity));
            }

            //setting ordinary value
            if (cache.Keys.All(k => k.ToLower() != changingFieldName.ToLower()))
            {
                cache.SetValueExt(childEntity, changingFieldName, newId);
                cache.SetStatus(childEntity, PXEntryStatus.Updated);
                return(keysSelector(childEntity));
            }

            //setting value that is part of PK key
            //if it is identity column, it would be changed after insert
            object newItem = cache.CreateCopy(childEntity);

            cache.SetValueExt(newItem, changingFieldName, newId);
            //resetting keys to persist new entity

            string[] identityKeys = cache.Keys.Where(k => cache.GetAttributesReadonly(newItem, k)
                                                     .OfType <PXDBIdentityAttribute>()
                                                     .Any()).ToArray();

            identityKeys.ForEach(k => cache.SetValueExt(newItem, k, null));
            cache.Update(newItem);
            cache.SetStatus(childEntity, PXEntryStatus.Deleted);

            EntityForIdentityInserting(graph, newItem);

            /*cache.PersistInserted(newItem);
             * cache.SetStatus(newItem, PXEntryStatus.Notchanged);*/

            return(keysSelector(newItem));
        }
Beispiel #2
0
        private void AddToFieldSetters(DacReference reference, MergerRelationPair merger)
        {
            if (_fieldSetters.ContainsKey(reference.TargetField))
            {
                _fieldSetters[reference.TargetField].Add(merger);
            }
            else
            {
                _fieldSetters.Add(reference.TargetField, new List <MergerRelationPair> {
                    merger
                });
            }

            if (_fieldSetters.ContainsKey(reference.ReferenceField))
            {
                _fieldSetters[reference.ReferenceField].Add(merger);
            }
            else
            {
                _fieldSetters.Add(reference.ReferenceField, new List <MergerRelationPair> {
                    merger
                });
            }
        }