使用设置表和单一实例设计模式
设置表是 Microsoft Dynamics 365 Business Central 中应用程序区域的核心表之一。 设置表提供用于定义应用程序特定区域中业务逻辑行为的设置。 业务逻辑经常取决于各种配置设置。 每当代码决定如何处理特定情况时,都必须检查设置表中的相应设置。
例如,当用户过帐发票时,可能会做出仅允许在特定期间进行过帐的业务决策。 您应将允许过帐开始日期和允许过帐结束日期添加到设置表,而不是对代码中的开始日期和结束日期进行硬编码。 然后,可以更改代码逻辑,以检查发票的过帐日期是否介于表中指定的日期之间。 本逻辑简化了用户更改允许过帐期间的过程。 总帐设置表正是使用本逻辑来控制影响总帐应用程序区域的任何类型单据的过帐行为。
设置表至少要包含用于配置编号系列的字段,以控制将编号分配给应用程序区域的主记录、单据和已过帐单据的过程。 主记录和单据类型越多,设置表包含的字段就越多。 应用程序区域只能有一条设置记录。 因此,本表具有一个名为主键的主键字段。
设置表始终只有一个“卡”类型的页面,用于显示表中的信息。 必须使用设置卡确保表中仅存在一条记录。 因此,在本页面中,始终会将 InsertAllowed 和 DeleteAllowed 属性设置为 false。 当用户打开页面且设置表中不存在任何记录时,通常会在本页面中插入设置记录。
单一实例设计模式
要制作自己的设置表,请使用单一实例设计模式。 可以将设计模式与有助于分步开发常见问题解决方案的方法进行比较。 还可以在 C# 和 Java 等其他编程语言中寻找设计模式。 在 C# 等面向对象的语言中,可以使用单一实例设计模式来创建整个应用程序中使用的对象的单个实例。
设置表仅包含一条记录并在不同会话中使用本记录。 因此,可以说能将设置表与单个实例进行比较。
在应用程序语言 (AL) 中,单一实例设计模式涉及三个步骤:
创建表并定义主键。 主键具有以下特征:
名为主键,类型为“代码”,长度为 10。
插入记录时填充空值。
未添加到页面。
不可修改,即用户无法修改主键的值。
创建(卡)页面。
将 InsertAllowed 和 DeleteAllowed 属性设置为 false。 本设置会阻止用户添加/删除记录。
在 OnOpenPage 触发器上,需要检查表中是否已存在记录。 如果没有,则需要插入记录。 本步骤可确保表中始终存在一条记录。
订阅 Company-Initialize codeunit 的 OnCompanyInitialize 发布程序。 (可选)
在 Company-Initialize codeunit 的 OnRun 触发器中,检查所有现有设置表以确定是否已存在记录。 如果没有,则创建记录。 由于无法修改本 codeunit,因此需要订阅 OnCompanyInitialize 发布程序函数来自行创建设置表初始化。
每当在 Business Central 中创建新公司时,都会运行本 codeunit。
请考虑以下代码示例。 第一个示例是设置表的表定义,其中可以看到主键字段和一些用于设置在不同主表和单据表中使用的编号系列的其他字段。
table 311 Sales & Receivables Setup
{
Caption = 'Sales & Receivables Setup';
DrillDownPageID = "Sales & Receivables Setup";
LookupPageID = "Sales & Receivables Setup";
fields
{
field(1; "Primary Key"; Code[10])
{
}
...
field(9; "Customer Nos."; Code[20])
{
TableRelation = "No. Series";
}
field(10; "Quote Nos."; Code[20])
{
TableRelation = "No. Series";
}
field(11; "Order Nos."; Code[20])
{
TableRelation = "No. Series";
}
field(12; "Invoice Nos."; Code[20])
{
TableRelation = "No. Series";
}
...
}
keys
{
key(Key1; "Primary Key")
{
Clustered = true;
}
}
}
销售和应收帐款设置页面为卡页面,其中将 InsertAllowed 和 DeleteAllowed 属性设置为 false。 主键字段在页面上不可用;因此,用户无法修改本字段。 如果表中已有记录,则 OnOpenPage 触发器会包含复选标记。 如果没有,则 Insert 函数将在表中创建具有空白主键的新记录。
page 459 Sales & Receivables Setup
{
Caption = 'Sales & Receivables Setup';
DeleteAllowed = false;
InsertAllowed = false;
PageType = Card;
SourceTable = "Sales & Receivables Setup";
layout
{
area(content)
{
group(General)
{
field("Discount Posting"; "Discount Posting")
{
}
field("Credit Warnings"; "Credit Warnings")
{
}
...
}
group("Number Series")
{
field("Customer Nos."; "Customer Nos.")
{
}
field("Quote Nos."; "Quote Nos.")
{
}
field("Blanket Order Nos."; "Blanket Order Nos.")
{
}
field("Order Nos."; "Order Nos.")
{
}
field("Return Order Nos."; "Return Order Nos.")
{
}
field("Invoice Nos."; "Invoice Nos.")
{
}
...
}
}
}
trigger OnOpenPage()
begin
Reset();
if not Get() then begin
Init();
Insert();
end;
end;
}
在单一实例设计模式中定义了这些不同步骤。 请按照这些步骤创建自己的设置表,使扩展的行为类似于默认应用程序对象,并为用户打造统一的体验。