как обновить одну строку в моей базе данных acumatica - PullRequest
0 голосов
/ 19 марта 2020

Здравствуйте, я новичок, и я создаю проект настройки на моем постоянном компьютере 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

Я хочу обновить l oop для всех полей в базе данных пользователей. Вот мой текущий код, но он возвращает мне ошибку, которая слишком длинная

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

Можете ли вы указать мне, что я делаю неправильно, или у нас есть более эффективный способ обновления поля в базе данных Acumatica

1 Ответ

1 голос
/ 19 марта 2020

Вы можете использовать метод 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. Если бы вы использовали обычный метод для сохранения записи в тех событиях, он вызвал бы те же самые события снова, производя бесконечное l oop.

Чтобы обойти эти проблемы, вы можете использовать класс PXDatabase для сохранения непосредственно в базу данных. Обратите внимание, что этот постоянный метод не запускает проверки DA C и Graph, поэтому его следует избегать, насколько это возможно, поэтому не рекомендуется использовать этот метод, но иногда он может быть полезен.

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

Как правило, рекомендуется добавить настраиваемое поле на экран, инициализировать его значение, если необходимо, и позволить конечному пользователю сохранить изменения, нажав кнопку сохранения.

...