我需要通过主要复制所选客户并修改与自定义流程相关的一些字段来创建新客户。 在自定义流程之外,作为初步尝试,看是否有可能复制客户,我有以下内容:
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记录。
这是否在复制客户的正确路径上,还是有更好的方法?还是在插入新客户时如何解决该异常?
答案 0 :(得分:0)
复制客户的问题不仅仅是复制一个对象。有许多对象需要为客户复制。
我复制了您的代码并执行了它。我注释掉CopyAccounts,因为我认为它将在克隆的对象上调用,而不是在现有客户上调用。
我收到的下一个错误是错误:在字段“默认位置”值8068的处理期间发生错误:错误:在系统中找不到默认位置“ 8068”。
这是由于从客户记录中克隆了其他外键字段。 DefLocationID是客户的默认位置。它也尝试设置这些键,并且由于选择器的限制而无法设置,因此要求该位置与记录的BAccountID相同。 DefAddressID,DefContactID和其他关键字段的作用方式相同。
因此,要完成此操作,您需要检查可能设置的Customer / BAccount上的所有外键,然后复制这些对象并将它们也设置为正确的DAC。某些信息可能不需要复制,因此我只需将那些关键字段为空并复制所需的内容即可。
答案 1 :(得分:0)
嘿,尼克劳斯·霍克(Kickicsonson)指出,由于所有PK / FK约束,您不能只复制数据,而必须单独进行所有操作。
另一种方法是为父级提取数据。