使用“已阻止”字段和“已阻止实体设计模式”

已完成

主记录用于交易,这意味着用户使用应用程序一段时间后,许多交易记录将与主记录关联。 许多主记录会在特定时间过时。 例如,一位客户可能不再是客户,您可能会停止从某位供应商采购商品,或者某个物料可能已中断供应。 在这些情况下,您通常不想删除主记录,而是阻止它们,以便它们仍然可用于分析或比较目的。 但是,您不能再在交易中使用它们。 控制本功能的字段称为已阻止(布尔类型),并且它存在于所有主表中。

有时,已阻止字段是一个选项类型字段,支持多种类型的阻止,允许在一组交易记录中使用该主记录,但阻止在其他交易记录类型中使用它。 例如,客户供应商表中的已阻止字段类型为选项。

并非每个包含已阻止字段的表都是主表。 但是,使用本字段的大多数表都将以一种相似的方式使用它。 您不应直接在主表中写入处理已阻止字段的逻辑。 但是,您应确保在引用或使用主表的任何表的代码中检查已阻止字段。 例如,您应在销售行编号字段的 OnValidate 触发器中检查某个物料是否已阻止,以确保用户无法在销售交易中使用已阻止的物料。

已阻止实体设计模式

已阻止实体设计模式介绍了已阻止字段的用法。 当需要临时或永久停止特定实体(主要是主数据)的交易时,可以使用本模式。

要实现已阻止实体设计模式,可以为实体表中的每个交易创建一个已阻止字段和一个函数。 本函数将检查已阻止字段的状态,并在您无法使用本特定实体时抛错。 该函数是从相关交易调用的。

以下实体关系图显示在实体表中定义 IsBlocked 函数的位置。 本函数将在交易中调用(在 DoTransaction 函数中)。

实体关系图已阻止实体模式

下一个代码片段显示如何使用具有选项数据类型的已阻止字段。 Customer 具有 CheckBlockedCustOnDocsCheckBlockedCustOnJnls 两个函数,在单据和日记帐的交易处理期间调用。

table 18 Customer
{
    fields
    {
field(1; "No."; Code[20])
        {
        }
        field(2; Name; Text[100])
        {
        }
        ...
        field(39; Blocked; Option)
        {
            OptionMembers = " ",Ship,Invoice,All;
        }
        ...
    }

    procedure CheckBlockedCustOnDocs(...)

    procedure CheckBlockedCustOnJnls(...)
}