--将变量值拷贝到参数对象中,以便各个触发器,LOV等地方可以读取,需要在‘参数’下面创建相应的参数对象 --大多数情况,初始化多组织访问环境后并不需要再特地使用这些变量,多组织效果是直接作用在session上 copy(l_default_org_id,'PARAMETER.mo_default_org_id'); copy(l_default_ou_name,'PARAMETER.mo_default_ou_name'); copy(l_ou_count,'PARAMETER.mo_ou_count'); IF l_default_org_id IS NOT NULL THEN --如果存在默认组织,则保存到old_org_id中 copy(l_default_org_id,'PARAMETER.old_org_id'); --设置为单组织访问方式,第一个参数'S'代表使用单组织访问方式,第二个参数代表具体使用的组织ID --mo_global为Oracle提供的库函数 mo_global.set_policy_context('S',l_default_org_id); ELSE --设置为多组织访问方式,第一个参数'M'代表使用多组织访问方式,当第一个参数为'M'时,第二个 --mo_global为Oracle提供的库函数 参数无意义 mo_global.set_policy_context('M',NULL); END IF; 通过步骤1和2,你的PRE_FORM看上去应当像这样:
图65
3. 在‘参数’中添加上面代码中使用到的PARAMETER对象,包括mo_default_org_id,
mo_default_ou_name, mo_ou_count, old_org_id。如图所示:
图66
这样,即可完成多组织的初始化,FORM中基于Oracle视图的查询语句将可以直接看到多组织的效果
3.1.3如何为一个日期型字段设置弹出日历的效果
1. 在项属性的“初始值”中填写 $$DBDATE$$ 。
注:该变量代表当前日期
2. 在项属性的“值列表”中选择 ENABLE_LIST_LAMP 。
注:该值列表为系统提供的特殊类型值列表,作用是给输入框添加一个LOV按钮,但不做任何其他事情,需要自己再实现相应功能
3. 在该项的触发器中添加KEY-LISTVAL触发器,填写代码: --calendar为template.fmb中都有的日历窗口 calendar.show; 上述步骤操作完后,应当与下图类似:
图67
3.1.4如何实现将一个输入框初始化为只读方式
将该项的“子类信息”设置成TEXT_ITEM_DISPLAY_ONLY即可,如图所示:
图68
3.1.4如何实现第二个输入框依照第一个输入框的选择变换为必输或者不必输的状态
第一个输入框假设为Headers. CREDIT_OVER_LOW_FLAG,“项类型”为“列表项” 第二个输入框假设为Headers. CREDIT_OVER_LOW_RATE,当第一个输入框值为‘N’的时候,第二个输入框变为不需要输入的状态,当第一个输入框值为‘Y’时,第二个输入框变为必填项状态。
依照上面的需求,首先:
1. 在第一个输入框Headers. CREDIT_OVER_LOW_FLAG项下添加触发器“WHEN-LIST-CHANGE” 2. 触发器中填写如下代码: --溢短装与比例读写属性修改,注意项前面要有个冒号 --app_item_property.set_property为Form提供的属性变更函数 IF : Headers.CREDIT_OVER_LOW_FLAG = 'N' THEN app_item_property.set_property('Headers_V.CREDIT_OVER_LOW_RATE',ENTERABLE,PROPERTY_FALSE); app_item_property.set_property('Headers.CREDIT_OVER_LOW_RATE',REQUIRED,PROPERTY_FALSE); : Headers.CREDIT_OVER_LOW_RATE := NULL; ELSIF : Headers.CREDIT_OVER_LOW_FLAG = 'Y' THEN --当第一个输入框值为Y的时候,设置第二个框的输入状态为可以输入,并且是必输项 app_item_property.set_property('Headers.CREDIT_OVER_LOW_RATE',ENTERABLE,PROPERTY_TRUE); app_item_property.set_property('Headers.CREDIT_OVER_LOW_RATE',REQUIRED,PROPERTY_TRUE); END IF; --当第一个输入框值为N的时候,设置第二个框的输入状态为不可输入,必选属性为FALSE 3.1.5如何在运行时监视变量当前值
FORM开发无法使用调试器进行断点调试,因此,假如需要在运行时观察某个变量运行到当前代码时的值是多少,可以借助以下方法进行,主要是借助弹出式窗口显示出当前变量的内容。
1. 在“程序单元”中创建显示“过程”,如图所示:
图69
2. 输入如下代码:
PROCEDURE CUST_SHOW_MESSAGE(MsgName IN VARCHAR2) IS i number; BEGIN --FND_MESSAGE.set_name为Oracle提供函数,用于将信息设置到产品上,最终显示可能根据语言环境和产品预先的配置实现--翻译效果,完整的用法可能需要搭配FND_MESSAGE.set_token,本函数参数依次为: --产品的SHORT_NAME,信息文字 FND_MESSAGE.set_name('TCSA',MsgName); --FND_MESSAGE.question为Oracle提供的函数,用于弹出Question类型窗口,参数依次为: -- 第一个按钮文字,第二个按钮文字,第三个按钮文字,默认按钮位置,取消按钮位置,窗口图标 i := FND_MESSAGE.question('Yes','','',1,2,3); END; 3. 在需要监视的地方插入CUST_SHOW_MESSAGE调用,例如下图所示,是在进入该函数时
弹出显示当前event变量的值
图70
3.1.6如何实现关键字弹性域
1. 在Form级别的触发器WHEN-NEW-FORM-INSTANCE 中添加初始化关键字弹性域代码,
下面例子中的代码是取商品关键字弹性域的编码,本代码中的参数不通用,注意理解代码中的注释 同 VALIDATE =>'FULL', --不理解此参数含义 ID =>'CATEGORY_ID', --记录弹性域ID,关键字弹性域Oracle中 NUM => :PARAMETER.P_ITEM_CAT_STRUCTURE_ID, --上面SQL语 WHERE_CLAUSE => '(NVL(DISABLE_DATE,SYSDATE+1) > SYSDATE)'); --有效条--获取相关的关键字定义ID_FLEX_NUM到P_ITEM_CAT_STRUCTURE_ID参数中 select ID_FLEX_NUM INTO :PARAMETER.P_ITEM_CAT_STRUCTURE_ID from FND_ID_FLEX_STRUCTURES_VL WHERE ID_FLEX_CODE = 'MCAT' AND ID_FLEX_STRUCTURE_CODE = 'CUSTOMS_CATELOGIES'; -- 调用Oracle标准包FND_KEY_FLEX.DEFINE完成初始化关键字弹性域 FND_KEY_FLEX.DEFINE(BLOCK =>'CT_LINES', APPL_SHORT_NAME =>'INV', CODE =>'MCAT', --弹性域所在数据块 --界面上显示的弹性域字段 FIELD =>'CATEGORY_NAME', --WHERE语句中的ID_FLEX_CODE和ID_FLEX_STRUCTURE_CODE需要依照实际情况更改 --弹性域产品名,依照实际情况进行更改 --与上面SQL语句的条件中的ID_FLEX_CODE相实际上主要记录ID 句找到的ID 件,本例子中,表达式表示DISABLE_DATE要大于SYSDATE或者为空才有效) 2. 在‘参数’中创建上诉代码需要使用的P_ITEM_CAT_STRUCTURE_ID,如图: