Как изменить значение ключа идентификатора записи в коде настройки - PullRequest
0 голосов
/ 06 февраля 2019

Мне нужно иметь возможность изменить идентификатор проекта (Contract.ContractCD в БД) в настройке Acumatica с помощью кода и без отображения диалогового окна пользователя.Это должно быть просто, но это не так.Исходя из того, что я понял, я думаю, что мне нужно создать действие PXChangeID, подобное существующему в графе ProjectEntry, которое открывает диалог, но без диалога.В собственном коде Acumatica есть несколько вариантов использования PXChangeID, но я ничего не могу найти без всплывающего диалогового окна.Если у кого-нибудь есть рабочий пример, я бы хотел его увидеть.

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

Обновление - попытался использовать PXDatabase.Update (), как предложено в ответе, но получил ошибку времени выполнения, что PMProject не является допустимым именем объекта.

PXDatabase.Update<PMProject>(
    new PXDataFieldAssign<PMProject.contractCD>(project.ContractCD),
    new PXDataFieldRestrict<PMProjectExtension.usrSharedProjectID>(projectExt.UsrSharedProjectID)
);

1 Ответ

0 голосов
/ 07 февраля 2019

В зависимости от того, как вы хотите обновить поле CD, я бы просто использовал PXDatabase.Update.Вызов PXDatabase.Update обновит таблицу, как только она будет вызвана, а не когда график сохранится.Вам нужно будет обновить представление, отображающее проект после выполнения вызова.

Вот рабочий пример, который можно использовать для любой таблицы ID / CD:

public static void ChangeCDValue<Dac, IDField, CDField>(int? id, string newCD)
    where Dac : IBqlTable
    where IDField : IBqlField
    where CDField : IBqlField
{
    if (id == null)
    {
        throw new ArgumentNullException(nameof(id));
    }

    if (string.IsNullOrWhiteSpace(newCD))
    {
        throw new ArgumentNullException(nameof(newCD));
    }

    PXDatabase.Update<Dac>(
        new PXDataFieldAssign<CDField>(newCD),
        new PXDataFieldRestrict<IDField>(PXDbType.Int, id));
}

Для обновления проектаCD вы можете использовать контрактный ЦАП следующим образом:

ChangeCDValue<PX.Objects.CT.Contract, PX.Objects.CT.Contract.contractID, PX.Objects.CT.Contract.contractCD>(3354, "TESTCHANGE");

Аналогичный призыв изменить значение инвентарного CD:

ChangeCDValue<PX.Objects.IN.InventoryItem, PX.Objects.IN.InventoryItem.inventoryID, PX.Objects.IN.InventoryItem.inventoryCD>(10, "NEWCD");

В качестве @ HB_Acumatica , упомянутого в комментарияхна ваш вопрос вы можете создать собственную версию класса ChangeProjectID, удалив код диалога.Если у вас возникли проблемы с поиском класса по имени, он находится в следующем файле на вашем сайте Acumatica: App_Data \ CodeRepository \ PX.Objects \ PM \ ProjectEntry.cs

Использование кода из ChangeProjectID позволит вамобновите значение в кэше и подождите, пока изменения не будут сохранены.Визуально он должен показывать изменения без необходимости также делать свое собственное обновление.

...