本章介绍了Compiere的模型驱动架构和Compiere的数据字典功能。
在大多数应用程序中,开发人员必须设计代码并测试每个屏幕。这可能是非常耗时的,并导致整个应用程序在外观和感觉以及功能方面的不一致。 这也会使用户难以学习像ERP这样复杂的应用程序的新领域。 Compiere通过使用一个更先进的中心激活数据字典的概念,简化了任务。 窗口是在运行时从数据字典中生成的。 开发人员只需定义窗口如何显示和在什么条件下显示的规则。这导致窗口只显示用户在特定情况下需要看到的数据。 例如,如果一个销售订单涉及到客户将商品带走并支付给你,那么就没有必要显示发货规则、发票规则或付款期限等字段。 但是,如果销售订单涉及到你将商品运送给客户,并在稍后时间向他们发送付款账单,那么这些字段是必要的。除了提供一致的外观和感觉外,它还能使数据和字段根据用户的安全性来显示。 在其他应用中,这需要定义多个窗口。
Compiere的应用字典是应用程序的一个组成部分。它 "知道 "如何访问数据以及数据是如何关联的。应用字典包含了一个数据实体的定义(类型、验证等),如何显示(屏幕报告上的标签、帮助、相对于其他字段的显示顺序位置),以及显示规则。安全和访问规则也在这里维护。
运行时的数据是对环境敏感的。例如:它 "知道 "一个柜台销售没有付款期限,所以它不显示付款期限。它还知道,即使库存记录显示为零,也必须有可用的库存(因为,例如,一个材料收据还没有被处理)。然而,如果用户将交易类型改为标准订单,付款条件就会成为交易的一个强制性部分,交易就会识别 "缺货 "的情况。 此外,用户界面以及业务伙伴文件的翻译是在数据字典中完成的。
应用字典是用户可扩展的,可以包括用户指定的规则和信息。这使授权用户能够添加新的表格和新的屏幕,并为现有的屏幕添加额外的字段。所有添加的项目都能自动列出,并使用整个应用程序的标准报告功能进行报告。
应用字典由六个主要实体组成:
元素为所有字段提供了一个中心引用。 在 Compiere 中为任何表定义的任何字段都有一个相应的元素。 这为字段提供了一致的标签,在报告中的显示,以及帮助文本。这也意味着一个元素只需要定义一次,即使它可能在数百个表和多个窗口中使用(例如,组织Organization)。 元素的数据(名称Name、打印文本Print Text、描述Description和注释Comment)会自动与表和窗口的相应字段同步。

元素是在元素窗口中定义的。这个窗口可以在以系统管理员的角色登录时访问。
每个元素必须有一个数据库列名(DB Column Name)。 这是在将一个元素连接到一个表中的特定字段时使用的参考。 一个名称和打印文本也是必需的。 名称是在任何窗口、表格或参数表格中使用的标签,该元素被引用。 打印文本是将在报告中打印的列标题。在某些情况下,你可能需要一个较短的打印名称,以使报告布局最大化。 例如,元素ISVendor是一个1位布尔值。 对于报告标题,你可能想打印 "Vend"。
说明(Description)和 评论(Comment)字段不是必须的。 在大多数情况下,你会希望为这些字段提供数值。 说明字段是当你把光标悬停在一个字段上时显示在 "气泡帮助 "中的文字。 注释字段将显示为该字段的在线帮助(F1)。
激活(Active)复选框表示这个元素是激活的,在定义表的列时可以被引用。
对于你添加的任何记录,实体类型将默认为用户定义的。你可以把它改成你定义的另一个实体类型。 如果你想在迁移时保留你的添加内容,你不应该使用Compiere或Dictionary。
元素窗口还包含一个 "在列中使用 (Used in Column)"标签。 这显示了这个元素被引用的所有列。 如果你正在考虑改变一个现有的元素,这可能是有帮助的,因为它将表明你的改变会影响到哪些其他实体。
表是Windows所建立的实体。 你可以通过用户界面在Compiere Application Dictionary中直接定义一个表及其相关列,并使用这个定义在底层数据库中创建相应的数据库表或数据库视图。 或者,你可以先在数据库中创建一个数据库表或数据库视图,然后将其定义导入Compiere Application Dictionary中。
在以系统管理员角色登录的情况下,可以通过打开表和列(Table and Column)窗口来创建新表。

输入一个数据库表名(DB Table Name)。 如果你想导入数据库中已经创建的数据库表或数据库视图的定义,请确保这里提供的名称是相同的。
如果底层数据库对象是一个视图,请选中视图(View)复选框。
你还必须输入一个数据访问级别(Data Access Level,用于自动角色)和一个交易类型(Transaction Type)。交易类型将表明当记录被保存到该表时,是否需要一个明确的组织值(除*外)。
其他字段是可选的。 其中一些对数据字典的功能有直接影响。
窗口(Window)和PO窗口(PO Window)字段表明哪个窗口将成为 "缩放目标(Zoom Target)"。
如果选择了高容量(High Volume)复选框,将使引用此表的窗口最初显示一个查询窗口。如果不选择该复选框,将返回所有活动记录。
要从数据库中导入一个已经创建的数据库表或数据库视图,请选择 "从数据库中创建列(Create Columns from Database) "按钮或 "从数据库中导入此视图 (Import this view from DB)"按钮。为了验证视图定义是否被正确导入,选择 "在数据库中创建此视图(Create this view in DB) "按钮,使用导入的视图定义在数据库中重新创建该视图。
列(Columns)将在引用该表的窗口中显示为字段。列既可以在数据字典中输入,然后与数据库同步,也可以从数据库中已经填充的表中创建。 一般来说,新的表和它们各自的列是通过一个工具(如SQL Loader)在数据库中填充的,但如果你有一两个新的列要添加,在Compiere中创建它们然后与数据库同步可能更容易。

在列中选择的值和输入的数据将决定这些字段在窗口中的显示方式和时间。 在窗口定义中还可以做进一步的细化,这将在下一节介绍。
数据库列的名称(DB Columns Name)是必需的(我们建议使用与元素相同的名称)。
选择与该列相对应的元素(Element)。 如果你从数据库中创建了列,而同名的元素并不存在,该过程将创建该元素。
输入一个名称(Name)。 你可以把描述(Description)和评论(Comment)留空,因为它们将在保存记录时与元素同步。
数据字典使用的列(Column)中的一些其他字段包括:
如果你正在数据库中创建列,或者你已经改变了表定义的一部分(如约束名称或增加字段长度),就应该选择 "同步列(Synchronize Column) "按钮。
视图组件(View Components)包含数据库视图的SELECT语句定义中的FROM、WHERE、GROUP BY和HAVING条款。如果你的数据库视图由多个SELECT语句组成(用UNION连接在一起),每个SELECT语句都需要一个视图组件。

视图列包含数据库视图的SELECT语句定义中的SELECT子句。

举个例子,如果你的数据库视图是用以下语句创建的:
CREATE VIEW someView ( someViewID, someViewName) AS SELECT someID, someName FROM someTable WHERE someAttribute = 'Y'
然后,以下信息将被储存在 "表和列 (Table and Column)"窗口的各个标签中。
窗口(Window)、标签(Tab)和字段(Field)窗口定义了每个窗口内的表和列的呈现方式。窗口中的每个选项卡指的是一个单一的表。 窗口的标签中的字段指的是表中的列。

窗口(Window)标签定义了系统中的每个窗口。名称(Name)和窗口类型(Window Type)是必须的。 名称是显示在窗口标题中的内容。 它也是显示在菜单中的名称。 系统会将窗口名称与菜单实体同步。
窗口类型(Window Type)决定了用户打开窗口时的行为。例如,如果窗口类型是维护(Maintain),那么所有激活的记录都会被检索到。 如果窗口类型是 交易(Transaction),则只显示今天创建或更新的记录,或未完成的记录。(请注意,所有的记录都可以通过搜索工具来检索)。 一般来说,在处理交易窗口时,例如发票,你不想检索两年前的发票,你想看看今天做了什么,哪些还需要进一步处理。
窗口访问(Window Access)标签定义了可以访问此窗口的角色。这通常是在角色窗口中定义的。
Tab标签定义了一个窗口中的每个Tab。每个标签指的是一个单一的表。表上的所有列都可以显示,但通常使用特定的字段选择。注意,显示(Display)和只读( read only)逻辑(连同为表/列定义的默认逻辑)在加载窗口时被评估。

在标签(Tab)中,所需的字段是名称(Name)、表(Table)、顺序(Sequence)和标签级别(Tab Level)。 名称(Name)表示在帮助文本中显示的内容,表(Table)将决定哪些字段可供显示,以及在此窗口标签中添加、删除或修改记录时将更新的表。
顺序(Sequence)决定了标签在窗口中出现的顺序。 默认情况下,每增加一个新的标签,系统将以10的数值递增序列。
标签级别(Tab Level)决定了该标签是否是前一个标签的子记录。标签级别为0表示它是起始的父标签。 标签级别为1表示它是父标签的一个子标签(例如在产品(Product )窗口中,BOM标签是产品标签的一个子标签)。 标签级别为2表示它是前一个标签级别为1的孩子(例如,BOM组件是BOM标签的孩子)。
标签定义的其他一些特点是:
字段(Field)标签定义了在一个标签内显示的字段。由于缓存,对字段标签所做的更改在重启后变得可见。如果序列为负数,记录将被降序排列。注意,如果是集中维护,名称、描述和帮助会自动同步。

名称(Name)和列(Column)是必须的。 可供选择的列是基于为标签定义的表格。 名称、描述和注释将从列的定义(已从元素定义中同步)中同步出来。如果在一个特定的窗口中,你想使用不同的字段标签或有不同的帮助定义,只需输入所需的内容并取消选择集中维护(Centrally Maintained)的复选框。这将阻止这个特定字段与表/列值的同步。
影响显示的字段的其他一些属性是:
上下文(Context)允许为给定的窗口定义备用字段标签。 例如,字段 "商业伙伴 "在不同背景下对用户意味着不同的东西。在销售订单中,商业伙伴是 "客户",在采购订单中是 "供应商"。 Context窗口为系统定义了不同的上下文。 然后为适当的元素定义不同的字段标签,并将语境分配给所需的窗口。

定义了一些情境(例如,销售Sales、采购Purchasing和请求Request)。如果需要,你可以添加新的上下文记录。

接下来为适当的元素添加新的名称Names、打印文本Print Text、描述Description和注释Comment。没有必要为所有字段定义上下文值。 如果没有定义上下文,系统将使用标准元素的定义。
最后,为窗口选择适当的上下文(例如,在销售订单(Sales Order)中,上下文被定义为销售)。
在Compiere中,报表和过程在技术上是同一个实体。两者都可以有一个预处理(如参数选择),都可以有输出(如报表查看器)。 然而,对于用户来说,它们被视为独立的实体。出于这个原因,它们在菜单中以图标的形式进行了区分。
要定义一个报告,打开报告和过程窗口。

名称(Name)是将显示在菜单和报告标题中的名称。
描述(Description)和注释(Comment)将显示在确认窗口中,当用户点击菜单中的报告图标时显示。 这是提供报告或流程用途信息的一个好方法。
数据访问级别(Data Access Level)用于自动生成角色安全。
选择报告视图(Report View)复选框,表示这是一份报告。这将把报告图标分配给这个菜单项,并显示适当的字段(如报告视图),以便进一步定义报告。
适当地输入其余字段。 唯一需要的其他字段是报告视图(Report View)。
直接打印(Direct Print)复选框表示报告在执行时将自动打印。
如果需要,你可以输入一个打印格式,在生成这个报告时使用。 如果没有选择打印格式。
选择参数(Parameter)选项卡来定义此报告的参数。可供选择的字段仅限于所选报告视图中的那些字段。
参数允许默认值、必需或可选以及值或日期的范围。
生成报告时使用的任何参数都打印在报告头。
如前所述,过程的定义方式与报告类似。

由于没有选择报告视图(Report View)复选框,在菜单中使用过程(Process)图标。另外,报告视图、打印格式和直接打印字段不显示(这是为窗口定义的显示逻辑的一个例子)。
在这里你将输入一个与过程相关的类名(Classname)和/或程序(Procedure)。 你也可以选择服务器过程(Server Process),如果这应该只在服务器上运行(而不是使用Swing客户端时的客户端)。
当你定义的过程是通过选择一个按钮(如文档上的 "完成 "按钮)启动的过程时,就会用到工作流字段。
与报表一样,过程也可以有参数供用户在执行流程时输入。
表格是复杂的窗口,是硬编码的。 一般来说,它们涉及来自一个以上的表的数据,可能有一对多或多对多的关系。 与其他实体不同,表单是在Swing客户端和HTML客户端中单独定义的。

Classname是用于为Swing客户端生成表单的代码。
WebUI的Java Classname是用来生成HTML UI的表单的代码。
如果定义了,jsp URL定义了用于运行HTML用户界面的java类的URL。
引用(Reference)是在列(表和列)中使用的,以控制在一个字段中显示什么以及如何显示。 引用可以是三种不同的验证类型之一;数据类型、列表或表验证。 选择的类型通常是基于字段的使用方式和所需的控制水平。
数据类型(DataType)的验证类型(Validation Type)用于定义不同的字段类型(例如,按钮 Button、日期时间Date Time、数字Number)。 一般来说,你不需要创建新的数据类型验证类型(Validation Type)的引用。
以下是Compiere支持的标准数据类型列表:
当你想给用户提供一个供其选择的数值列表,并且该列表是基于一个用户可能有或没有能力添加记录的表时,就会使用表验证的参考验证类型。
当你选择表验证的验证类型时,表验证标签被启用(这是一个为窗口、标签和字段中的标签定义的只读逻辑的例子)。

在这里你选择表名(Table Name)和表的关键列(Key column)。显示列(Display column)是将在下拉列表框中显示的内容。
选择显示值(Display Value)复选框,在下拉列表框中显示字段值。
如果列表中应显示作为表的标识符的所有字段,请选择 "显示标识符(Display Identifiers) "复选框。
如果合适,可以输入SQL WHERE和ORDER BY子句,以控制列表中显示的内容和顺序。这用于防止摘要组织出现在文档的组织下拉列表框中。
引用类型(Reference Type)的列表用于你想给用户提供一个可以进行选择的值的列表,但这个列表是在引用中定义的(而不是从一个表格中导出)。 列表最常被用于有一些与所选值相关的逻辑,因此涉及到代码的情况。 在这些情况下,你需要知道可能的值是什么。这方面的例子是销售订单中的发货规则。 这些值被限制在Reference中定义的列表中,所选的值会影响到生成货物的过程。 因此,允许用户输入任何他们想要的值是不合适的。

当选择了列表验证的验证类型时,列表验证标签被启用。这允许输入将被显示给用户选择的值。
搜索键用于控制数值在列表中出现的顺序,而名称是呈现给用户选择的内容。
验证规则是用来控制显示给用户选择的内容(类似于参考条目中的SQL Where Claus)。 然而,这些可以用于列中的任何字段类型。 它在表和列的动态验证规则中被选中。 正如其名称所示,它在选择列表或查找时动态地执行。

在这个例子中,验证被用来确保呈现给用户的选择只包含为所选的业务伙伴定义的地点,并且选择了寄往地址复选框。 这可以防止显示与其他业务伙伴相关联的地点或未被指示为送货地址的地点。
这种验证是动态的,因为它是基于另一个字段(在此情况下是业务伙伴)中选择的值。
与Compiere的其他数据字典窗口一样,验证规则也有一个 "使用列 "标签。如果你想改变一个验证规则,这很有帮助,因为你可以从这个标签中看到系统的其他区域。
Compiere中的应用字典是一个强大的开发工具。 在传统系统中用代码完成的许多工作都可以在应用字典中完成。 这有助于提供整个应用程序的一致性(特别是当多个开发人员参与时)和稳定性,此外还有快速、敏捷的开发。
Compiere 应用程序中充满了例子,显示了字典的不同功能是如何工作的。 无论你正在进行哪种类型的扩展或定制,你一般都可以在应用程序的其他地方找到一个以类似方式工作的实例。我们建议你在自己的开发工作中使用这些实例作为参考。