Я пытаюсь вставить запись истории «ProspectiveAccountLocationHistory» в поле зрения, когда настраиваемое поле «Местоположение бизнес-аккаунта» изменяется в основных средствах.Таким образом, каждый раз, когда пользователь вносит изменения в это поле, добавляется новая запись.Я пытаюсь сделать так же, как история местоположений в основных средствах.Итак, мой новый ЦАП в основном похож на ЦАП «FALocationHistory».
Итак, для этого я добавил имя таблицы базы данных «ProspectiveAccountLocationHistory».У меня есть составной ключ CompanyID, AssetID и RevisionID в таблице.
И сгенерировал ЦАП на основе этой таблицы базы данных.
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.
Сначала я попытался переопределить постоянный метод, поэтому написалкод ниже.
[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);
}
}
Но и в этом случае я получаю ту же ошибку времени выполнения, что и ниже.
Я также проверил исходный код на наличие других графиков, и казалось, что можно обновить кэш в событии «Обновление поля».Но это не работает.Представление также так просто, как могло бы быть.Мне трудно найти то, что мне здесь не хватает.