约束变量
可以将特殊变元(约束变量)置入 WHERE 子句中,以便可以使值基于其它值。这些约束变量包括 :block.field,:$PROFILES$.Option_name 或 :$FLEX$.Value_set_name。您不能在“值列”或“隐藏标识列”字段(通常您会在这些字段中指定列名)中使用约束变量。但可以在“说明列”和“附加列”字段中使用约束变量。
请注意,在默认情况下,需要为约束变量赋值;也就是说,对于使用约束变量以产生某种含义的语句、表达式或用户出口,其中的约束变量必须有值。通过使用 :NULL suffix 可使约束变量成为可选项。因此,如果约束变量为 NULL,则会禁用使用此变量的段/参数,并且会忽略约束变量的必需属性(如果启用)。有关 :NULL 后缀的详情将在本节的末尾部分讨论。
:$FLEX$.Value_ Set_Name
Value_Set_Name 是前面段的值集名,或者是同一弹性域或参数窗口中,使基于验证表的值从属于前面段的段名。在定义弹性域结构或报表参数窗口时,您应定义使用值集 Value_Set_Name 的段或参数,使其比使用基于验证表的值集的段具有更低的序号。$FLEX$ 结构使用具有匹配值集名或段名的“最近”前面段(它首先查找值集名,如果无匹配的值集名,则使用段名)。
Value_Set_Name 区分大小写,因此您必须确保此处指定的名称与在“定义值集”表单中定义的值集名完全匹配。注意,如果要将值集名用于 :$FLEX$. Value_Set_Name 子句,则在值集名中只能使用字母、数字和下划线 (_)。您不能在这些值集名中使用引号、空格或其它特殊字符,因此您应仔细地定义值集名,不要包含空格、引号或其它特殊字符。
您可以在单个 WHERE 子句中指定多个 :$FLEX$.Value_Set_Name,从而创建一个段,其可能值列表从属于前面多个段。
在指定 :$FLEX$.Value_Set_Name 时,弹性域段或报表参数会默认为始终使用上一个值集的隐藏标识列来比较 WHERE 子句。但是,最终用户决不会看到隐藏标识值。如果未指定隐藏标识列,则段会默认为使用值列中的值。
在指定 :$FLEX$.Value_Set_Name 时,您还可以明确地选择要 :$FLEX$.Value_Set_Name 为哪个列返回值。您可以通过指定 :$FLEX$. Value_Set_Name.OUTPUT 来执行此操作,其中 OUTPUT 可以是“标识”、“值”或“含义”(用于返回说明列的值)。
在指定验证表值集时,您也可以在“附加列”字段中使用 INTO 子句(在整个列和别名列表之后)将值置入您用于 :$FLEX$. segment_name.OUTPUT 的变量中,其中 OUTPUT 是选定的名称。然后,您可以使用 :$FLEX$.segment_name.OUTPUT(其中 OUTPUT 为相同名称)从另一个段的值集 WHERE 子句中检索该值。您不能使用 OUTPUT 将值直接置入字段中,但是,一旦关闭弹出式窗口,弹性域段检索到的值就会置入与段对应的隐藏表单字段中。如果没有在“附加列”字段中指定 INTO 子句,则值除了在值列表中显示之外,就不会在其它任何地方显示(值将成为 INTO NULL)。
注意:如果要使用弹性域服务器端验证,则不能对值集使用 INTO 子句。您必须删除 INTO 子句,或使用配置文件选项“弹性域:在服务器端验证”来关闭弹性域服务器端验证。
请参阅:
:block.field
:block.field 是说明性弹性域所在表单上某字段的 SQL*Forms/Oracle 表单名。您可以使用此变元来使值集与表单中的字段具有上下文相关性。这有点类似于使用具有说明性弹性域的参考字段,使用具有说明性弹性域的参考字段可以在不同上下文相关段的结构及其值集之间提供选项。但是,使用此 :block.field 变元可为您提供通常显示的相同段,并且可以更改附加至段的值集内容(取决于 : block.field 中显示的内容)。在某些情况下,您可能要使用 :block.field 值集,而不使用具有许多不同上下文相关结构的说明性弹性域参考字段。
注意,如果使用此变元,您必须在每个表单中具有相同的 :block.field,其中可能使用基于此验证表的值集。例如,如果同一弹性域显示在七个表单上,则所有七个表单必须均具有此 block.field。同样,如果您在多个弹性域中共享值集,则所有使用那些弹性域的表单也必须具有此 block.field。尽管键弹性域段或报表参数可能使用此变元,但是此限制同样适用; 也就是说,无论是否可以使用值集,您必须具有相同的 block.field。
警告:提供 :block.field 机制仅仅是为了向后兼容。使用此机制的值集将不会与 Oracle Applications 将来的版本兼容。如果要使用弹性域服务器端验证,则不能使用表单字段参考 (:block.field)。您必须删除字段参考,或使用配置文件选项“弹性域:在服务器端验证”来关闭弹性域服务器端验证。
请参阅:
:$PROFILES$. profile_option_ name
Profile_option_name 是用户配置文件选项的内部选项名,如 CONC_COPIES(用于“并发:报表份数”)或 GL_SET_OF_BKS_ID。例如,您可以将 WHERE 子句定义为:
WHERE SET_OF_BOOKS_ID =
:$PROFILES$.GL_SET_OF_BKS_ID
请参阅:设置用户配置文件概览
:NULL 后缀
使用 :NULL 后缀可使约束变量变成可选项,也就是说允许存在 NULL 值。如果不使用 :block.field,:$PROFILES$.Option_name 或 : $FLEX$.Value_set_name,您将分别使用 :block.field:NULL,$PROFILES$.Option_name:NULL 或 :$FLEX$.Value_set_name:NULL。例如,如果值集名为 Car_Maker_Name_Value_Set,您将使用 :$FLEX$.Car_Maker_Name_Value_Set:NULL。
另请参阅:$FLEX$ 语法实例
WHERE 子句的特殊处理
弹性域会在后台将一个 AND…子句添加至为验证表值集定义的 WHERE 子句中。如果 WHERE 子句包含 OR,则附加的 AND 子句可能并不应用于整个 WHERE 子句(不带括号),因而不会产生正确的结果。因此,弹性域会自动为 WHERE 子句加上括号。
验证表信息窗口
创建数据库表或视图,该表或视图在 CHAR,VARCHAR2,NUMBER 或 DATE 类型的列中保存有效值和值说明。
使用“注册表”窗口,向 Oracle Application Object Library 注册您的表。建议您执行此步骤,但不是必需执行。
在将访问弹性域或报表(它使用基于验证表的值集)的任何应用产品 ORACLE 帐户中,为验证表创建同义词。
将您的应用产品的 ORACLE 帐户在表中的 SELECT 权限授予将使用基于该表的值集的任何应用产品的 ORACLE 帐户。
定义值集名和格式化选项。请参阅:定义值集
要定义验证表信息,请执行以下操作:
1. 输入您注册验证表所使用的应用名。应用名和表名唯一标识了验证表。
如果计划在值列表中显示多个表列,您应将此字段留空,因为此情况下该字段实际被忽略。
2. 输入要用作验证表的应用表、视图或同义词的名称。如果未向 Oracle Applications 注册过此表,您应键入此表的完整名称。
您可以定义值集以便显示多个列,而这些列可能在不同的表中。如果这些列存在于不同的表中,您必须在此字段中指定多个表名,并用逗号隔开。如果需要,您可以使用表的别名。例如,如果使用两个表,则可以在此字段中输入以下信息:
fnd_form f, fnd_application a
然后,在“值列”、“说明列”、“隐藏标识列”、WHERE/ORDER BY 和“附加列”字段中使用对应的表别名(用于 WHERE 子句):
where f.application_id = a.application_id
3. 在验证表中输入列名,该列包含的值可用于验证用户为弹性域段或报表参数输入的值。
对于可用列的选择取决于指定的“格式类型”,并且无需与“格式类型”匹配。例如,如果指定“格式类型”为“标准日期”,则只能从那些已注册为“日期”或“字符”类型的列中选择。同样,如果指定“格式类型”为“数字”,则只能从那些已注册为“数字”或“字符”类型的列中选择。但是,如果指定格式类型为“字符”,您只能看到“字符”类型的列。在“格式类型”字段中指定的格式类型即为段或参数值的格式。
您可以使用 SQL 表达式来代替列名,但是不可以使用任何特殊的约束变量。
注:如有可能,请避免使用 SQL 表达式来代替列名,因为在将来的版本中不会再支持 SQL 表达式。
4. 在验证表中输入列名,此列包含对“值列”中各值的说明。如果将此字段留空,则值集会自动将值列用作说明列(但不会重复显示值列)。
在您为弹性域段或报表参数输入对应值时,弹性域或报表参数窗口会显示此列的含义。
5. 在验证表中输入列名,该列包含的值可用于验证用户为弹性域段或报表参数输入的值(但您不想为用户显示)。
如果除值列之外,您还指定了隐藏标识列,则弹性域会将隐藏标识值而非值列中的值保存在基础弹性域表的段列(在 ATTRIBUTEnn 列或 SEGMENTnn 列)中。
注意:对于用于“会计科目弹性域”或其它大多数键弹性域的值集,请不要为其指定隐藏标识列。
如果除值列之外,您还指定了隐藏标识列,则报表参数窗口会将隐藏标识值(而非值列中的值)传送给报表。
6. 输入 SQL WHERE 子句或 ORDER BY 子句,或同时输入这两个子句。
7. 对于使用此值集的段,请输入要显示的所有附加列。这些列与您为“值列”、“说明列”或“隐藏标识列”指定的列不同。
8. 指明是否允许将父值存储于 Oracle Application Object Library 的 FND_FLEX_VALUES 表中并在使用此值集的段的列表中显示。
列类型字段
三个“类型”字段将自动显示选定列的类型。您决不能更改显示的列类型。
如果在“列”字段中指定了 SQL 表达式(或未注册的表中的列),而不是已注册的单个列名,您必须指定表达式返回值的类型(字符、数字或日期)。因为对于不是已注册的单个列的“列名”,此窗口无法检索这些信息,所以您必须指定类型。
列长度字段
三个“长度”字段会自动显示选定列的长度。
如果您未指定隐藏标识列,则 Oracle Applications 将使用值集的最大长度来确定某个值是否符合基础弹性域段列。值集的最大长度将自动更改为您在“长度”字段中为“值”列指定的列长度。如果此值不适合,您在定义弹性域段时将不能使用此值集。
如果使用隐藏标识列,则为隐藏标识列指定的长度就是弹性域值集的“有效”最大长度,这是因为 Oracle Applications 使用隐藏标识列的长度来确定值是否符合基础弹性域段列。如果此值不适合,您在定义弹性域段时将不能使用此值集。
通常,您应避免更改显示的列长度。但是,在某些情况下,如果要将此值集用于某个弹性域,其基础列长度小于验证表中值列或隐藏标识列的实际长度,则您可能需要更改列长度。例如,如果您要使用查找表(值列表)的查找代码列,而您知道所有查找代码均不超过两个字符,则即使查找表中的列实际上可以包含 30 个字符,您也只需将长度指定为 2。这样,对于基础段列长度在 2 和 30 之间的弹性域,您可以使用此值集。
只有在您知道列中的值的最大长度始终等于或小于在此字段中指定的长度时,才可以更改列的显示长度。您不应试图指定一个小于实际潜在值长度的数字来“欺骗”Oracle Applications,因为这样可能会导致数据截断错误、“未定义值”错误或其它错误。
如果在“列”字段中指定了 SQL 表达式(或未注册的表中的列),而不是指定已注册的单个列名,您必须指定表达式返回值的长度。因为对于不是已注册的单个列的“列名”,此窗口无法自动检索此信息,所以您必须指定长度。
WHERE/ORDER BY 字段
您可以使用 SQL WHERE 子句来将有效值集限制为表中值的子集。例如,如果某个表包含所有员工的值和含义,但是您只想验证加利福尼亚员工的分录,则可以输入 SQL WHERE 子句,将有效值限制为符合 WHERE LOCATION = ‘CALIFORNIA’ 的行。您可能需要选择值集名来反映此限制,如此实例中的“加利福尼亚员工”。
使用 ORDER BY 子句可以确保值按非标准顺序显示在值列表中,此值列表位于使用值集的段上。“标准”顺序取决于值集的格式类型。例如,如果某个表中包含星期,您可能需要值列表按 "Monday,Tuesday,Wednesday, …" 时间顺序来显示,而不是按“字符”格式类型值集的字母顺序显示为 "Friday,Monday,Saturday, …"。如果要按时间顺序显示,您可以使用表中的第二列(也可用作隐藏值列)来按编号标识每一天。因此,如果您调用编号列 DAY_CODE,ORDER BY 子句将为 ORDER BY DAY_CODE。
警告:对于要用于“会计科目弹性域”的值集,您决不可以使用 WHERE 子句和(或)ORDER BY 子句。一般来说,对于要用于键弹性域而不是“会计科目弹性域”的验证表,您可以使用 WHERE 子句和(或)ORDER BY 子句。
如果使用 WHERE 子句,您必须将字 "WHERE" 用作此子句的第一个字。如果使用 ORDER BY 子句,则子句中必须具有字 "ORDER BY"。
您不可以在子句中使用 HAVING 或 GROUP BY,也不可以在子句中使用 UNION,INTERSECT,MINUS,PLUS 或其它集运算符,除非它们是在子查询中。
在引用列时,您应始终将表名或表别名包括在子句中,即使您只要使用一个验证表,并且在“表名”字段未使用该表的别名。例如,您可以输入:
where f.application_id = a.application_id
或
where form_table_name.application_id =
application_table_name.application_id
您可以在 WHERE 子句中使用某些特殊变量,以便可以使值基于其它值。您可以使用的特殊变量包括:
- :$FLEX$.Value_Set_Name
- :block.field
- :$PROFILES$.profile_option_ name
警告:提供 :block.field 机制仅仅是为了向后兼容。使用此机制的值集将不会与 Oracle Applications 将来的版本兼容。
附加列字段
在此指定的内容应符合一般语法:
sql_expression_such_as_column_name "Column Title Alias"(width)
其中,列标题别名或宽度均可选。如果您仅指定 SQL 片段而不指定别名或宽度,则列将不显示出来。您可以指定多个表达式并用逗号隔开,如下所示:
column_name_1 "Column 1 Title"(宽度), column_name_2 "Column 2 Title"(宽度), ...
您还可以将消息名称用作别名,此功能便于转换列标题。将消息名称用作别名的语法为:
sql_expression_such_as_message name "APPL=<应用产品简称>;NAME=<消息名>"(宽度)
您可以指定要显示的列宽,也可以使用 (*) 来指定一个列,列的显示宽度取决于所包含的值。对于列名复杂的 SQL 表达式,您可以始终使用别名。对于使用多个表的值集,您可以始终在列名中包括表别名。例如:
f.user_form_name "Form Title"(30), a.application_name "Application Name"(*)
如果显示了段或参数,则“值列”将作为列标题与参数或段提示一起显示。
您可以包括更复杂的 SQL 片段,如级连的列名和常数。例如:
f.user_form_name "Form Title"(30),
'Uses table: ' || t.user_table_name "Table Used"(30)
允许父值字段
如果允许父值,您可以使用“段值”窗口来为验证表中的值创建父值。
建议:建议您允许“会计科目弹性域”中的段使用父值。父值可以用于创建汇总帐户和提高 Oracle Applications 的生产率。但是,我们建议您不要允许其它值集使用父值。允许其它值集使用父值可能会对性能产生不利影响,因为这样弹性域就必须验证表值与 FND_FLEX_VALUES 表相关值的集合,并在正常验证中执行额外查询。例如,如果用户使用段中的值列表,则此列表必须检索两个表中的值。
如果在“附加列”字段中指定附加列,或在“隐藏标识列”字段中指定隐藏标识列,或验证表中具有 SUMMARY_FLAG 列,则必须在此字段中指定“否”。
WHERE PO_NUMBER=:$FLEX$.HRS_Po_Number AND COUNTRY_CODE=:$FLEX$.HRS_Orig AND ITEM_NUMBER=:TLIN_LINES.ITEM_FLEX
WHERE temp.PO_NUMBER=:$FLEX$.HRS_Po_Number AND temp.COUNTRY_CODE=:$FLEX$.HRS_Orig AND temp.ITEM_NUMBER=:TLIN_LINES.ITEM_FLEX and temp.item_number=items.segment1
items.attribute1 "UOM系数" (10)
SELECT GAP_QUANTITY FROM XX_PO_GAP_QUANTITY_TEMP WHERE PO_NUMBER=:$FLEX$.HRS_Po_Number AND COUNTRY_CODE=:$FLEX$.HRS_Orig AND ITEM_NUMBER=:TLIN_LINES.ITEM_FLEX AND INVOICE_NUMBER=:$FLEX$.HRS_I_Invoice_temp
Oracle Purchasing
WHERE PO_NUMBER=:$FLEX$.HRS_Po_Number AND COUNTRY_CODE=:$FLEX$.HRS_Orig AND ITEM_NUMBER=:TLIN_LINES.ITEM_FLEX