ebs form开发总结
ORACLE EBS FORM二次开发整理

一、开始开发标准FORM1.输出不必要的BLOCKNAME,DETAILBLOCK。
(包括数据块,画布,窗口)2.修改触发器:PRE-FORMFND_STANDARD.FORM_INFO(版本号,名称,模块,日期,作者);APP_WINDOW.SET_WINDOW_POSITIN(‘第一个窗口名称’,’FIRST_WINDOW’);FND_ORG.CHOOSE_ORG;――选择组织APP_WINDOW.SET_TITLE(‘窗体名称’,:_code);3.修改程序单元:app_customer:close_window4.编译f60gen module=/porcli/applmgr/1159/au/11.5.0/forms/ZHS/IAQTEST01.fmb userid=apps/simple4uoutput_file=/porcli/applmgr/1159/inv/11.5.0/forms/ZHS/IAQTEST01.fmxmodule_type=form batch=no compile_all=yesf60gen <Form Name> apps/<apps password>pre_insert, pre_update中加入代码:fnd_standard.set_who二、QUERY FIND 制作一.把APPSTAND 的QUERY FIND 对象组拉到开发的FORM上,选择子类。
二.在目的数据块的添加QUERY FIND (BLOCK LEVEL,注:可以从FORM LEVEL拷贝),然后修改代码app_find.query_find (block_window V ARCHAR2, --目的数据块find_window V ARCHAR2, --查询窗口find_block V ARCHAR2) --查询数据块4.在QUERY FIND里面添加文本项等查询内容。
OracleEBS学习经验总结

OracleEBS学习经验总结目录1、form中数据查询时给定where条件,过滤数据 (2)2、radio-button中给item动态修改属性 (2)3、FORM窗口关闭时报错 (2)4、Form中自定义导出excel (3)5、FORM中限制下限LOV可选数据必须大于上限已选值 (4)6、FORM中选中上限时,默认下限等于上限值 (4)7、按照固定字符分割字符串取其中某段 (4)1、form中数据查询时给定where条件,过滤数据show_window(需要跳转到的window,2,2); --窗口调用函数,窗口名称,和坐标位置GO_BLOCK(指定数据块); --跳转数据块名称------3拼接where条件sql,单引号用’’’’四个单引号来转换,并且数据字段和变量都要用单引号括起来,也可以用三个引号代替where_cause := ' STUNO = '||''''||变量1||’’’’||’and ’;相当于where cause :STUNO = ‘变量1’ andwhere_cause := ' STUNO = '''||变量2||’’’and ’; 相当于where cause :STUNO = ‘变量2’and-----4执行sqlset_block_property('指定数据块',DEFAULT_WHERE,where_cause); --给数据块增加where 条件,将上面的where条件赋值给要查询的数据块EXECUTE_QUERY; --结束2、radio-button中给item动态修改属性SET_ITEM_PROPERTY('指定item ',LOV_NAME,'指定LOV');--set_item_property给item设置属性,将固定的lov设置给某个item--设置ITEM属性NAVIGABLESet_Item_Property('Block_name.Item_name',NAVIGABLE,PR OPERTY_TRUE|FALSE);--设置ITEM属性VISUAL_ATTRIBUTESet_Item_Property('Block_name.Item_name',visual_attribute,' vname'); --'vname'由导航器中(VISUAL_ATTRIBUTES)定义--设置ITEM属性DISPLAYEDSet_Item_Property('Block_name.Item_name',displayed,TRUE| FALSE);--设置ITEM属性POSITIONSet_Item_Property('Block_name.Item_name',position,x,y);--设置ITEM_SIZESet_Item_Property('Block_name.Item_name',item_size,x,y);--设置ITEM属性LABLESet_Item_Property('Block_name.Item_name',LABEL,'MESSAG E')3、FORM窗口关闭时报错在程序单元中修改程序包主体if (wnd = 'MAIN_W') then --这个是必须改的,否则主窗口不能关闭app_window.close_first_window; --关闭函数elsif (wnd = 'SECOND_W') then --某个关闭报错的窗口if (wnd = get_view_property(get_item_property(:SYSTEM.CURSOR_ITEM, ITEM_CANVAS), WINDOW_NAME)) thengo_block(:PARAMETER.PREVIOUS_BLOCK_NAME); --关闭它跳转至其他数据块,直接写数据块name,也可以用系统参数获取数据块名称end if;elsif (wnd = '') then –可以增加自己需要的内容--defer relations--close related windowsnull;end if;4、Form中自定义导出excelDECLAREdb_file NUMBER;url VARCHAR2(500);c_filename VARCHAR2(20);BEGINc_filename := 'test.xls'; --文件名,导出excel格式文件,也可以是txt等多种格式--生成文件db_file := fnd_gfm.file_create(file_name => c_filename,content_type => 'text/tab-separated-values',--文本分隔符,导出数据将按照excel的格式自动分格program_name => 'SQLGL');--用到的application的短名-- 输出块里面的内容,输出语句比如fnd_gfm.file_write_line(db_file, 'Hellow World'||chr(9)||'haha'); -- 输出内容chr(9),tab 符号,用来分割数据db_file := fnd_gfm.file_close(db_file); -- 关闭文件-- 打开文件URLurl := fnd_gfm.construct_download_url(fnd_web_config.gfm_agent, db_file,FALSE); --打开一个页面用来下载文件/* 注意这里要选flase,否则函数会调用系统的环境变量,就不会生成你想要的文件和文件类型,其实拆开fnd_gfm包可以看到*/fnd_utilities.open_url(url);END;5、FORM中限制下限LOV可选数据必须大于上限已选值在LOV的SQL中加where条件,例如::BLOCKNAME.TO_TIEM >= :BLOCKNAME.FORM_TIEM6、FORM中选中上限时,默认下限等于上限值在上限item的触发器WHEN-VALIDATE-ITEM中增加内容,例如::MAIN_B.TO_PERIOD := :MAIN_B.FROM_PERIOD;7、按照固定字符分割字符串取其中某段REGEXP_SUBSTR(’某字符串’,'[^.]+',从第几个字符开始,取截取后的第几段)取科目段很方便SELECT REGEXP_SUBSTR(’01.002.0003.004’,'[^.]+',1,2) FROM DUAL;--'[^.]+'按照.小数点来分割字符串,如果是按照-来分就应该写成'[^-]+'--1表示从第一个字符开始,--2表示取第二段,三个点将字符串分为四段,第二段为002这个方法要求数据库是R12,在11中不能用。
Form开发小技巧

Oracle EBS Form 开发小技巧汇总本文记录了一些在Form 开发过程中积累下来的技巧:1. Form 中提交并发请求2. 非数据库字段查询处理3. 控制Form 为只查询4. 控制Item 的属性5. Trigger 的执行层次6. 按钮处理逻辑7. 日历相关1,Form 中提交并发请求在提交请求之前,首先需要验证块,如果某些必填项没有填的话当然不能提交请求。
?[Copy to clipboard]View Code PLSQL1 2 3 4 5 6 7 APP_STANDARD .APP_VALIDATE (BLOCK_SCOPE ); IF (not FORM_SUCCESS ) THENRaise form_trigger_failure ; END IF; IF :SYSTEM .FORM_STATUS = 'CHANGED' THENDO_KEY ('COMMIT_FORM'); END IF;第二个IF 语句判断系统状态,如果用户更新了一行记录,之后没有保存提交请求,那么需要在提交之前进行保存,因为可能使用的请求中使用到了该item 所对应的后台字段,那么保存这一步就很重要了。
调用请求的例子:?[Copy to clipboard]View Code PLSQL1 2 3 4 56 7 8 9 l_request_id := fnd_request .submit_request( 'XXPO','XXPO_JIT_BATCHES_RPT_SECOND','','',FALSE, :SUBJOBS .SUB_JOB_BATCH ,CHR (0)--CHR (0)表示参数结束 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,101112131415161718192021222324 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); --如果请求提交出错将会返回0 if l_request_id > ; 0 thenif NOT app_form .quietcommit thenfnd_message .debug ('conc request submited failed'); raise FORM_TRIGGER_FAILURE ;end if;fnd_message .set_name ('FND', 'CONC-SUBMITTED REQUEST'); fnd_message .set_token ('REQUEST_ID', to_char (l_request_id ));fnd_message .show ; end if;请求运行结束以后,可能还需要对Block 进行重新查询,这个由具体情况而定。
OracleEBSForm开发Tips

OracleEBSForm开发TipsEBSForm开发中经常会遇到一些小问题,以免再次遇到而不记得什么原因,在此记下,如有新的问题,亦在此继续更新...1.带有stacked canvas 的Form,比如content canvas A,stacked canvasB,这两个canvas在WINDOW M上,当光标移动到A的最后一个Item(例如z)的时候,Bcanvas消失了(可以用Tab 键移动光标至它,即显示)。
Cause: B和A.z发生的互相遮盖,即有重叠区域。
Solution: 将Item间距离拉大一些。
1-1)有时候还会发现某一个stackedcanvas没有显示出来,在树状结构中把canvas的排列顺序调整一下(最好把item的顺序也调整一下,因其也会有影响),content在前,后面跟stacked A,stacked B。
1-2)一个content canvas(Main),两个stackedcanvas (A&B),发现只显示了content canvas上的item。
Cause: 由于是在测试,B上还没有内容,只选择了view stacked canvasA。
症状是A的内容不显示,只是用TAB键的时候才会把A切换出来。
造成这个的原因是B虽然没有显示,但是也是存在的,且是较大片空白,盖住了A。
--shit...1-3)有时候view--stacked canvas,选中了要显示的stackedcanvas,却不见其显示出来,看下stacked canvas的视图端口高度和宽度是否为0。
2.在Form中使用LOV时,LOV的Record Group 中的语句不要有用'--'Mark掉的东东在里面,如果有的话,'--'后面的所有语句都会被mark掉,因为Record Group的Query语句会全部被放在一行中。
切记3.Set_item_instance_property() 用来改变一列中的某个的属性,如显示特殊颜色等4.复选框背景色及前景色无法显示成canvas底色、白字。
常用ORACLEEBSFORM二次开发常用总结

1.锁住当前行Set_ltem_ In sta nce_Property('ma in .import_flag',CURRENT_RECORD,UPDATE_ALLOWED,PROPERTY_OFF);用在 WHEN-NEW-RECORD-INSTANCE 或者 POST-QUERY 中。
同:app_item_property.set_property('MAIN.REF_COST',ALTERABLE,PROPERTY_ON);2.设置记录的颜色app_record.highlight('RED_REC');3.窗口居中app_wi ndow.set_wi ndow_positio n( 'WINDOW_NAME','CENTER');4.最大化窗口时自动扩展文件夹数据块在WHEN-WINDOW-RESIZED 中添加以下代码即可。
if :system.eve nt_window in ('MAIN') the napp_folder.eve nt('WHEN-WINDOW-RESIZED');end if;5.Form中调用forms基本参数方式FND_FUNCTION.EXECUTE(FUNCTION_NAME=>'CUXSOSETUP',OPEN_FLAG=>'Y',SESSION_FLAG=>'Y',OTHER_PARAMS=>NULL);其它参数传入OTHER_PARAMS 即可。
6.动态设置当前行指定列的必输属性Set_ltem」nstance_Property(item_name, CURRENT_RECORD, REQUIRED,PROPERTY_TRUE); 如: if :CUX_W0RKH0UR_EMP.ATTRIBUTE2 <> :CUX_W0RKH0UR_EMP.ATTRIBUTE1 the nSet_Item」n sta nce_Property('CUX_WORKHOUR_EMP.MODIFY_REASON', CURRENT_RECORD,REQUIRED,PROPERTY_TRUE);if :CUX_WORKHOUR_EMP.MODIFY_REASON is n ull the n:CUX_WORKHOUR_EMP.MODIFY_REASON := '123';:CUX_WORKHOUR_EMP.MODIFY_REASON := null ;fnd_message.set_stri ng('请输入调整原因.');fnd_message.show;end if;elseif :CUX_WORKHOUR_EMP.ATTRIBUTE4 = :CUX_WORKHOUR_EMP.ATTRIBUTE3 the nSet_Item」n sta nce_Property('CUX_WORKHOUR_EMP.MODIFY_REASON',CURRENT_RECORD, REQUIRED,PROPERTY_FALSE);end if;end if;7.增加菜单在 FORM 级的 when-new-form-instanee8.LOV指定初始值后需在 WHEN-NEW-RRECORD-INSTANCE 用以下语句模拟验证,否则会弹出验证框•代码如下: app_item_property.set_property('DETAIL_D.DEMAND_STATUS_DESC',ITEM」S_VALID,property_o n);。
EBS中报表使用总结

Oracle EBS中报表使用总结作者: 曾燕创建日期: 2008年12月21日最近修改日期:文档编号:版本: 1.0审批人:审批人1审批人2拷贝数_____文档控制更改记录浏览者分发目录综述 (4)系统标准报表 (4)Oracle FSG报表 (5)定义行集 (5)定义列集 (7)定义报表 (11)二次开发报表 (12)报表数据源 (12)报表模板 (19)小结 (31)结束语 (32)iii hand仅限于内部使用(v. 1.0 )综述EBS中运用到的报表,通常有三类:一是系统标准的报表,二是FSG生成报表,即根据客户需求在系统中定义的报表,三是二次开发的报表。
下面就结合我在项目中遇到的情况,谈谈这三种报表。
系统标准报表顾名思义,不需要我们干涉的,使用的时候直接提交请求就可以,如下面这个总账模块的科目表–明细列表。
运行效果:hand 仅限于内部使用 (v. 1.0 )5Oracle FSG报表在系统标准报表的基础上,我们可以根据客户化需求,利用报表生成器生成报表,在项目中使用了总帐模块的FSG ,此类报表有三个步骤,即定义行集,列集,最后定义报表,关联之前定义的行集和列集。
现在以松下GPSC 项目一个客户化的多步式损益表为例进行说明。
定义行集(N)总账超级用户→报表→定义→行集,如下图,选择定义行勾上显示行与显示零,那么当这行的数值为零的时候也会显示。
对该行需要显示数据的操作主要有两种:账户分配与计算。
点击账户分配。
账户分配是把指定账户(通常由客户指定)的金额以明细或汇总的方式显示出来,取决于显示的选项,E为展开,则明细显示账户金额,T为合计,则只显示账户汇总的金额,B 为E,T二者兼有。
另外,标志一栏,正号表示包含,负号表示排除。
在此,销售收入是收入类账户,属于贷方,其在账户中记录的金额为负数,所以活动一栏需选择贷项,这样得到的才是正数。
反之,借方账户就选择借项或者净。
如下图:除了账户分配之外,更简洁的行定义就是计算,如毛利(Gross Profit)为销售收入减去销售成本,即之前定义的10-20。
ORACLEEBSFORM二次开发整理

ORACLEEBSFORM二次开发整理一、开始开发标准FORM1.输出不必要的BLOCKNAME,DETAILBLOCK。
(包括数据块,画布,窗口)2.修改触发器:PRE-FORMFND_STANDARD.FORM_INFO(版本号,名称,模块,日期,作者);APP_WINDOW.SET_WINDOW_POSITIN(‘第一个窗口名称’,’FIRST_WINDOW’);FND_ORG.CHOOSE_ORG;――选择组织APP_WINDOW.SET_TITLE(‘窗体名称’,:/doc/0117636799.html,_code);3.修改程序单元:app_customer:close_window4.编译f60genmodule=/porcli/applmgr/1159/au/11.5.0/forms/ZHS/IAQTEST0 1.fmb userid=apps/simple4uoutput_file=/porcli/applmgr/1159/inv/11.5.0/forms/ZHS/IA QTEST01.fmxmodule_type=form batch=no compile_all=yesf60genapps/pre_insert, pre_update中加入代码:fnd_standard.set_who二、QUERY FIND 制作一.把APPSTAND 的QUERY FIND 对象组拉到开发的FORM上,选择子类。
二.在目的数据块的添加QUERY FIND (BLOCK LEVEL,注:可以从FORM LEVEL拷贝),然后修改代码app_find.query_find (block_window V ARCHAR2, --目的数据块find_window V ARCHAR2, --查询窗口find_block V ARCHAR2) --查询数据块4.在QUERY FIND里面添加文本项等查询内容。
在EBS-FORM中开发工作流

在EBS-FORM中工作流在EBS中如果需要对某些审批的业务进行审批工作流的二次开发,则需要进行客户化WORKFLOW的流程,然后在EBS-FORM中启用。
在这里,就不具体说明如何使用WF-BUILDER工具进行工作流的开发,此文档主要用来说明及解决在FORM中如何触发一个工作流以及在FORM中如何关闭一个工作流1 在FORM中启用一个工作流:原则:与执行SQL一样,重点在于工作流的程序包的脚本,由于FORM本身直接支持执行SQL的语法,所以,可以在FORM中特定收件人等参数。
/******************以预留单审批为例******************/--此代码具有客户化的TABLE,只能作为参考,不能直接使用create or replace package RESERVESWF_C isG_INFO varchar2(2000);G_id varchar2(20);G_PROFITRATE Number;G_error Varchar2(2000);-- 到预留单取消报表 得到当前审批单据的详细信息 并以HTML的格式显示Procedure write_yl_c_doc(document_id IN VARCHAR2,display_type IN VARCHAR2,document IN OUT VARCHAR2,document_type IN OUT VARCHAR2);Procedure judge_status_c(itemtype IN VARCHAR2,itemkey IN VARCHAR2,actid IN NUMBER,funcmode IN VARCHAR2,resultout OUT VARCHAR2);Procedure create_process(g_tb_id VARCHAR2,send_user varchar2);end RESERVESWF_C;create or replace package body RESERVESWF_C is/**工作流的逻辑判断,用来决定数据走向**/Procedure judge_status_c(itemtype IN VARCHAR2,itemkey IN VARCHAR2,actid IN NUMBER,funcmode IN VARCHAR2,resultout OUT VARCHAR2)IsL_flag VARCHAR2(1);Beging_id := wf_engine.Getitemattrtext(itemtype,itemkey,'ID');If funcmode = 'RUN' ThenSelect nvl(status,1) Into L_flag From RESERVED_ORDER Where RESERVED_ID = g_id;-- 状态(1 正常 2 审批中 3 审批通过 4 审批未通过 5 关闭)-- 只有状态为1 的单据才可能提交审批If L_flag <> '5' Thenresultout := 'CONTINUE';Elsif l_flag='5' thenresultout :='5';End If;End If;ExceptionWhen Others ThenNull;End judge_status_c;/***工作流显示的HTML内容***/Procedure write_yl_c_doc( document_id IN VARCHAR2,display_type IN VARCHAR2,document IN OUT VARCHAR2,document_type IN OUT VARCHAR2)Isn number:=1;L_customers_name varchar2(200);L_reserved_man varchar2(200);L_create_date varchar2(200);L_RESERVED_END_DATE varchar2(200);L_STATUS varchar2(200);L_ERP_CODE varchar2(200);L_RESERVED_TYPE varchar2(200);l_CREATER varchar2(20);l_MEMO varchar2(2000);BeginIf display_type = 'text/html' Thenselect customers_name,reserved_man,to_char(create_date,'yyyy-mm-dd'),to_char(RESERVED_END_DATE,'yyyy-mm-dd'),STATUS,ERP_CODE,RESERVED_TYPE,CREATER,MEMOintoL_customers_name,L_reserved_man,L_create_date,L_RESERVED_END_DATE,L_STATUS,L_ERP_CODE,L_RESERVED _TYPE,l_CREATER,l_MEMOfrom RESERVED_ORDER where RESERVED_ID=document_id;beginselect L_LIST into L_RESERVED_TYPE from setpar where L_FORM_BLOCK='RESERVED_TYPE' and L_VALUE=L_RESERVED_TYPE;exception when others then L_RESERVED_TYPE:=' ';end;beginselect L_LIST into L_STATUS from setpar where L_FORM_BLOCK='Reserved_order.status' and L_VALUE=L_STATUS;exception when others then L_STATUS:=' ';end;document := '<table width=100% border=1 bordercolor=red>';document:=document||'客户名称:'||L_customers_name||'   经手人:'||L_reserved_man||'   创建日期:'||L_create_date||'   预留到期日期:'||L_RESERVED_END_DATE||'   ERP订单编号:'||l_ERP_CODE||'   预留类型:'||L_RESERVED_TYPE||'   录入人:'||l_CREATER||'   审批意见:'||l_MEMO;document:=document||'<tr><td>序号</td><td>产品编码</td><td>预计出货日期</td><td>数量</td><td>预留货物状态</td><td>备注说明</td></tr>';For iLoop In(SELECT product_number, TO_CHAR(out_date,'YYYY-MM-DD') OUT_DATE,nvl(QTY,'0')qty,NUIT,reserved_status,nvl(REMARK,' ') REMARK from V_YL_QRY_DOC whereRESERVED_ID=document_id) LOOPdocument := document || '<tr>';document := document || '<td>';document := document || n;document := document || '</td>';document := document || '<td>';document := document || iLoop.product_number;document := document || '</td>';document := document || '<td>';document := document || iLoop.OUT_DATE;document := document || '</td>';document := document || '<td>';document := document || iLoop.QTY;document := document || '</td>';document := document || '<td>';document := document || iLoop.reserved_status;document := document || '</td>';document := document || '<td>';document := document || iLoop.REMARK;document := document || '</td>';document := document || '</tr>';n:=n+1;End Loop;document := document || '</table>';End If;document_type := display_type;End write_yl_c_doc;/******************** 启动工作流,参数说明 预留单号,申请提交人**************************/Procedure create_process(g_tb_id VARCHAR2,send_user varchar2)Isg_item_type Varchar2(20) := 'RESER_C'; -- workflow的文件名称g_item_key Varchar2(20);g_process Varchar2(20) := 'RESER_C_PROCESS'; -- wf 的process名称--g_send_name Varchar2(20);--g_appr_name Varchar2(20);g_textname wf_TabTyp;g_textval wf_engine.TextTabTyp;g_numname wf_TabTyp;g_numval wf_engine.NumTabTyp;role_id varchar2(100);l_send varchar2(20);l_create varchar2(20);l_temp VARCHAR2(100);l_sqlerrm varchar2(2000);Beging_id := g_tb_id;If g_id Is Null Theng_id := 1;End If;l_send:=send_user;-- 得到SARTUP WF的一个唯一值Select wf_s.Nextval Into g_item_key From dual ;g_item_key := g_item_type || g_item_key;g_textname(1) := 'SENDER'; --预留单申请人g_textname(2) := 'ID'; -- 需要审批单据号g_textname(3) := 'CREATE'; -- 预留单录入人g_textval(1) := l_send;g_textval(2) := g_id;-- 记录WORKFLOW的IDselect CREATER_CODE into l_create from RESERVED_ORDER where RESERVED_ID=g_id;g_textval(3) := l_create;--判断预留申请人与预留录入人是否一致 一致的话,消息只发送一遍if g_textval(1)=g_textval(3) theng_textval(3):='null';end if;--insert into t values('RESERVESWF_C commit');wf_engine.CreateProcess(g_item_type,g_item_key,g_process);wf_engine.SetItemAttrTextArray(g_item_type,g_item_key,g_textname,g_textval);-- wf_engine.SetItemAttrNumberArray(g_item_type,g_item_key,g_numname,g_numval);wf_engine.SetItemAttrDocument(g_item_type,g_item_key,'DOC','PLSQL:RESERVESWF_C.write_yl_c_ doc/' || g_id);wf_engine.SetItemAttrDate(g_item_type,g_item_key,'RIQI',Sysdate);wf_engine.StartProcess(g_item_type,g_item_key);Commit;ExceptionWhen Others Thennull;l_sqlerrm:=sqlerrm;--dbms_output.put_line(Sqlerrm);End create_process;end RESERVESWF_C;workflowbuild界面编辑流程设计界面2 在FORM中如何关闭一个工作流响应需求:在工作流管理列表中进入FORM中进行审批完成后,不想再在工作流管理列表中对当前的工作流进行关闭。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.前言这是在深航2期项目期间学习form的过程中总结出来的一些东西,但内容比较零散,不包含form开发的完整过程。
1.开发规范1.1 命名规范文件命名:一般将源码放在….\SVN\05.客户化开发\05.源代码\ 目录下,文件的格式参考该目录下的代码包模板:开发编号-开发项名称文件夹,该文件夹命名如:EAM010_资产报废计划EAM代表模块,010和资产报废计划是由开发文档给出,不需要自己取编号。
路径:05.源代码\代码包模板:开发编号-开发项名称\SZAXXXXX\code 中,SZAXXXXX 也有自己的命名规范,一般取表名称的前6个字符,即应用名+模块名,在取表名后的5-6字符作为后缀,例如:表名是SZA_EAM_RETIRE_PLAN ,则取SZAEAMREPLAN,该文件夹名称与form名称保持一致。
SVN模板目录:Sql :注册弹性域的plsql代码块,名称与表名一致Table :建表脚本View :建视图脚本Pck : 基于视图的增删改form,在hss_public_util程序包中,Table_Handle_Pkg这个过程生成的代码要在数据库中执行,并且代码保存在package文件夹下,并以.pck保存。
Form_Table_Handle这个过程是要放在form中Form规范1.Form的命名:例如表名SZA_INV_TST_DOC_TYPES,选取前6个字符SZAINV,加上后面字符串的5-6个字符,SZAINVTSTDOCTP.2. 块名命名:SZA_INV_TST_DOC_TYPES选表中间字段TST_DOC3.窗口查询的块QUERY_FIND 的名称:块名+QF,对应的FIX和STK画布名字也要保持一致,但是QUERY_FIND触发器名称不能修改。
4.在ebs上注册表单,功能,弹性域时,form表单,功能和弹性域名称:SZA INV:+中文解释,例如:SZA INV:单据类型定义。
因为这些名称都是用户在查找时给用户看的。
5. 在窗口查询中,一般用id来作为查询字段,一般在id字段建立索引,查询速度更快,所以应该有消除依赖的代码6. LOV的显示:id字段一般不显示出来,可以设置id字段的display width为0即可。
2.常用开发组件和功能1.无TAB的Folder功能一般情况下,将不随横向滚动条移动的列放置在FIX画布上,变成固定列,固定列是没有拖动效果的。
画布:MAIN ,FOLDER_FIX ,FOLDER_STK第一步:使用data block wizard创建块第二步:ROW_ID项的子类名设置为ROW_ID。
其他需要显示在画布上的项设置子类, 另设置显示在STK画布上的属性:第三步:将数据块中显示在STK上的项复制到PROMT块中,并设置数据块中的trigger(模提示项的item type为display,子类为FOLDER_PROMT_MULTIROW第四步:在when-new-form-instance初始化form。
使用app_folder.define_folder_block如果用到了FIX画布,需要使用参数8第五步:在画布上调整布局设置块的Scrool Bar Canvas在fix画布上注意:第六步:在WHEN-WINDOW-RESIZED触发器内if :system.event_window in ('MAIN','DOC','TXN_DETAILS') thenapp_folder.event('WHEN-WINDOW-RESIZED');end if;2.TAB页的Folder功能原理:与无tab页不同就是创建画布时,我们会选择创建一个tab_canvas类型的画布假如你要显示的item都来自一个block,则我们只需要一个fix画布;如果画布上的item 来自多个block,则需要多个fix画布。
我们通过when-tab-changed触发器和show_view (hide_view)来控制画布的显示与隐藏2.1 首先要创建类型为Tab的画布,在画布下添加两个子类为Tab_page的画布,注意的是最好使得这两个画布的名称和将来放在两画布上的stacked画布名称一致。
如下图左2.2 画布建好以后,我们来看如何布局。
首先将MAIN_TAB画布,堆叠在MAIN画布上,再将图中TAX画布(fix和stacked画布)和BASE 画布(同上)堆叠在MIAN_TAB画布,尽量保持TAX和BASE重合,就是说x和y坐标相同。
2.3 接下来就是在form builder中写显示和隐藏的代码FORM级的WHEN-TAB-PAGE-CHANGEDhide_main_tab.txt show_main_tab.txt go_tab_first_item.txt以下的两个过程是为了防止bug参考(\桌面\ebs常用文档大全\FOLDER)3.说明性弹性域第一步:在实际开发中(暂时做过的项目中),会提供给你注册的plsql块(保存在sql 中),执行后,就会在ebs中注册。
第二步:在数据块中创建item,取名DF,类型text item,子类TEXT_ITEM_DESC_FLEX第三步:在DF项下,创建两个触发器WHEN-VALIDATE-ITEM --override代码:FND_FLEX.EVENT(‘WHEN-VALIDATE-ITEM’)WHEN-NEW-ITEM-INSTANCE --before代码:FND_FLEX.EVENT(‘WHEN-NEW- ITEM-INSTANCE’)第四步:修改DF所在数据块的trigger,添加完成后初始化弹性域添加此代码:FND_FLEX.EVENT( ‘ ..’)使用fnd_descr_flex.define初始化弹性域第五步:启用弹性域1.先是查找出注册好的弹性域2.进入段设置界面Open 弹性域3.然后保存4.最后保存。
4.关键性弹性域下面讲解的是核算科目账户对应的键弹性域的创建方法4.1创建三个item项,设置相应属性CODE_COMBINATION:显示项(称为账户项),字段长度设置2000,显示核算科目的数字组合。
LOV为ENABLE_LIST_LAMP, 验证为NOCOMBINATION_DESC:显示项,字段长度设置2000,显示核算科目的中文描述组合GL_CCID:数据库表项,存储的是核算科目对应的ID4.2为账户项添加两个触发器WHEN-NEW-ITEM-INSTANCE : 触发器执行层次设置为BeforeWHEN-VALIDATE-ITEM为两个触发器添加代码: fnd_flex.event('WHEN-NEW-ITEM-INSTANCE');4.3为这三个item所在的block块添加触发器PRE-QUERY POST-QUERY PRE-INSERT PRE-UPDATE WHEN-VALIDATE-RECORD触发器代码:fnd_flex.event('PRE-INSERT');4.单选框和复选框Value when Checked:YValue when Unchecked:NCheck Box Mapping of Other Values:Unchecked 因为复选框除了选中,被选中外,还有一个null值状态,所以要设置null状态下的值是多少。
获得复选框的值:块名.复选框名–> Y or N单选框:是一个单选组,组里有单选按钮单选组:子类---Radio Group单选按钮:子类---Radio ButtonRadio Button Value—这个属性必须有值5.手电筒窗口查询1.打开一个模板APPSTAND,将Object Groups下的QUERY_FIND对象拖到自己的form中,点击copy。
将在block,canvases,windows下生成对应名称为QUERY_FIND的对象。
2. 将new 和find按钮,QUERY_FIND数据块下的key-nxtblock代码修改New:新建的数据块名称Find:查询的数据块名称key-nxtblock:查询数据块的名称3.设置query_find查询块的属性为主界面块,这样关闭query_find的时候,就会显示主界面块。
4.在主界面块内创建query_find触发器,名称不能修改,添加如下代码:App_find.query_find(main_win,query_find_win,query_find_block);参数1:main_win—查询窗口显示在哪个窗口上参数2:query_find_win ---查询窗口界面对应的窗口参数3:query_find_block –查询窗口对应的块名称5.在主界面块中的pre-query内添加查询代码Copy ,app_find.query_range等6.主界面块的when-new-record-instace触发器Execution Hierarchy 设置为After注意:在其他窗口上调用出手电筒若该窗口有两个块。
则在两个块上建立query_find触发器,代码为app_find.query_find6.菜单栏通过这种方法来设置菜单的名称(when-new-form-instance)fnd_message.set_name('SQLSZA','SZA_PA_010_BUDGET_CHECK')/*;消息内容:预算检查(&B)*/ app_special.instantiate('SPECIAL1',fnd_message.get);app_special.disable('SPECIAL1');--使菜单灰显(失效)app_special.enable('SPECIAL1');--启用菜单7.主从块7.启用功能8.行指示器打开记录1).更改行指示器的子类,如图2.在Item触发器when-item-instance内CURRENT_RECORD_INDICATOR名称改成DRILLDOWN_RECORD_INDICATOR三.Form开发中常用的技巧1.关闭窗口如何正确的关闭非主窗口(A是主窗口块,B是非主窗口块)在APP_CUSTOM.close_window这个过程内,if语句内注册window的关闭事件,代码为clear_block;go_item(‘A.Item_name’);第二种方法是:设置B的previous navigate block为A,建议使用在form触发器WHEN-WINDOW-RESIZED中的代码作用:folder能否随着窗口大小变化而变化。