Создать новую копию существующего Клиента - PullRequest
0 голосов
/ 07 ноября 2019

Мне нужно создать новых клиентов, в основном скопировав выбранного клиента и изменив несколько полей, относящихся к пользовательскому процессу. За пределами пользовательского Процесса в качестве первоначальной попытки проверить, возможно ли вообще скопировать Клиента, у меня есть следующее:

public class CustomerMaint_Extension : PXGraphExtension<CustomerMaint>
{
    public PXAction<Customer> copyTest;
    [PXProcessButton]
    [PXUIField(DisplayName = "Copy Test")]
    protected virtual void CopyTest()
    {
        var customer = Base.BAccount.Current;
        var graph = PXGraph.CreateInstance<CustomerMaint>();
        var cache = graph.BAccount.Cache;

        // Set field Defaults using CustomerMaint.CopyAccounts method
        graph.CopyAccounts(cache, customer);

        // Create new copy of current Customer
        var copyCustomer = (Customer)cache.CreateCopy(customer);

        // Modify key values
        copyCustomer.AcctCD = "COPY " + customer.AcctCD;
        copyCustomer.BAccountID = null;

        // Prevent "Customer Class Changed -- update Defaults?" dialog
        cache.SetStatus(copyCustomer, PXEntryStatus.Inserted);

        // Insert into cache
        // *** Exception occurs here ***
        copyCustomer = (Customer)cache.Insert(copyCustomer);

        // Modify additional fields as necessary by custom process
        // ...

        // Persist to database
        graph.Save.Press();
    }
}

Проблема, с которой я в настоящее время сталкиваюсь, с этим кодом в том виде, как он есть в настоящее время, заключается вв cache.Insert(copyCustomer) выдается исключение:

Error: An error occurred during processing of the field CustomerClassID: Value cannot be null.
Parameter name: key

Я отследил это, чтобы исходить из функции CustomerClassDefaultInserting графика CustomerMaint в точке SalesPerson.Insert(sperson). Похоже, эта функция пытается создать запись CustSalesPeople для продавца по умолчанию назначенного класса клиента.

Это даже правильный путь для копирования клиента или есть лучший способ? Или как устранить исключение при вставке нового клиента?

Ответы [ 2 ]

0 голосов
/ 11 ноября 2019

Привет, Николя Хук. Как указывал KRichardson, из-за всех ограничений PK / FK вы не можете просто копировать данные, вам придется делать все индивидуально.

другой подход заключается в извлечении данных для родителя.

0 голосов
/ 08 ноября 2019

Проблема с копированием клиента заключается не только в копировании одного объекта. Есть много объектов, которые нужно скопировать для клиента.

Я скопировал ваш код и выполнил его. Я закомментировал CopyAccounts, поскольку думаю, что он будет вызываться для клонированного объекта, а не для существующего клиента.

Следующая ошибка, которую я получил, была Ошибка: Ошибка произошла во время обработки поля Значение местоположения по умолчанию 8068 Ошибка: Местоположение по умолчанию '8068' не может быть найдено в системе.

Это произошло из-заклонирование других полей внешнего ключа из записи клиента. DefLocationID является местоположением по умолчанию для клиента. Он также пытается установить эти ключи и не может из-за ограничения, наложенного на селектор, требующий, чтобы местоположение было таким же BAccountID, что и запись. DefAddressID, DefContactID и другие ключевые поля будут действовать одинаково.

Таким образом, чтобы завершить это, вам необходимо просмотреть все внешние ключи на Customer / BAccount, которые могут быть установлены, а затем скопировать эти объекты и установитьих к соответствующим ЦАПам. Некоторую информацию, возможно, не нужно копировать, поэтому я просто обнуляю эти ключевые поля и копирую то, что требуется.

...