定制之前创建的记录的默认用户定义字段

时间:2019-01-08 22:04:40

标签: acumatica

我有一个DAC扩展,它为其设置了默认属性(请参见下面的定义)。我注意到,对于在DAC扩展之前存在的任何记录,仍然将保留空值。有没有一种常规的方法可以初始化所有记录?

如果没有,我很可能会在事件处理程序使用之前对其进行检查。 预先感谢!

    public abstract class usrCustOptInOut : IBqlField
    {
    }
    protected string _UsrCustOptInOut;
    [PXDBString(1, IsUnicode = true)]
    [PXDefault(OptInOut.Default, PersistingCheck = PXPersistingCheck.Nothing)]
    [PXUIField(DisplayName = "Click To Pay Opt In/Out")]
    [PXStringList(
        new[]
        {
            OptInOut.OptOut,
            OptInOut.OptIn,
            OptInOut.Default
        },
        new[]
        {
            "Customer Opt Out",
            "Customer Opt In",
            "Default"
        })]
    public virtual string UsrCustOptInOut
    {
        get
        {
            return _UsrCustOptInOut;
        }
        set
        {
            _UsrCustOptInOut = value;
        }
    }

1 个答案:

答案 0 :(得分:1)

您将需要手动运行更新。添加新字段和记录时,现有记录将不会自动更新。

我看到两个选择:

  1. 向您的项目(首选)
  2. 添加自定义插件
  3. 向您的项目添加自定义SQL脚本

选项1

您可以使用自定义插件来确保所有空值都具有默认值。自定义插件将在网站上每次发布的末尾运行。

您可以在定制项目中为此创建一个代码文件:

Creating a new customization plugin for a project

发布自定义项并重新启动网站后,将运行UpdateDatabase()中的CustomizationPlugin方法(将应用Usr字段)。

然后,您可以使用PXDatabase.Update来运行更新,而无需运行图形或任何验证/事件。您只需要批量SQL更新,然后PXDatabase.Update就可以完成工作。下面的示例仅在存在空值时设置默认值。相同的概念可以应用于添加的任何表/字段,而不仅仅是用户字段。例如,如果您有一个自定义表,则需要添加一个新字段,并且现有记录包含默认值。

PXDatabase是不利的一面(与选项2相比)。它将为当前租户(公司)运行Update,因为它将当前CompanyID附加到SQL语句中(这是一件好事)。如果您有多个租户(公司),则需要运行多个租户的发布。另外,您可以编写代码,以使其遍历每个公司并使用PXLoginScope运行语句(请参阅参考资料)。

使用自定义插件的最终结果如下:

public class UsrFieldDefaults : CustomizationPlugin
{
    //This method executed after customization was published and website was restarted.  
    public override void UpdateDatabase()
    {
        PXDatabase.Update<MyDac>(
            new PXDataFieldAssign<MyDacExt.usrCustOptInOut>(PXDbType.NChar, 1, OptInOut.Default),
            new PXDataFieldRestrict<MyDacExt.usrCustOptInOut>(PXDbType.NChar, 1, null, PXComp.ISNULL)
            );
    }
}

选项2 您可以编写一个自定义SQL脚本来执行相同的操作并将其放入自定义项目中。记住要发布到哪个DBMS(MSSQL / MYSQL)。还有一种使用共享SQL语法的方法,因此它应适用于任何DBMS。另外请注意,您很可能会为所有包含快照的租户(公司)运行脚本。

Adding a custom database script

其他参考:

Custom Processes During Publication of a Customization

To Add a Customization Plug-In to a Project

Save data to different company

To Publish a Customization for a Multitenant Site

Creating a Custom SQL Script

Writing Custom SQL Scripts for Interpretation