Вставить ЦАП для просмотра кэша в поле обновлено - PullRequest
0 голосов
/ 29 сентября 2019

Я пытаюсь вставить запись истории «ProspectiveAccountLocationHistory» в поле зрения, когда настраиваемое поле «Местоположение бизнес-аккаунта» изменяется в основных средствах.Таким образом, каждый раз, когда пользователь вносит изменения в это поле, добавляется новая запись.Я пытаюсь сделать так же, как история местоположений в основных средствах.Итак, мой новый ЦАП в основном похож на ЦАП «FALocationHistory».

Итак, для этого я добавил имя таблицы базы данных «ProspectiveAccountLocationHistory».У меня есть составной ключ CompanyID, AssetID и RevisionID в таблице.enter image description here

И сгенерировал ЦАП на основе этой таблицы базы данных.

using System;
using PX.Data;
using PX.Objects.FA;
using PX.Objects.CR;

namespace ProspectBusinessAccountInFixedAsset
{
    [Serializable]
    public class ProspectiveAccountLocationHistory : IBqlTable
    {
        #region AssetID
        [PXDBInt(IsKey = true)]
        [PXUIField(Visible=false, Visibility =PXUIVisibility.Invisible)]
        [PXParent(typeof(Select<FixedAsset, Where<FixedAsset.assetID, Equal<Current<ProspectiveAccountLocationHistory.assetID>>>>))]
        [PXDBLiteDefault(typeof(FixedAsset.assetID))]
        public virtual int? AssetID { get; set; }
        public abstract class assetID : PX.Data.BQL.BqlInt.Field<assetID> { }
        #endregion

        #region RevisionID
        [PXDBInt(IsKey = true)]
        [PXDefault(0)]
        public virtual int? RevisionID { get; set; }
        public abstract class revisionID : PX.Data.BQL.BqlInt.Field<revisionID> { }
        #endregion

        #region AccountID
        [PXDBInt()]
        [PXUIField(DisplayName = "Account")]
        [PXDefault(typeof(Search<BAccount.bAccountID, Where<BAccount.bAccountID,Equal<Current<ProspectiveAccountLocationHistory.accountID>>>>))]
        [PXSelector(typeof(BAccount.bAccountID), DescriptionField =typeof(BAccount.acctName))]
        public virtual int? AccountID { get; set; }
        public abstract class accountID : PX.Data.BQL.BqlInt.Field<accountID> { }
        #endregion

        #region LocationID
        [PXDBInt()]
        [PXUIField(DisplayName = "Location")]
        [PXDefault(typeof(Search<Location.locationID, Where<Location.locationID, Equal<Current<ProspectiveAccountLocationHistory.locationID>>>>))]
        [PXSelector(typeof(Location.locationID), DescriptionField = typeof(Location.locationCD))]
        public virtual int? LocationID { get; set; }
        public abstract class locationID : PX.Data.BQL.BqlInt.Field<locationID> { }
        #endregion

        #region Tstamps
        [PXDBTimestamp()]
        [PXUIField(DisplayName = "Tstamps")]
        public virtual byte[] Tstamp { get; set; }
        public abstract class tstamp : PX.Data.BQL.BqlByteArray.Field<tstamp> { }
        #endregion

        #region CreatedByID
        [PXDBCreatedByID()]
        public virtual Guid? CreatedByID { get; set; }
        public abstract class createdByID : PX.Data.BQL.BqlGuid.Field<createdByID> { }
        #endregion

        #region CreatedByScreenID
        [PXDBCreatedByScreenID()]
        public virtual string CreatedByScreenID { get; set; }
        public abstract class createdByScreenID : PX.Data.BQL.BqlString.Field<createdByScreenID> { }
        #endregion

        #region CreatedDateTime
        [PXDBCreatedDateTime()]
        [PXUIField(DisplayName = "Created Date Time")]
        public virtual DateTime? CreatedDateTime { get; set; }
        public abstract class createdDateTime : PX.Data.BQL.BqlDateTime.Field<createdDateTime> { }
        #endregion

        #region LastModifiedByID
        [PXDBLastModifiedByID()]
        public virtual Guid? LastModifiedByID { get; set; }
        public abstract class lastModifiedByID : PX.Data.BQL.BqlGuid.Field<lastModifiedByID> { }
        #endregion

        #region LastModifiedByScreenID
        [PXDBLastModifiedByScreenID()]
        public virtual string LastModifiedByScreenID { get; set; }
        public abstract class lastModifiedByScreenID : PX.Data.BQL.BqlString.Field<lastModifiedByScreenID> { }
        #endregion

        #region LastModifiedDateTime
        [PXDBLastModifiedDateTime()]
        [PXUIField(DisplayName = "Last Modified Date Time")]
        public virtual DateTime? LastModifiedDateTime { get; set; }
        public abstract class lastModifiedDateTime : PX.Data.BQL.BqlDateTime.Field<lastModifiedDateTime> { }
        #endregion
    }
}

Затем я создал расширение графика для AssetMaint со следующим представлением вначале.

public PXSelect<ProspectiveAccountLocationHistory, Where<ProspectiveAccountLocationHistory.assetID, Equal<Current<FixedAsset.assetID>>>> ProspectiveAccountLocationHistories;

И добавил вкладку с сеткой, в которой есть DataMember ProspectiveAccountLocationHistories.

enter image description here

Сначала я попытался переопределить постоянный метод, поэтому написалкод ниже.

[PXOverride]
public void Persist(Action del)
{
    using (var scope = new PXTransactionScope())
    {
        var row = Base.LocationHistory.Current;
        FALocationHistory assetLocation = Base.AssetLocation.Current;
        var assetLocationExt = row.GetExtension<FALocationHistoryExt>();
        var item = new ProspectiveAccountLocationHistory()
        {
            AssetID = Base.Asset.Current.AssetID,
            AccountID = assetLocationExt.UsrLHBusinessAccount,
            LocationID = assetLocationExt.UsrLHBusinessAccountLocation,
            RevisionID = 1
        };
        ProspectiveAccountLocationHistories.Cache.Insert(item);
        ProspectiveAccountLocationHistories.Cache.Persist(PXDBOperation.Insert);
        ProspectiveAccountLocationHistories.Cache.Clear();
        scope.Complete();
    }
    del();
}

Но я продолжаю получать ошибки во время выполнения, поэтому подумал, что, возможно, я пытаюсь сохранить запись в View Cache при обновлении настраиваемого поля.И, в конце концов, он будет сохранен в базе данных позже, когда Save все равно будет выполнен.Итак, я добавил событие ниже в расширении графика.

protected void FALocationHistory_UsrLHBusinessAccountLocation_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e)
        {
            try
            {
                var row = (FALocationHistory)e.Row;
                FALocationHistory assetLocation = Base.AssetLocation.Current;
                var assetLocationExt = row.GetExtension<FALocationHistoryExt>();
                var item = new ProspectiveAccountLocationHistory()
                {
                    AccountID = assetLocationExt.UsrLHBusinessAccount,
                    LocationID = assetLocationExt.UsrLHBusinessAccountLocation,
                    RevisionID = 1
                };
                var t = (ProspectiveAccountLocationHistory)cache.Graph.Caches[typeof(ProspectiveAccountLocationHistory)].Insert(item);
            }
            catch (Exception ex)
            {
                PXTrace.WriteError(ex.Message);
            }

        }

Но и в этом случае я получаю ту же ошибку времени выполнения, что и ниже.

enter image description here

Я также проверил исходный код на наличие других графиков, и казалось, что можно обновить кэш в событии «Обновление поля».Но это не работает.Представление также так просто, как могло бы быть.Мне трудно найти то, что мне здесь не хватает.

...