Form开发问题解决方案集锦

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Form开发问题解决⽅案集锦
FORM开发
Author:陈勇俊
E-Mail:yongjun69.chen@/doc/42385be1680203d8cf2f2442.html Creation Date:2013-11-13 Last Update:
Document Ref: Version: 1.0
Approvals:
1.⽂档控制1.1.更改记录
1.2.审阅记录
1.3.分发⼈员
2.常见错误
2.1 找不到画布,⽆效的ID
1、检查 WHEN-NEW-FORM-INSTANCE触发器中堆叠画布设置是否正确
检查 FOLDER_BLOCK 与 FOLDER_PROMPT两个数据块中字段的名字是否
⼀致
2.2 出现截断.字段row_id太长
Row_id的默认最⼤值为4,将最⼤值改成18。

2.3 块查询时出现红⾊进度条
设置QUERY_FIND块的Previous Navigation Data Block的属性为要查询的块。

2.4后台去除错误个性化
SELECT function_name,
form_name,
created_by,
creation_date,
description, --个性化的描述
trigger_event, --触发器类型
trigger_object, --触发对象
condition, --触发条件
FROM fnd_form_custom_rules
WHERE1 = 1
--AND function_name = 'PO_POXRQERQ'
--OR form_name = 'POXRQERQ'
2.5不能导航到next-record,光标⽆法移动
现象:当⿏标点击到下⼀⾏时,光标⽆法移动
解决:
检查ITEM :current_record_indicator的⼦类信息是否正确
检查该ITEM的whe-new-item-instance触发器是否设置正确
app_folder_move_cursor('1');
2.6不能解析项** 的引⽤、⾮法受限过程等
检查POST-BLOCK,POST-QUERY等触发器中是否存在go_block,go_*,
First_record这样的语句。

2.7EBS界⾯查不到数据、数据库有
在EBS界⾯上执⾏F11查询时⽆数据,但⽤last_query语句在数据库中查询时有数据。

现象如下图:select * from view
PLSQL在数据库中查询有数据:
⾸先,怀疑EBS和PLSQL是否存在上下⽂环境问题,进⾏模拟登陆后还是⼀样,接下来获取了查询时的
default_where,default_where为空,说明查询时没有附加查询条件,最后终于搞定:
原因是数据块对应的视图中存在这样的⾮数据库项:
⽽在Formbuilder开发时这个ITEM设置的是数据库项:
从⽽在界⾯查询时找不到对应的数据库项,⽽在PLSQL中没有数据项和⾮数据库项的区别。

将该ITEM设置为⾮数据库项即可
注意:有时Formbuilder中的ITEM长度、类型等属性和表中的字段不相匹配时也会导致这样的问题。

2.8 fnd_org.choose 不能弹出选择组织界⾯
在⾃⼰的demo系统中新建了菜单,下⾯挂载了功能,功能对应的form中有弹出选择组织的功能,但是⼀直没有弹出选择的界⾯。

正常情况下:将INVSTAND.fmb中对象组INV_PARAMS SUBCLASS到⾃⼰的Form中,产⽣四个参数,在 Pre-form中添加fnd_org.choose_org后会弹出选择界⾯。

在了解了fnd_org.choose_org过程后,发现是该职责没有可访问的组织(职责是⾃⼰新建的)。

FNDSQF.pll 中的fnd_org.choose_org 会把当前职责可以访问的组织全部查询出来放在LOV中。

通过通过建⽴"库存组织"与"职责"的对应关系,可以在某个职责下访问已建⽴关系的库存组织相关信息。

路径:库存管理 -> 设置 -> 组织 -> 组织访问
CYJ SEEKER为CUX应⽤下的职责
建⽴关系后,成功弹出以下窗⼝:
Ps:执⾏完pre-form中的fnd_org.choose_org后,如果⽤户选择了组织,LOV会给以下四个参数赋值:
2.9 点击⼿电筒窗⼝查询时出错
错误如下:
原因:QUERY_FIND相关设置出错
如以下布局问题:
2.9FRM-30187: Size of CHAR column in record group must be between 1 and 2000
编译FORM时报错:record group 中有字段的值⽆效
查看record group 的属性:Column Specifications -> 点击“More” -> 检查各个字段的长度,⼤于2000的改成2000,⼩于1的改成1
2.10画布看不到背景⾊
画布突然成了灰底,看不到背景⾊,⽆法判断画布的范围。

View -> show canvas
2.11 app_folder.event('INSTANTIATE'); 卡住
现象:在when-new-form-instance中初始化folder时,程序进⼊
app_folder.event('INSTANTIATE')⽅法没出来,⼀直等待状态。

原因:FOLDER上所有ITEM都为 item_display_only 类别,该类型没有光标导航,所有的item都⽆法找到。

所以程序⼀直在folder上找item,出现⼀种假“死锁”状态。

解决⽅法:将第⼀个item的 Keyboard Navigable设置为YES或者将item设置为text_item类型,属性可更新、可插⼊设置为false
2.12 Can?t create File
⽤form builder 开发过程中,保存时突然弹出:Cant create File。

⽆法保存也⽆法另存为。

原因:其他程序正在访问fmb⽂件且未释放资源。

我这次是FTP占据了资源:
2.13 出现截断,字段 xxx太长
可能的原因有:BLOCK中字段长度不够,BLOCK中字段长度与数据库中字段长度不匹配,LOV中字段长度、Record Group 中字段长度等。

上⾯⼏个长度⼀般保持⼀致,如果没问题,可以检查查询长度:
将字段Query length 设⼤⼀点, query length 的默认值⼀般为 0
2.14 类似乱码,显⽰不正常
如下图,没有在AU_TOP下⾯编译
LOV 列长度超2000
Size of char column in record group must be between 1 and 2000
查看record group 的 column specifications 属性,⾥⾯有的列长度会为4000,⼀般在该列时通过function获取的时候会出现这种情况.
LOV查询时出错:ORA-00918 未明确定义列
经测试,发现LOV的查询字段使⽤了别名导致该错误
3.⼩开发项
3.1 块查询(⼿电筒窗⼝查询)
3.1.1添加QUERY_FIND对象组
将APPSTAND.fmb中的“QUERY_FIND”对象组拖到(选
择COPY)⾃⼰的Form中,拖进来后将⾃动建⽴
QUERY_FIND数据库、画布、窗⼝。

3.1.2设置导航块
设置Previous Navigation Date Block 为⽬标查询数据块,
Nex Navigation Data Block 为
⽬标数据块不需要进⾏设置。

不设置退出时可能出问题
3.1.3修改触发器
修改QUERY_FIND块级触发器:KEY-NXTBLK
将app_find.find(‘block_name’);中的block_name修改为被查找的数据块。

修改FIND 和 NEW 两个BUTTON的触发器
将app_find.find(‘block_name’);中的block_name修改为被查找的数据块。

:parameter.G_query_find := 'TRUE';
hide_window('QUERY_FIND');
app_find.find('FA_OUT_FOLDER');
:parameter.G_query_find := 'FALSE';
这些代码的主要作⽤是关闭查询窗⼝,并导航到⽬标数据库执⾏查询。

Ps: NEW 按钮的 WHEN-BUTTON-PRESSED触发器⽤于取消查询,即不
查询直接跳转到⽬标数据块。

可以将 NEW按钮的label属性设置为:取消(&C)
注意:此时设置了⼀个快捷键:Alt + C =>取消
3.1.4在QUERY_FIND中创建ITEM
3.1.5为要查询的BLOCK添加触发器
when-new-record-instance 执⾏层次改成:after(没有则新建⼀个,写
NULL)
不设置⽬标块的query_find触发器会出现⼿电筒按钮只能点击⼀次,
如果查询进⼊界⾯后,点击⼿电筒没有反应,检查query_find触发器
query_find triger:
app_find.query_find('block_window','find_window','find_block'); eg:
app_find.query_find('MAIN','QUERY_FIND','QUERY_FIND');
注意:query_find中的字段要与数据块中字段以及数据库字段当度设置
为⼀致。

Block中作为查询条件的字段的query length默认为0,需要
设置为合适的长度。

pre-query trigger:
IF :parameter.g_query_find = 'TRUE'THEN
⾮范围项:
Copy(name_in('QUERY_/doc/42385be1680203d8cf2f2442.html
_CODE'),'/doc/42385be1680203d8cf2f2442.html ANIZATION_CODE');⾮⽇期类范围项:
app_find.query_range(:QUERY_FIND.BATCH_NO_FROM,
:QUERY_FIND.BATCH_NO_TO,
'MAIN.BATCH_NO');
⽇期类范围:
app_find.query_date_range(:QUERY_FIND.IN_STOCK_DATE_FROM,
:QUERY_FIND.IN_STOCK_DATE_TO,
'MAIN.IN_STOCK_DATE');
:parameter.g_query_find := 'FALSE';
END IF;
注意:当需要对数据进⾏处理时,可以采⽤以下查询⽅式:
DECLARE
l_where_clause VARCHAR2(4000) := '1=1';
BEGIN
IF :parameter.g_query_find = 'TRUE'THEN
app_query.reset('WAFER_HEADER');
IF :query_find.incoming_no IS NOT NULL THEN
l_where_clause := l_where_clause || ' AND incoming_no = :query_find.incoming_no '; END IF;
app_query.append('WAFER_HEADER', l_where_clause);
:parameter.g_query_find := 'FALSE';
END IF;
END;
3.1.6 修改⽬标ITEM的查询长度
如果是范围查询,通常⽬标ITEM的 query length 为0,长度不够,设置为255
即可。

可参考:8.1 查询原理
3.1.7 其他设置
QUERY_FIND WINDOW ⼦类:WINDOW
QUERY_FIND BLOCK ⼦类:BLOCK
QUERY_FIND CAVANS ⼦类:CONTENT
3.1.8 切记
FORM的第⼀个导航数据块设置为QUERY_FIND
3.2 跳⾄下⼀数据块并查询
ORGANIZATION_CODE
v_query_where VARCHAR2(2000); --定义
v_query_where = 'WHERE 1 = 1'–初始化
IF :/doc/42385be1680203d8cf2f2442.html ANIZATION_CODE IS NOT NULL THEN
v_query_where := 'ORGANIZATION_CODE = ' || :/doc/42385be1680203d8cf2f2442.html ANIZATION_CODE
END IF;
go_block('LINE');
Set_block_property('LINE',default_where,v_query_where);
Execute_query;
3.3 ⽇历控件
1.添加key-listvl触发器:calendar.show;
2.设置item的list of value 属性:ENABLE_LIST_LAMP
3.设置item的validate from list 属性为: NO
特别注意:item_type => TEXT ITEM, date type => Date
错误例⼦:
Date type 未设置成 date,为 char
后台代码有如下代码:to_char(item,?yyyy-mm-dd?),由于iem不是date类型,
导致报错
3.4 弹出选择组织界⾯
1.打开 INVSTAND.fmb,将对象组INV_PARAMS SUBCLASS到⾃⼰的Form中
2.在 Pre-form中添加 fnd_org.choose_org;
3.5 全选功能实现
go_block('MAIN');
first_record;
:PARAMETER.G_SELECT_COUNT := 0;
LOOP
IF :CONTROL.SELECT_ALL = 'Y'THEN
:PARAMETER.G_SELECT_COUNT := :PARAMETER.G_SELECT_COUNT + 1; :MAIN.CHECK_BOX := 'Y'; ELSE
:MAIN.CHECK_BOX := 'N';
END IF;
EXIT WHEN :/doc/42385be1680203d8cf2f2442.html st_record = 'TRUE';
next_record;
END LOOP;
3
3.6通⽤导⼊
3.6.1利⽤⼯具表单新建function
表单:汉得通⽤导⼊表单(已做好),直接⽤即可。

利⽤已有的表单:“AOS HAND Common Import”,参
数:IMPORT_CODE=功能名
3.6.2导⼊设置
Import Code:上⼀步定义的功能简称
Win Title:通⽤导⼊界⾯的窗⼝标题
Package Name: 导⼊时数据验证对应的Package
其他参数copy上⾯的即可。

2.6.3 写数据验证PKG
根据需求进⾏数据验证,可以参考⾃⼰写的验证包。

注意:把验证PKG中的 g_function_name 设置为刚定义功能名。

3.7 提交请求
3.7.1 fnd_request.submit_request
-- 具体代码见⼯具包 : cyj_tool_pkg
req_id := fnd_request.submit_request('XBOL', -- 应⽤名
'XWMSICRP', -- 并发程序简称
NULL, -- description 程序描述
NULL, -- start time
FALSE, -- 是否为⼦程序
l_organization_id, --param1
l_invoice_no, -- param2
chr(0)); -- 参数以chr(0)结束
注意:Req_id = 0,提交请求失败;不为0时为请求ID。

因为这样提交请求只是往表:FND_CONCURRENT_QUEUES中插了⼀条数据,可以在这个表⾥找到我们提交的请求的输出⽂件和⽇志⽂件的存储路径,但并未commit,因此:
Form中提交请求必须显⽰commit: forms_ddl('commit');
Ps:fnd_request.submit_request()有⼀百多个参数,PL/SQL中不⽤写满,只要在参数结束时加上chr(0)即可。

但是在FORM中提请求时参数必须写满。

Added:貌似现在不⽤写满105个参数了
拓展学习:FORM中提交XML报表请求
由于模板定义时定义了报表的输出格式,不好⼿动修改,所以可以在代码中根据需求修正,在提交请求前加⼊布局代码:
v_layout :
= fnd_request.add_layout(template_appl_name => 'CUX',--应⽤简称template_code => 'CUXAPPMBL', -- 模板简称
template_language => 'ZHS',--语⾔
template_territory => 'ZHS', --地区 CN
output_format => l_output_format);--格式 PDF、RTF
3.7.2 提交标准请求
1.定义⽤于提交标准请求的功能
表单选择标准表单:运⾏报表
参数:
TITLE="" CONCURRENT_PROGRAM_NAME="CUXRMPDNC2"
PROGRAM_APPL_SHORT_NAME="CUX"
2.在FORM中提交标准请求
Eg:
fnd_function.execute(function_name => 'CUX_FNDRSRUN_RMP_DNC_DATA', open_flag => 'Y',
session_flag => 'Y',
other_params => 'char1="' ||
to_char(l_sr_instance_id_v) || '"' ||
'char2="' || to_char(l_p_resp_id_v) || '"' ||
'char3="' ||
to_char(l_organization_id_v) || '"' ||
'char4="' || l_plan_mode_v || '"' ||
'char5="' || to_char(l_rm_plan_id_v)
|| '"');
3.7 功能定义时定义参数
格式:param_name=value
当有多个参数时,⽤空格隔开:param1=value1 param2=value2 …
在fmb⽂件的Parameters中定义该参数。

3.8 设置ITEM初始值为当前⽇期
Initial value:$$DATE$$
ORACLE Form提供了六个特殊的和⽇期、时间有关的系统变量:
$$DATE$$、$$TIME$$、$$DATETIME$$
$$DBDATE$$、$$DBTIME$$、$$DBDATETIME$$
前三个⽤于获取客户端操作系统的当前⽇期和时间
后三个⽤来获取数据库所在服务器的当前⽇期和时间。

相关文档
最新文档