首页 > 解决方案 > 如何更新我的 acumatica 数据库中的单行

问题描述

你好,我是新人,我正在 Acumatica 上创建一个自定义项目,所以我添加了一个新字段

public class UsersExt : PXCacheExtension<PX.SM.Users>
    {
        #region UsrMomentTrackID
        [PXDBString]
        [PXUIField(DisplayName = "Moment Track ID")]

        public virtual string UsrMomentTrackID { get; set; }
        public abstract class usrMomentTrackID : PX.Data.BQL.BqlString.Field<usrMomentTrackID> { }
        #endregion

我想更新用户数据库上所有字段的循环这是我当前的代码,但它返回我一个错误,它太长

  PXUpdate<Set<UsersExt.usrMomentTrackID, Add<UsersExt.usrMomentTrackID, Current<UsersExt.usrMomentTrackID>>>, Users,
                    Where<Users.pKID, Like<Users.pKID>>>.Update(Base, MomentTrackID, useritems.PKID);

您能否指导我做错了什么,或者我们是否有更有效的方法来更新 Acumatica 数据库上的字段?

标签: c#acumatica

解决方案


您可以使用PXSelect方法来获取记录。

使用该PXCache对象,您可以更新和保留记录。

// 1. Select Users record
Guid? pKID = useritems.PKID;
Users user = PXSelect<Users, Where<Users.pKID, Equal<Required<Users.pKID>>>>.Select(Base, pKID);

if (user != null)
{
    // 2. Select Users DAC extension
    UsersExt userExt = user.GetExtension(user);

    if (userExt != null)
    {
        // 3. Set field value
        userExt.UsrMomentTrackID = MomentTrackID;

        // 4. Update record
        PXCache cache = Base.Caches[typeof(Users)];
        cache.Update(user);

        // 5. Persist record
        cache.Persist(user, PXDBOperation.Update);
    }
}

在两种情况下您不能使用该方法。这些是RowPersisted事件或Persist方法覆盖。如果您要使用正常方法将记录保留在这些事件中,它将再次调用相同的事件,从而产生无限循环。

要解决这些问题,您可以使用PXDatabase该类直接保存到数据库。请注意,这种持久化方法不会运行 DAC 和 Graph 验证,因此应尽可能避免使用该方法,使用该方法不是最佳实践,但有时会有所帮助。

PXDatabase.Update<Users>(new PXDataFieldAssign<UsersExt.usrMomentTrackID>(MomentTrackID),
                         new PXDataFieldRestrict<Users.pKID>(useritems.PKID));

一般来说,最佳实践是在屏幕上添加自定义字段,必要时初始化它的值,然后让最终用户通过按下保存按钮来保持更改。


推荐阅读