form学习笔记---form创建

一、form创建过程

1.框架属性:FRAME_RECT

 

3.定义form级别程序包CUXPOTEST

PACKAGE BODY CUXPOTEST IS
  PROCEDURE handle_event(event IN VARCHAR2) IS
  BEGIN
  	IF event = 'PRE-FORM' THEN
			fnd_standard.form_info('$Revision: 120.1 $',
                             'CUXPOTEST',
                             'CUX',
                             '$Date: 2018/05/24 11:02  $',
                             '$Author: hand $');
			app_window.set_window_position('MAIN','FIRST_WINDOW');
			
			--设置窗口弹出位置
			app_window.set_window_position('MAIN','CENTER');
			
			/*--选择库存组织
	    fnd_org.choose_org;
	    
	    --设置窗口名称
	    app_window.set_title('MAIN',
                         	 :parameter.org_code);*/
  
    ELSIF event = 'WHEN-NEW-FORM-INSTANCE' THEN
  		null;
	    
	    --add list
	    /*control.add_list(item   		=> 'QUERY_FIND.STATUS',
  									 	 item_group => 'STATUS_QF');*/

    ELSE
      app_exception.invalid_argument('cuxpotest.handle_event','EVENT',event);
    END IF;
  END handle_event;
END;

 

2.修改触发器:在触发器调用程序包

          (1)PRE-FORM

FND_STANDARD.FORM_INFO('$Revision: 120.12                                                                                                                                             $',
                       'Template Form', 'CUX',
                       '$Date: 2018/12/19 11:02  $', '$Author: appldev $');
app_standard.event('PRE-FORM');
app_window.set_window_position('MAIN', 'FIRST_WINDOW');
CUXPOTEST.handle_event('PRE-FORM');

       (2)WHEN-NEW-FORM-INSTANCE

FDRCSID('$Header: TEMPLATE.fmb 120.12 level:4 2013/10/14 19:16:28 pkm ship                                                                                                                                                                                                                                                             $');
APP_STANDARD.EVENT('WHEN-NEW-FORM-INSTANCE');

--template_folder.handle_event('WHEN-NEW-FORM-INSTANCE');

CUXPOTEST.handle_event('WHEN-NEW-FORM-INSTANCE');

3.定义表单

(1)应用开发员

(2)表单

(3)功能

(4)菜单

4.加载数据块

5.行表加光标提示字段

       加字段,字段属性选择CURRENT_RECORD_INDICATOR ;下拉列条: 滚动选择是

6.编译 cux_plsql_autocreate 生成增删改的包,创建数据块增删改程序单元

添加增删改触发器:

ON-LOCK:  PO_HEADERS_PRIVATE.lock_row;

ON-UPDATE:  PO_HEADERS_PRIVATE.update_row;

ON-INSERT:  PO_HEADERS_PRIVATE.insert_row;

ON-DELETE:  PO_HEADERS_PRIVATE.delete_row;

:p_block_name, 块名称
:p_table_name,  表名称
:p_owner, 用户
:p_primary_key  主键

7.关联=》创建关联关系,修改pre-delete触发器 在从块增加触发器WHEN-CREATE-RECORD增加主从关联关系

8.日期:

修改日期字段的属性选项板,修改Lov值列表为ENABLE_LIST_LAMP,从列表中验证为否,增加触发器:KEY-LISTVAL

触发器内容:
CALENDAR.SHOW;

9.验证 =》 增加块级触发器:WHEN-VALIDATE-ITEM

触发器内容:
IF :PO_HEADERS.CURRENCY_CODE<>'CNY' THEN fnd_message.debug('币种必须输入CNY'); raise form_trigger_failure; end if;

10.光标离开不允许插入更新 =》增加块级触发器:WHEN-NEW-RECORD-INSTANCE

触发器内容:
set_item_property('PO_HEADERS.COMMENTS',INSERT_ALLOWED,PROPERTY_FALSE); set_item_property('PO_HEADERS.COMMENTS',UPDATE_ALLOWED,PROPERTY_FALSE);

11.动态下拉条  使用SQL语句创建记录组LIST_TEST,在数据块将字段属性改为LIST,列表中的元素一一对应。添加下拉列表的程序包 Control

包体:
PACKAGE BODY CONTROL IS PROCEDURE add_list(item IN VARCHAR2, item_group IN VARCHAR2) IS l_errcode NUMBER; BEGIN l_errcode := populate_group(item_group); IF l_errcode=0 THEN clear_list(item); populate_list(item,item_group); ELSE app_exception.invalid_argument('control.add_list','EVENT',item); END IF; END add_list; END;

在form级别程序单元添加调用 WHEN-NEW-FORM-INSTANCE

 CONTROL.ADD_LIST(ITEM => 'PO_HEADERS.PO_NUMBER',
	        ITEM_GROUP => 'LIST_TEST');

12.文件夹

(1)新建一个手动创建数据块,数据块属性为block,数据块起名规则为原数据块名称_PROMPT,数据块模块为否复制

  FOLDER_PROMPT数据块中的项到创建的数据块:

  FOLDER_OPEN(属性为FOLDER_OPEN)、

  FOLDER+TITLE(属性为DYNAMIC_TITLE)、

  FOLDER_DUMMY(属性为FOLDER_DUMMY)、

  ORDER_BY(属性为FOLDER_ORDERBY)、

  复制原数据块的项(属性为FOLDER_PROMPT_MULTIROW)

(2)复制FOLDER中的项FOLDER_SWITCHER到原数据块(属性为SWITCHER)

(3)复制FOLDER中的触发器到原数据块

  PRE-QUERY

app_folder.event('PRE-QUERY');

  POST-QUERY

app_folder.event('POST-QUERY');
--folder.Populate_Fields;
app_globe.event('POST-QUERY');

  WHEN-NEW-BLOCK-INSTANCE

app_folder.event('WHEN-NEW-BLOCK-INSTANCE');

  WHEN-NEW-RECORD-INSTANCE

app_folder.event('WHEN-NEW-RECORD-INSTANCE');

  KEY-PREV-ITEM

app_folder.event('KEY-PREV-ITEM');

  KEY-NEXT-ITEM

app_folder.event('KEY-NEXT-ITEM');

  KEY-PRVREC

app_folder.event('KEY-PRVREC');

  KEY-NXTREC

app_folder.event('KEY-NXTREC');

  KEY-CLRREC

app_folder.event('KEY-CLRREC');

  KEY-EXEQRY

app_folder.event('KEY-EXEQRY');

  KEY-ENTQRY

app_folder.event('KEY-ENTQRY');

  PRE-BLOCK

app_folder.event('PRE-BLOCK');

  POST-BLOCK

app_folder.event('POST-BLOCK');

  KEY-CLRBLK

app_folder.event('KEY-CLRBLK');

13.在主画布上,添加堆叠画布  

   画布名称为原数据块_STK(属性为CANVAS_STACKED),将原数据块项放入堆叠画布,x轴0,y轴.25,宽度为1,高度.25

删除列名(提示),将PROMPT中的项放入堆叠画布,初始值设置为列名称,x和y轴都为0,宽度1,高度.25

   ORDER-BY显示在堆叠画布上,FOLDER_OPEN、FOLDER_TITLE、FOLDER_DUMMY显示在主画布

   修改主程序包,添加:

	app_folder.define_folder_block(object_name => 'CUXPOTEST1_PO_LINES', --FORM名称_块名称
  					folder_block_name => 'PO_LINES', --块名称
  					prompt_block_name => 'PO_LINES_PROMPT', --块的prompt名称
  					folder_canvas_name => 'PO_LINES_STK', --堆叠画布名称
  					fOlder_window_name => 'MAIN', --主画布名称
  					disabled_functions =>'',
  					tab_canvas_name =>'',
  					fixed_canvas_name => '');
  		 app_folder.event('INSTANTIATE');
  		 
  		 show_view('MAIN');
  		 show_view('PO_LINES_STK');

14.查询条件(手电筒查询)

  新增加一个数据块起名QUERY_FIND(属性为BLOCK),数据库模块选否;

       在新数据块增加查询项,属性为TEXT_ITEM,数据库项选否;

  新增窗口QUERY_FIND,窗口属性选择WINDOW;

  新增画布,窗口选择新建的窗口QUERY_FIND,属性选择CANVAS,将查询项放入画布;

  新增按钮项FIND_BTN,属性选择BUTTON,画布选择新建画布,设置提示标签查询;

  在查询项所在数据块增加块级触发器QUERY_FIND

app_find.query_find('MAIN','QUERY_FIND','QUERY_FIND'); 块画布所在窗口名,查询窗口名,块名

  在按钮项增加触发器WHEN-BUTTON-PRESSED

:parameter.g_query_find:='true'; --g_query_find为参数项
app_find.find('PO_HEADERS');
:parameter.g_query_find:='FALSE';

  查询项项所在数据块增加块级触发器PRE-QUERY

IF :parameter.g_query_find='TRUE' then
 	copy(name_in('query_find.INVENTORY_ITEM_ID'),'LINE_FOLDER.INVENTORY_ITEM_ID');
-- 	fnd_message.debug(:query_find.INVENTORY_ITEM_ID);
	copy(name_in('query_find.SALES_ORDER'),'LINE_FOLDER.SALES_ORDER');
	copy(name_in('query_find.CUSTOMER_NAME'),'LINE_FOLDER.CUSTOMER_NAME');
	copy(name_in('query_find.OPERATING_UNIT'),'LINE_FOLDER.OPERATING_UNIT');
	copy(name_in('query_find.ATTRIBUTE3'),'LINE_FOLDER.ATTRIBUTE3');
--	app_find.query_date_range(:query_find.SALES_ORDER_from,
--	:query_find.SALES_ORDER_to,'LINE_FOLDER.sales_order');
	:parameter.g_query_find:='FALSE';
--	fnd_message.debug('f2');
END IF; 
--:PO_HEADERS.项名称 := :query_find.项名称;

  模糊查找,给项增加LOV。

 15.描述性弹性域

(1)创建基表,基表中需要含有1结构字段和若干个自定义字段,结构字段通常起名ATTRIBUTE_CATEGORY,长度为30,自定义字段通常15个,起名ATTRIBUTE1.....n,长度240.

create table CUX.CUX_FLEXFIELD_DEMO
(FLEXFIELD_DEMO_ID             NUMBER NOT NULL,
  CODE_COMBINATION_ID           NUMBER NOT NULL,
  DESCRIPTION                   VARCHAR2(240),
  CREATION_DATE                 DATE NOT NULL,
  CREATED_BY                    NUMBER NOT NULL,
  LAST_UPDATE_BY                NUMBER NOT NULL,
  LAST_UPDATE_DATE              DATE NOT NULL,
  LAST_UPDATE_LOGIN             NUMBER,
  ATTRIBUTE_CATEGORY            VARCHAR2(30),
  ATTRIBUTE1                    VARCHAR2(240),
  ATTRIBUTE2                    VARCHAR2(240),
  ATTRIBUTE3                    VARCHAR2(240),
  ATTRIBUTE4                   VARCHAR2(240),
  ATTRIBUTE5                    VARCHAR2(240),
  ATTRIBUTE6                    VARCHAR2(240),
  ATTRIBUTE7                    VARCHAR2(240),
  ATTRIBUTE8                    VARCHAR2(240),
  ATTRIBUTE9                    VARCHAR2(240),
  ATTRIBUTE10                    VARCHAR2(240),
  ATTRIBUTE11                    VARCHAR2(240),
  ATTRIBUTE12                    VARCHAR2(240),
  ATTRIBUTE13                    VARCHAR2(240),
  ATTRIBUTE14                    VARCHAR2(240),
  ATTRIBUTE15                    VARCHAR2(240)
) 
tablespace CUX_TS_TX_DATA;
create unique index CUX.CUX_FLEXFIELD_DEMO_U1 ON CUX.CUX_FLEXFIELD_DEMO(FLEXFIELD_DEMO_ID)
       tablespace CUX_TS_TX_DATA;
CREATE SEQUENCE CUX.CUX_FLEXFIELD_DEMO_S;
CREATE SYNONYM CUX_FLEXFIELD_DEMO_S FOR CUX.CUX_FLEXFIELD_DEMO_S;
CREATE SYNONYM CUX_FLEXFIELD_DEMO FOR CUX.CUX_FLEXFIELD_DEMO

(2)注册表和字段到EBS中

DECLARE
BEGIN
 AD_DD.REGISTER_TABLE('CUX','CUX_FLEXFIELD_DEMO','T',2,10,40);
 AD_DD.REGISTER_COLUMN('CUX','CUX_FLEXFIELD_DEMO','FLEXFIELD_DEMO_ID',1,'NUMBER',38,'N','N');
 AD_DD.REGISTER_COLUMN('CUX','CUX_FLEXFIELD_DEMO','CODE_COMBINATION_ID',2,'VARCHAR2',240,'Y','N');
  AD_DD.REGISTER_COLUMN('CUX','CUX_FLEXFIELD_DEMO','DECRIPTION',3,'VARCHAR2',240,'Y','N');
 AD_DD.REGISTER_COLUMN('CUX','CUX_FLEXFIELD_DEMO','CREATION_DATE',4,'DATE',9,'N','N');
 AD_DD.REGISTER_COLUMN('CUX','CUX_FLEXFIELD_DEMO','CREATED_BY',5,'NUMBER',38,'N','N');
 AD_DD.REGISTER_COLUMN('CUX','CUX_FLEXFIELD_DEMO','LAST_UPDATE_BY',6,'NUMBER',38,'N','N');
 AD_DD.REGISTER_COLUMN('CUX','CUX_FLEXFIELD_DEMO','LAST_UPDATE_DATE',7,'DATE',9,'N','N');
 AD_DD.REGISTER_COLUMN('CUX','CUX_FLEXFIELD_DEMO','LAST_UPDATE_LOGIN',8,'NUMBER',38,'Y','N');
 AD_DD.REGISTER_COLUMN('CUX','CUX_FLEXFIELD_DEMO','ATTRIBUTE_CATEGORY',9,'VARCHAR2',30,'Y','N');
 AD_DD.REGISTER_COLUMN('CUX','CUX_FLEXFIELD_DEMO','ATTRIBUTE1',10,'VARCHAR2',240,'Y','N');
 AD_DD.REGISTER_COLUMN('CUX','CUX_FLEXFIELD_DEMO','ATTRIBUTE2',11,'VARCHAR2',240,'Y','N');
 AD_DD.REGISTER_COLUMN('CUX','CUX_FLEXFIELD_DEMO','ATTRIBUTE3',12,'VARCHAR2',240,'Y','N');
 AD_DD.REGISTER_COLUMN('CUX','CUX_FLEXFIELD_DEMO','ATTRIBUTE4',13,'VARCHAR2',240,'Y','N');
 AD_DD.REGISTER_COLUMN('CUX','CUX_FLEXFIELD_DEMO','ATTRIBUTE5',14,'VARCHAR2',240,'Y','N');
 AD_DD.REGISTER_COLUMN('CUX','CUX_FLEXFIELD_DEMO','ATTRIBUTE6',15,'VARCHAR2',240,'Y','N');
 AD_DD.REGISTER_COLUMN('CUX','CUX_FLEXFIELD_DEMO','ATTRIBUTE7',16,'VARCHAR2',240,'Y','N');
 AD_DD.REGISTER_COLUMN('CUX','CUX_FLEXFIELD_DEMO','ATTRIBUTE8',17,'VARCHAR2',240,'Y','N');
AD_DD.REGISTER_COLUMN('CUX','CUX_FLEXFIELD_DEMO','ATTRIBUTE9',18,'VARCHAR2',240,'Y','N');
 AD_DD.REGISTER_COLUMN('CUX','CUX_FLEXFIELD_DEMO','ATTRIBUTE10',19,'VARCHAR2',240,'Y','N');
 AD_DD.REGISTER_COLUMN('CUX','CUX_FLEXFIELD_DEMO','ATTRIBUTE11',20,'VARCHAR2',240,'Y','N');
 AD_DD.REGISTER_COLUMN('CUX','CUX_FLEXFIELD_DEMO','ATTRIBUTE12',21,'VARCHAR2',240,'Y','N');
 AD_DD.REGISTER_COLUMN('CUX','CUX_FLEXFIELD_DEMO','ATTRIBUTE13',22,'VARCHAR2',240,'Y','N');
 AD_DD.REGISTER_COLUMN('CUX','CUX_FLEXFIELD_DEMO','ATTRIBUTE14',23,'VARCHAR2',240,'Y','N');
 AD_DD.REGISTER_COLUMN('CUX','CUX_FLEXFIELD_DEMO','ATTRIBUTE15',24,'VARCHAR2',240,'Y','N');

END;

(3)在EBS说明性注册弹性域

(4)在块中创建一个字段DESC_FLEX,子类为TEXT_ITEM_DESC_FLEX,大括号项子类为DYNAMIC_PROMPT,LOV值列表为ENABLE_LIST_LAMP

(5)触发器要求

块级触发器 

WHEN-NEW-ITEM-INSTANCE:fnd_descr_flex.define('PO_HEADERS',
					     field		=>'DESC_FLEX',
					     appl_short_name  =>'CUX',
					     desc_flex_name  =>'CUX_FLEXFIELD_DEMO'); 
PRE-INSERT:fnd_flex.event('PRE-INSERT');
PRE-UPDATE:fnd_flex.event('PRE-UPDATE');
PRE-QUERY:fnd_flex.event('PRE-QUERY');
POST-QUERY:fnd_flex.event('POST-QUERY');
WHEN-VALIDATE-RECORD:fnd_flex.event('WHEN-VALIDATE-RECORD');

 ITEM级触发器

WHEN-NEW-ITEM-INSTANCE:fnd_flex.event('WHEN-NEW-ITEM-INSTANCE');
WHEN-VALIDATE-ITEM:fnd_flex.event('WHEN-VALIDATE_ITEM');

 

 

 

posted @ 2019-09-17 20:37  好小子·  阅读(655)  评论(0编辑  收藏  举报