我有一个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;
}
}
答案 0 :(得分:1)
您将需要手动运行更新。添加新字段和记录时,现有记录将不会自动更新。
我看到两个选择:
选项1
您可以使用自定义插件来确保所有空值都具有默认值。自定义插件将在网站上每次发布的末尾运行。
您可以在定制项目中为此创建一个代码文件:
发布自定义项并重新启动网站后,将运行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。另外请注意,您很可能会为所有包含快照的租户(公司)运行脚本。
其他参考:
Custom Processes During Publication of a Customization
To Add a Customization Plug-In to a Project
Save data to different company