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中进行审批完成后,不想再在工作流管理列表中对当前的工作流进行关闭。
ebs form开发总结

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:单据类型定义。
Oracle_EBS_Form_触发器学习大全

Oracle_EBS_Form_触发器学习大全Oracle EBS Form Trigger学习大全打开,关闭,创建,更新记录的trigger次序PRE-……在进入一个form,或是导航到一个新的block时触发,PRE-……系列的触发器一般是在WHEN-NEW-……-INSTANCE系列之前,它们如果失败了的话,就不能成功导航到下一个对象了,只能留在当前的位置。
在这些触发器里可以设置一些判断条件来限制是否可以导航到新的位置。
WHEN-NEW-……-INSTANCE这一类的trigger都是当鼠标光标每次落到一个新的block,record,item上时触发的,而且就算失败了,也不会发生什么错误。
但是when-new-form-instance,只有当form 启动时,光标导航到第一个导航块的第一个导航item时触发,如果一个应用有多个form,当光标在各个form之间转换时,并不会触发它。
POST-TEXT-ITEM和WHEN-VALIDATE-ITEMPost-text-item的触发点:当输入的光标从一个Text-Item 转到其它item,可以用它来改变item的值,而when-Validate-item虽然也是在离开前触发,但是作用不同,Post-Text-Item本身是没有验证的,when-Validate-item可以用来补充一些验证(除了form本身的验证),但是当form验证成功以后,会把item标志为…valid?,而不会再去验证了,如果这时我们再去修改它的值,那么就有可能会把无效的值导入到数据库。
在创建和更新一条记录时,先触发when-Validate-item,再触发Post-T ext-Item,然后是when-Validate-record。
POST-……系列的都是离开当前的block,record,item时触发的WHEN-WINDOW-ACTIVATED做原材料属性修改平台时,第一次使用这个触发器,用来从另一个window返回时,刷新当前window,代码写在了这个触发器里。
关于EBS财务系统form开发出错总结

关于EBS财务系统form开发出错总结
编译语句
frmcmp_batch $AU_TOP/forms/ZHS/*****(⽂件名).fmb apps/apps output_file=$CUX_TOP/forms/ZHS/*****(⽂件名).fmx
form表单关闭不了的问题
程序单元APP_CUSTOM中的将if (wnd = '<your first window>') then app_window.close_first_window;
改为if (wnd = '窗⼝名') then app_window.close_first_window;
注:单引号内只写窗⼝名,不能有尖括号或其他单词
form表单显⽰问题
在创建画布时,视图要与画布重叠视图/显⽰画布,显⽰视图
form⽂本框选择不上
在创建LOV时,第四步,必须填上返回值,否则在EBS中,⽂本框只能⼿动输⼊,LOV列表选择不上
标识符⽆效
不管是⽤按钮查询还是F11查询,查询报错“某某某标识符⽆效”,原因是form的项名与表中的字段名不匹配,修改表的字段或者修改form 的项,必须⼀致
查看已有表单的form原fmb⽂件
在ebs中帮助-----关于Oracle Applications-----找到表单的form名、路径,提取
设置⽂本框内容显⽰位置
属性选项板-----功能性------对齐。
EBSForm弹性域开发和实现时的概念

EBSForm弹性域开发和实现时的概念EBS Form弹性域开发和实现时的概念(版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处;否则请与本人联系,违者必究)分段(Segment)对于关键性弹性域,一个分段就是完整编码中单个的一块。
对于描述性弹性域,一个分段就是实体的单个的字段或者单个的属性。
一个分段代表了表中单个的列。
组合(Combination)对于关键性弹性域,一个分段值的组合组成了完整的编码或者主键。
当自定义关键性弹性域的时候,你可以定义带有简单交叉验证规则的有效组合。
有效组合的分组可以用范围来表示。
结构(Structure)弹性域的结构是弹性域分段的一个特别的排列。
结构的大小依赖每个单独的弹性域。
一个弹性域可能有一个或者多个结构。
关键性弹性域和描述性弹性域都可以有多于一个的结构。
用户可以根据需要来定制结构。
组合表(Combinations Table)对于关键性弹性域,是在你的应用中用来存储关键性弹性域分段值有效组合的数据库表。
每个关键性弹性域必须有一个组合表。
它包含每个弹性域分段对应的列,以及其它的列。
也就是你用作实体表的那个表。
组合Form(Combinations Form)对于关键性弹性域,一个组合Form就是其基础表(或者视图)是组合表的那个Form.组合Form存在的唯一目的是用来维护组合表.大多数关键性弹性域都有一个组合form,但也有一些关键性弹性域没有组合form。
没有组合form的关键性弹性域是由使用动态插入的其它form来维护的。
动态插入动态插入是插入一条新的有效的组合到关键性弹性域的组合表中,但是是从非组合form上插入的。
对于其组合表除了弹性域字段和WHO字段之外不包含必填字段的关键性弹性域,当你在设置关键性弹性域的时候,你可以选择允许动态插入。
如果你允许动态插入,用户可以使用弹性域窗口从非组合form输入新的分段值组合。
如果用户输入了满足交叉验证规则的新组合,弹性域就会被动态插入到组合表中。
Oracle EBS FORM 阶段总结--李桂钦

系统开发以及Oracle EBS 系统了解不够,另外,网上可查询的中文资料十分有限,幸 得许多资深的技术人员帮助,或耐心细心地答疑解惑,或不辞辛苦地循循善诱,着实 获益匪浅,特此感谢。
2.
基础知识................................................................................................................ 3
2.1. FORM 基础知识 ............................................................................................ 3 oracle EBS Form 界面 ....................................................................................................... 3 oracle EBS Form 运行原理................................................................................................ 3 oracle EBS Form 客户端浏览器工作模式......................................................................... 3 oracle EBS Form 源程序的组成元素 ................................................................................ 4 oracle EBS Form 源程序的组成元素层次关系 ................................................................. 5 oracle EBS Form 画布 ....................................................................................................... 6 oracle EBS Form 属性 ....................................................................................................... 7 oracle EBS Form 触发器 .................................................................................................. 8 oracle EBS Form 中内置的变量元素 ................................................................................ 9 oracle EBS Form 中内置的函数 ........................................................................................ 9 oracle EBS Form 中的导航.............................................................................................. 10 oracle EBS Form 中的事务.............................................................................................. 11 oracle EBS Form 多个Form开发..................................................................................... 12 oracle EBS Form 中DML编程......................................................................................... 13
EBS Form开发总结

Oracle ERPE-BUSINESS SUITE Form开发总结文档作者: 何云创建日期:2012-02-12更新日期:2015-02-10文档编码:MD070当前版本:1.1审批者:用户项目经理:信息部项目经理:外包方项目经理:文档控制1.1.更新记录1.2.审阅记录1.3.分发人员目录文档控制 ................................................................................................................................... i i1.1.更新记录 .................................................................................................................. i i1.2.审阅记录 .................................................................................................................. i i1.3.分发人员 .................................................................................................................. i i1.前言 (4)2.基本步骤 (5)2.1 环境设置 (5)2.2 新建fmb (5)2.3 添加对象 (5)2.4 建立主体对象 (6)2.5 初始化参数 (7)2.6 标准代码 (9)2.7 ITEM调整 (11)2.8 界面调整 (12)2.9 实现增删改锁 (13)2.10 手电筒查询 (18)2.11 上传编译 (19)3.常用功能 (20)3.1 TAB页Folder (20)3.2 弹性域 (23)3.3 LOV (25)3.4 Form个性化 (26)3.5 弹出窗口居中 (26)3.6 警告 (26)3.7 Onetime_where与Default_where (27)3.8 启动功能 (28)3.9 退出form (28)3.10 工具栏 (28)3.11 保存点及回滚 (29)4.其他功能 (30)4.1 消息等级 (30)4.2 颜色属性 (30)4.3 CASE_INSENSITIVE_QUERY (30)4.4 Clear_block (30)4.5 禁用历史记录 (30)5.附件 (32)5.1 触发器执行顺序 (32)6.参考资料 (33)1.前言在学习form的过程中,平时有在写一些关于form开发的笔记,不过内容都比较零散,没有归纳成一篇较为全面的总结文档。
form总结

基于Template的Form开发总结以下是我这次练习的整个过程纪录,以及我的心得体会:一.Oracle EBS的Forms,基本上都是从Template.fmb开始,该模版预先定义了:1、各种界面元素的属性集——子类2、常用的控件——日历、进度条3、一系列Form级触发器,统一处理各种未被明确处理的事件4、丰富的PLL库函数,大大超越了Forms Builder内置的函数所以,我们基于EBS的开发,当然也是从Template.fmb开始二.Form文件类型说明.fmb:源文件,目前是二进制格式,也可以转成早期版本的ASCII格式.fmx:可执行文件,类似VB的.exe文件,其也需要在Forms Runtime环境中运行.pll:库函数源文件,类似所有开发语言的库函数,如VC的.cpp文件.plx:库函数可执行文件三.从EBS服务器($AU_TOP/forms/US/)下载FMB文件到本地:TEMPLATE.fmbAPPSTAND.fmb从EBS服务器($AU_TOP/resource/)下载PLL文件到本地(可用全部下载):APPCORE.pllAPPCORE2.pllAPPDAYPK.pllCUSTOM.pllFNDSQF.pllFV.pllGHR.pllGLOBE.pllGMS.pllHRKPI.pllIGI_CBC.pllIGI_CC.pllIGI_CIS.pllIGI_DOS.pllIGI_EXP.pllIGI_IAC.pllIGI_MHC.pllIGI_SIA.pllIGI_STP.pllIGILUTIL.pllIGILUTIL2.pllJA.pllJE.pllJL.pllOPM.pllPQH_GEN.pllPSA.pllPSAC.pllPSB.pllVERT.pllVERT1.pllVERT2.pllVERT3.pllVERT4.pllVERT5.pll四.下载必要的文件到FORMS60_PATH对应的目录打开一个forms源文件,必须保证其直接引用、间接引用的fmb、pll文件均存在。
Oracle EBS Form 开发

自动生成的 Layout 可能栏位不适当, 可自行手动调整
Canvas : 所有的 Item 都必须在该范围内
View : 执行时所看到的实际大小
Form 完成
Form 完成后, 先在 Developer Form Builder 上 compiler 检查是否有语法错误。 在Form Builder中不能直接运行,必须挂到Application环境中
Path : (N)Application > (N)Function > Description
Application--- Form Setup 2
Path : (N)Application > (N)Function > Form
Application--- Form Setup 3
Path : (N)Application > (N)Menu 可以先在Responsibility中 找到对应需要挂的Menu,然后把Form挂到Menu下
Data Block Wizard
选择Data Block的Data source
Data Block Wizard
1. 添入Table or View的名字,或者点Browse选择 2. Refresh 出现该 Table or View 中所有的Column 3. 选择使用的 Column 按欲排列在画面的顺序选入右边 Database Items
Compiler Form
1. 2. 3. .fmb文件上传到Server Telnet/putty.exe 连接到Server,Login In 切换到 $AU_TOP/forms/US
Oracle_Ebs_开发总结

技术心得一、SQL查询:1、”列出同部门中工资高于1000的员工数量超过2人的部门,显示部门名字、地区名称”.查询语句如下:selectdistinct dept.department_name,loc.cityfrom employeesemp,departmentsdept,locationslocwhere emp.department_id=dept.department_idandfromwhereand)子,fromwhereandandhavingcount(*)>2对于groupby来说每一条emp.department_id必对应唯一dept.department_id、dept.department_name因此不论groupbydepartment_id还是groupbydepartment_name,loc.city达到的效果是一样的2、用一条语句查询出scott.emp表中每个部门工资前三位的数据:selectdepartment_id,max(salary)max_salary,max(decode(rank,2,salary,salary))mid_s alary,min(salary)min_salaryfrom(selectdepartment_id,salary,rankfrom(selectemp.department_id,emp.employee_id,emp.salary,row_number()over(partitionby emp.department_idorderbyemp.salary)asrankfromemployeesemp)EwhereE.rank<=3)groupbydepartment_idSQL%ISOPEN FALSE FALSE FALSE FALSESQL%FOUND TRUE有结果成功成功-20,999之间的参数.可在程序块中自定义异常,并捕捉在其他函数或存储过程中RAISE_APPLICATION_ERROR抛出的异常,与Oracle交互.4、PRAGMAAUTONOMOUS_TRANSACTIONORACLE8i可以支持事务处理中的事务处理的概念.这种子事务处理可以完成它自己的工作,独(2)不使用自动事务处理:CREATEORREPLACEPROCEDURE log_message(p_message varchar2)ASBEGININSERTINTO logtable VALUES(user,sysdate,p_message);COMMIT;END log_message;(select*fromtemp_table查询结果有数据)流程:1、以2、3、4、实例:1为’GL’)件:and'yyy y-mm-ddHH24:MI:SS'))and(to_date(p_End_Date,'yyyy-mm-ddHH24:MI:SS'));!!!注意’HH24:MI:SS’必不可少,因为请求程序要求的数据一定是带时分秒的数据否则解析报表时会报错.如下所示:**Starts**23-08-201111:53:42**Ends**23-08-201111:53:42ORA-01830:日期格式图片在转换整个输入字符串之前结束2、根据借方数量与借方金额求出借方单价同理求贷方单价,每发生一笔,统计当前数量与当前金额,然后得出当前数量当前总价与当前单价其中借方与贷方金额的获取,如:select(case cila.inv_typewhen'IN'then(case cila.type_codewhen'GL'thenACCOUNTED_DRwhen'AP'thenAP_ACCOUNTEDend)end3四、1即是多OUview_all_orgnization_flagFROMper_security_profilesWHEREsecurity_profile_id=to_number(fnd_profile.value(‘XLA_MO_SECURITY_PROFILE_LEVEL’));可以通过以下语句获取当前安全性配置文件和当前用户在当前职责下可访问的OU nazation_id,organization_id,nameFROMper_orgnazation_listper,Hr_operating_unitshrWHEREper.secutity_profile_id=to_number(fnd_profile.VALUE(‘XLA_MO_SECURITY_PROFILE_LEVEL’))nization_id=nization_idable_flagisnull;如我在CUX_INV_MATERIAL_ALL表中建立的Org_Id字段,可在策略函数中通过此字段产生Where 子句,筛选可操作客户化职责下物料维护菜单的OU.当用户进入YD_GL_ALL_总账超级用户职责时将初始化用户的上下文,通过MO_GLOBAL的一系列方法设置CONTEXT的值(包括访问模式和当前Org_Id)。
EBS-FORM开发

EBS-FORM开发Close_FORM('XX_FORM001');show_window('XX_FORM001',4,0.5);1:定义fnd_descr_flex.define(BLOCK => 'BLK_ROUTING_LINES',field => 'DESC_FLEX',appl_short_name => 'XX',desc_flex_name => 'XX_OM_INT_ROUTING_LINES');2:Message('Cannot delete master record when matching detail records exist.');RAISE Form_Trigger_Failure;go_block('BLK_ROUTING_HEADERS');hide_window('WIN_STEP');app_window.set_coordination('WHEN-WINDOW-CLOSED',:BLK_REP_STEP_CTL.COORDINATION_S TEP, 'R_ROUTING_HEADER_STEPS');3 设置弹出信息fnd_message.set_string(GET_ITEM_PROPERTY(p_item,PROMPT_TEXT)||' '||'can not be blank, please enter'||' '||GET_ITEM_PROPERTY(p_item,PROMPT_TEXT));fnd_message.show;RAISE form_trigger_failure;带有提⽰YES OR NOwin_nm := get_view_property(canvas_nm,WINDOW_NAME);FND_MESSAGE.SET_STRING('Do you want to save the changes you have made?');ln_quest_count := FND_MESSAGE.QUESTION( 'Yes','No','Cancel',NULL);IF ln_quest_count =1 THENDO_KEY('COMMIT_FORM');clear_block(no_validate);app_custom.close_window(win_nm);ELSIF ln_quest_count = 2 THENclear_block(no_validate);app_custom.close_window(win_nm);ELSENULL;END IF;5:Insert intoINSERT INTO ….EXCEPTIONWHEN OTHERS THENfnd_message.set_string(SQLERRM || ' : ' || SQLCODE);fnd_message.ERROR;RAISE form_trigger_failure6: UpdateUpdate….EXCEPTIONWHEN OTHERS THENfnd_message.set_string(SQLERRM || ' : ' || SQLCODE);fnd_message.ERROR;RAISE form_trigger_failure7: DeleteDELETE FROM XX_OM_INT_ROUTING_HEADERSWHERE routing_header_id = :BLK_ROUTING_HEADERS.routing_header_id; IF (SQL%NOTFOUND)THENRAISE NO_DATA_FOUND;END IF;8: lock_idPROCEDURE lock_rowISCURSOR c_row ISSELECT *FROM XX_OM_INT_ROUTING_HEADERSWHERE ROWID = :BLK_ROUTING_HEADERS.row_idFOR UPDATE OF routing_header_id NOWAIT;rec c_row%ROWTYPE;i NUMBER := 0;BEGINLOOPBEGINi := i + 1;OPEN c_row;FETCH c_rowINTO rec;IF (c_row%NOTFOUND)THENCLOSE c_row;fnd_message.set_name('FND','FORM_RECORD_DELETED');fnd_message.error;RAISE FORM_TRIGGER_FAILURE;END IF;CLOSE c_row;IF ec.ROUTING_HEADER_ID = :BLK_ROUTING_HEADERS.ROUTING_HEADER_ID) THEN RETURN; ELSEfnd_message.set_name('FND','FORM_RECORD_CHANGED');fnd_message.error;RAISE FORM_TRIGGER_FAILURE;END IF;EXCEPTIONWHEN app_exception.record_lock_exception THENapp_exception.record_lock_error(i);END;END LOOP;END lock_row;End;LOV返回⼀个值下拉List:例外处理问题有很多⼈喜欢在处理exception时,置为'null',应该说这是⼀个很不好的习惯,如果没有定义特定的exception,最起码应该把数据库的错误信息完整的报出来。
EBS_FORM权限控制总结

EBS_FORM权限控制总结1. 设置子功能TRNORD_SUBMTTRN_MANAGER(步骤按照PDF上面写)将子功能挂到对应的责任下时不用加说明,如下图2. 将设置的子功能挂到采购员职责所在的菜单下(注意提示名为空)3.在FORM中设置角色参数4.在PRE-FORM里面写下如下代码,根据当前的职责返回对应的角色参数值(后期判断回用到)代码:if (fnd_function.test('TRNORD_SUBMIT')) THEN:ER_ROLE := 'BUYER';END IF;IF (fnd_function.test('TRNORD_MANAGER')) THEN:ER_ROLE := 'MANAGER';END IF;5.首先在程序单元里写一个存储过程,我这里存储过程的名字是OPEN_BUTTON(触发器里调用)代码:PROCEDURE OPEN_BUTTON ISBEGINIF (:TRN_ORDER_HEADERS.order_status = 'NEW') thenset_item_property('TRN_CONTROL.SUBMIT_BUTTON',visible,property_true);set_item_property('TRN_CONTROL.SUBMIT_BUTTON',enabled,property_true);elseset_item_property('TRN_CONTROL.SUBMIT_BUTTON',visible,property_true);set_item_property('TRN_CONTROL.SUBMIT_BUTTON',enabled,property_false);end if;if( :TRN_ORDER_HEADERS.order_status = 'SUBMITTED') or (:TRN_ORDER_HEADERS.order_status = 'APPROVED') THEN set_block_property('TRN_ORDER_HEADERS_V',update_allowed,property_true);set_item_property('TRN_ORDER_HEADERS_V.ORDER_NUMBER',update_allowed,property_false);set_item_property('TRN_ORDER_HEADERS_V.ORDER_DATE',update_allowed,property_false);set_item_property('TRN_ORDER_HEADERS_V.DESCRIPTION',update_allowed,property_false);set_item_property('TRN_ORDER_HEADERS_V.VENDOR_NUMBER',update_allowed,property_false);set_block_property('TRN_ORDER_HEADERS_V',DELETE_allowed,property_FALSE);set_block_property('TRN_ORDER_LINES',update_allowed,property_FALSE);set_block_property('TRN_ORDER_LINES',DELETE_allowed,property_FALSE);set_item_property('TRN_CONTROL.SUBMIT_BUTTON',visible,property_true);set_item_property('TRN_CONTROL.SUBMIT_BUTTON',enabled,property_false);END IF;if( :TRN_ORDER_HEADERS.order_status = 'REJECTED') THENset_block_property('TRN_ORDER_HEADERS_V',update_allowed,property_FALSE);set_block_property('TRN_ORDER_LINES',update_allowed,property_FALSE);set_block_property('TRN_ORDER_LINES',DELETE_allowed,property_FALSE);set_item_property('TRN_CONTROL.SUBMIT_BUTTON',visible,property_true);set_item_property('TRN_CONTROL.SUBMIT_BUTTON',enabled,property_TRUE);END IF;if( :TRN_ORDER_HEADERS.order_status = 'CANCELLED') OR ( :TRN_ORDER_HEADERS.order_status = 'CLOSED') THEN set_block_property('TRN_ORDER_HEADERS_V',update_allowed,property_FALSE);set_block_property('TRN_ORDER_HEADERS_V',DELETE_allowed,property_FALSE);set_block_property('TRN_ORDER_LINES',update_allowed,property_FALSE);set_block_property('TRN_ORDER_LINES',DELETE_allowed,property_FALSE);set_item_property('TRN_CONTROL.SUBMIT_BUTTON',visible,property_true);set_item_property('TRN_CONTROL.SUBMIT_BUTTON',enabled,property_FALSE);END IF;END;6.在menu_p包里面写一个存储过程menu_judge来判断工具栏里面关闭、取消和打印订单状态的是否可用代码:PACKAGE BODY menu_p ISprocedure menu_init isbeginapp_special.instantiate('SPECIAL1','取消订单');app_special.instantiate('SPECIAL2','关闭订单');app_special.instantiate('SPECIAL3','打印订单');end menu_init;procedure menu_on isbeginapp_special.enable('SPECIAL1',property_on);app_special.enable('SPECIAL2',property_on);app_special.enable('SPECIAL3',property_on);end menu_on;procedure menu_false isbeginapp_special.enable('SPECIAL1',property_OFF);app_special.enable('SPECIAL2',property_OFF);app_special.enable('SPECIAL3',property_ON);end menu_false;procedure menu_judge isbeginif :TRN_ORDER_HEADERS.order_status = 'NEW' or :TRN_ORDER_HEADERS.order_status = 'CLOSED' OR :TRN_ORDER_HEADERS.order_status = 'CANCELLED' THENMENU_P.MENU_FALSE;ELSIF :TRN_ORDER_HEADERS.order_status = 'REJECTED' THENMENU_P.MENU_ON;ELSIF :TRN_ORDER_HEADERS.order_status = 'SUBMITTED' THENMENU_P.MENU_ON;app_special.enable('SPECIAL2',property_OFF);ELSEMENU_P.MENU_ON;app_special.enable('SPECIAL1',property_OFF);END IF;end menu_judge;END;7.在OPEN_BUTTON按钮下的触发器里加触发器WHEN-BUTTON-PRESSEDDECLAREV_HEAD_ID NUMBER;BEGINIF :TRN_ORDER_HEADERS.HEADER_ID IS NULL THENFND_MESSAGE.SET_NAME('CUX', '请选中某一行!');FND_MESSAGE.SHOW();RAISE FORM_TRIGGER_FAILURE;ELSEMENU_P.MENU_JUDGE;IF :ER_ROLE = 'BUYER' THENset_block_property('TRN_ORDER_HEADERS_V',insert_allowed,property_FALSE); set_block_property('TRN_ORDER_HEADERS_V',update_allowed,property_true); set_block_property('TRN_ORDER_HEADERS_V',delete_allowed,property_true); set_block_property('TRN_ORDER_HEADERS_V',query_allowed,property_true);set_ITEM_property('TRN_CONTROL.ADOPT_BUTTON',ENABLED,property_FALSE); set_ITEM_property('TRN_CONTROL.REJECT_BUTTON',ENABLED,property_FALSE); OPEN_BUTTON;ELSIF :ER_ROLE = 'MANAGER' THENset_ITEM_property('TRN_CONTROL.SUBMIT_BUTTON',ENABLED,property_FALSE);if( :TRN_ORDER_HEADERS.order_status = 'SUBMITTED') THENset_block_property('TRN_ORDER_HEADERS_V',update_allowed,property_TRUE);set_item_property('TRN_CONTROL.ADOPT_BUTTON',visible,property_true);set_item_property('TRN_CONTROL.ADOPT_BUTTON',enabled,property_TRUE);set_item_property('TRN_CONTROL.REJECT_BUTTON',visible,property_true);set_item_property('TRN_CONTROL.REJECT_BUTTON',enabled,property_TRUE);ELSEset_block_property('TRN_ORDER_HEADERS_V',update_allowed,property_FALSE);set_item_property('TRN_CONTROL.ADOPT_BUTTON',visible,property_true);set_item_property('TRN_CONTROL.ADOPT_BUTTON',enabled,property_FALSE);set_item_property('TRN_CONTROL.REJECT_BUTTON',visible,property_true);set_item_property('TRN_CONTROL.REJECT_BUTTON',enabled,property_FALSE);set_block_property('TRN_ORDER_HEADERS_V',insert_allowed,property_FALSE);set_block_property('TRN_ORDER_HEADERS_V',update_allowed,property_FALSE);set_block_property('TRN_ORDER_HEADERS_V',delete_allowed,property_FALSE);set_block_property('TRN_ORDER_HEADERS_V',query_allowed,property_true);set_block_property('TRN_ORDER_LINES',insert_allowed,property_FALSE);set_block_property('TRN_ORDER_LINES',update_allowed,property_FALSE);set_block_property('TRN_ORDER_LINES',delete_allowed,property_FALSE);set_block_property('TRN_ORDER_LINES',query_allowed,property_true);END IF;GO_ITEM('TRN_ORDER_HEADERS_V.DESCRIPTION');ELSENULL;END IF;Set_Block_Property('TRN_ORDER_HEADERS_V', ONETIME_WHERE, 'HEADER_ID = :TRN_ORDER_HEADERS.HEADER_ID'); GO_BLOCK('TRN_ORDER_HEADERS_V');EXECUTE_QUERY;END IF;END;8.TRN_ORDER_HEAEDS_V块对应的是订单详情FORM的订单头TRN_ORDER_HEAEDS块对应的是采购订单汇总FORM9.设置权限思路:首先看一下要求根据状态不同分别写的IF ELSE判断语句来分别设置对应的块和项的状态10.采购员的权限状态设置:其中关闭状态和取消状态可以写到一起已提交状态和已审批状态可以写到一起以下内容如不说明,都是在OPEN_BUTTON按钮下的触发器WHEN-BUTTON-PRESSED里加的原始状态:新建状态:已提交和已审批状态:已拒绝的状态:取消或者关闭状态:11.经理的权限状态设置:已审批、已拒绝、关闭、取消几个状态可以写到一起新建状态:(经理没有新建的权限)为经理设置新建按钮不可用在TRN_ORDER_HEADERS块的WHEN-NEW-BLOCK-INSTANCE触发器里面已提交状态:(可以更新备注,可以审批通过或者拒绝)其他状态:(为只查询状态)12.工具栏里关闭、取消、打印订单的是否失效设置:13.在TRN_ORDER_HEADERS块的WHEN-NEW-BLOCK-INSTANCE触发器里面调用下一该存储过程即可。
EBS之FORM学习

標準作業手冊EBSFORM DEV寧波奇美電子改版歷程Date目錄一.Forms基本對象概念1.1Forms 對象FORM: form可以有多個window;Window:只能有一個CANV AS,但是還可以包括其他的類型的CANVAS.比如:CANV AS_STACKED,這種Canvas類型將在後冇的講解.CANV AS:和BLOCK沒有直接的對應關系.而是直接和ITEM對應,一個CANV AS上冇可以來自不同的BLOCK的多個ITEM.是我們對ITEM進行位置調整的平台BLOCK: Logical owner of items,items in one block are logically related. There are two main tupes of blocks.Data block and control block.ITEM: FORM中最基本的組織元素.我們設計的最小簡元.Parameter:相當於全局變,其作用是傳遞參數,oracel標准的FORM也明單獨建一個BLOCK(多個ITEM) 來傳遞參數的例孖.Record Group: 主要應用是可以提供給LOV與LIST ITEM FREE作為數據源.LOV:list of value;會直接對應到TEXT ITEM上,點擊後會彈出用戶選擇數據.Attached Libraries:存放的是oracle標准的一些PLL文件.Property classes:ORACLE標准的一些屬性類.我們在建立WINDOW,CANVAS,DATA BLOCKT等都會選擇一個屬性類以斷承一些屬性和方法.明白了上面的基本概念,就可以开工了。
1.2FormBuilder前期準備安裝acle Form 6i及補丁以後,你自己開發的Form與Oracle EBS其它的Form不一樣,如:1.沒有工具欄;2.不能用通用的快捷鍵F11、Ctrl+F11和F6 等等這種毛病在第一次開發人員的通病。
- 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能否随着窗口大小变化而变化。