1:如何设置一个数据块为只显:
set_block_property('PRICE_LINES_NDOOR', insert_allowed, property_off);
set_block_property('PRICE_LINES_NDOOR', update_allowed, property_off);
set_block_property('PRICE_LINES_NDOOR', delete_allowed, property_off);
2:如何设置一个数据块的某一项为只显:
set_item_property('PRICE_LINES_NDOOR.INIT_PRICE',INSERT_ALLOWED, PROPERTY_FALSE); set_item_property('PRICE_LINES_NDOOR.INIT_PRICE',UPDATE_ALLOWED, PROPERTY_FALSE);
3:如何设置一个数据块的某一行的字段为只显:
set_item_instance_property('PRICE_HEADERS.PROJECT_NAME'
,current_record
,insert_allowed
,property_off);
set_item_instance_property('PRICE_HEADERS.PROJECT_NAME'
,current_record
,update_allowed
,property_off);
4:如何查询一个日期范围内的数据:
App_Find.Query_Date_Range(Low_Value => :MAIN_QF.ASKED_DATE_FROM
,High_Value => (:MAIN_QF.ASKED_DATE_TO)
,Db_Fieldname => 'PRICE_HEADERS.ASKED_DATE');
5:如何在from中拼凑一个查询SQL:
app_query.reset('PRICE_HEADERS');
l_sql := '1=1';
l_sql := l_sql || 'AND status_code IN(cux_po_price_pub.get_status_confirm
,cux_po_price_pub.get_status_quoted)';
app_query.append('PRICE_HEADERS', l_sql);
6:如何校验界面有未保存数据
IF :system.form_status = 'CHANGED' THEN
fnd_message.set_string('先保存数据');
fnd_message.error;
RAISE form_trigger_failure;
ELSE
// 这里是你要进行的操作
END IF;
7:如何设置询问弹窗功能
fnd_message.set_string('是否确认价表取价?');
IF fnd_message.question('确定', '取消', '', 1,2) = 1 THEN
IF NOT app_form.quietcommit THEN
RAISE form_trigger_failure;
END IF;
//这里是你要进行的操作
ELSE
RAISE form_trigger_failure;
END IF;
需要进行删除数据时进行提示,并删除界面数据,不影响后台数据库数据
在触发器KEY-DELREC中添加如下代码
fnd_message.set_string('是否确认删除?');
IF fnd_message.question('确定', '取消', '', 1,2) = 1 THEN
IF NOT app_form.quietcommit THEN
RAISE form_trigger_failure;
END IF;
-- execute_trigger('ON-DELETE');
-- form_pub.Refresh_Ui('OA_INFO');
delete_record;
ELSE
RAISE form_trigger_failure;
END IF;
8:如何在重新查询的时候把之前的查询条件都保留下来(标准代码,参数是你要查询的那个数据块名)
PROCEDURE Refresh_Ui(P_Block_Name IN VARCHAR2) IS
L_Cursor_Block VARCHAR2(50);
L_Cursor_Record NUMBER;
L_Cursor_Item VARCHAR2(50);
L_Trigger_Record NUMBER;
L_Default_Where VARCHAR2(4000);
L_Last_Query VARCHAR2(4000);
L_Where_Anchor NUMBER;
L_Order_Anchor NUMBER;
L_Where_Clause VARCHAR2(4000);
L_Message_Level NUMBER;
BEGIN
L_Cursor_Item := Name_In('system.cursor_item');
L_Cursor_Record := Name_In('system.cursor_record');
L_Cursor_Block := Name_In('system.cursor_block');
L_Trigger_Record := L_Cursor_Record;
L_Message_Level := :System.Message_Level;
IF L_Cursor_Block <> P_Block_Name THEN
L_Trigger_Record := Get_Block_Property(P_Block_Name, Current_Record);
Go_Block(P_Block_Name);
IF Name_In('system.cursor_block') <> P_Block_Name THEN
Fnd_Message.Debug('developer error :TO SELECT records in another BLOCK ,you must be able TO navigate.');
RAISE Form_Trigger_Failure;
END IF;
END IF;
L_Default_Where := Get_Block_Property(P_Block_Name, Default_Where);
L_Last_Query := Get_Block_Property(P_Block_Name, Last_Query);
--order by
IF Instr(Upper(L_Last_Query), 'ORDER BY') = 0 THEN
L_Order_Anchor := Length(L_Last_Query);
ELSE
L_Order_Anchor := Instr(Upper(L_Last_Query), 'ORDER BY') - 1;
END IF;
IF Instr(Upper(L_Last_Query), 'WHERE') = 0 THEN
L_Where_Anchor := L_Order_Anchor - 5;
ELSE
L_Where_Anchor := Instr(Upper(L_Last_Query), 'WHERE') - 1;
END IF;
L_Where_Clause := Substr(L_Last_Query
,L_Where_Anchor + 6
,L_Order_Anchor - L_Where_Anchor - 5);
Set_Block_Property(P_Block_Name, Default_Where, L_Where_Clause);
:System.Message_Level := 25;
Execute_Query;
:System.Message_Level := L_Message_Level;
Set_Block_Property(P_Block_Name, Default_Where, L_Default_Where);
Go_Block(P_Block_Name);
Go_Record(L_Trigger_Record);
Go_Block(L_Cursor_Block);
Go_Record(L_Cursor_Record);
Go_Item(L_Cursor_Item);
END; --//Refresh_Ui
9:如何判断调用包的返回结果并给出相应的提示
IF l_return_status <> 'S' THEN
fnd_message.set_string(l_msg_data);
fnd_message.error;
RAISE form_trigger_failure;
ELSE
IF NOT app_form.quietcommit THEN
RAISE form_trigger_failure;
END IF;
fnd_message.set_string('已提交成功');
fnd_message.show;
END IF;
10:如何在一打开form就给其中的参数赋值,
在pre-form触发器中添加赋值语句
:parameter.p_role_type := fnd_profile.value('CUX_PO_PRICE_ROLE_TYPE');
11:如何给窗口显示他所在的责任
在WHEN-NEW-FORM-INSTANCE触发器中添加
set_window_property('MAIN'
,title
,'询价单(' || fnd_profile.value('RESP_NAME') || ')');
12:如何定义Folder的数据块语法:
在WHEN-NEW-FORM-INSTANCE触发器中添加
app_folder.define_folder_block('PRICE_LINES_NDDOR'
,'PRICE_LINES_NDOOR'
,'PRICE_LINES_NDOOR_PROMPT'
,'PRICE_LINES_NDOOR_STK'
,'MAIN'
,NULL
,'TAB_LINES'
,'PRICE_LINES_NDOOR_FIX'); app_folder.event('INSTANTIATE');
13:如何在一打开form就显示查询界面
在WHEN-NEW-FORM-INSTANCE触发器中添加
–显示查询窗口
App_Find.Query_Find(Block_Window => 'MAIN'
,Find_Window => 'MAIN_QF'
,Find_Block => 'MAIN_QF');
如果查询的手电筒一直灰暗,需要把查询块和被查询块的是否允许查询属性都是设置为:是(YES)即可。
14:如何设置在一打开form就显示对应的TAB页
在WHEN-NEW-FORM-INSTANCE触发器中添加
–显示第一个TAB页画布
show_view('PRICE_LINES_NDOOR_FIX');
show_view('PRICE_LINES_NDOOR_STK');
15:如何消除日期出现的bug问题,右侧出现S的错误
在WHEN-WINDOW-RESIZED触发器中添加
–消除日期弹窗的BUG
IF :system.event_window IN ('MAIN') THEN
app_folder.event('WHEN-WINDOW-RESIZED');
END IF;
16:如何只在WHEN-TAB-PAGE-CHANGED触发器中就可以切换多个TAB页
validate(block_scope);
IF :system.mode = 'ENTER-QUERY'
OR NOT form_success THEN
--FORM出错
set_canvas_property('TAB_LINES'
,topmost_tab_page
,:system.tab_previous_page);
NULL;
ELSE
IF :system.form_status = 'CHANGED' THEN
--判断FORM是否发生改变
fnd_message.set_name('FND', 'FOLDER-SAVE OR CANCEL FIRST');
l_question_rt := fnd_message.question('YES'
,NULL
,'CANCEL'
,1
,3
,'question');
IF l_question_rt = 1 THEN
IF NOT app_form.quietcommit THEN
RAISE form_trigger_failure;
END IF;
show_view(:system.tab_new_page || '_STK');
show_view(:system.tab_new_page || '_FIX');
hide_view(:system.tab_previous_page || '_STK');
hide_view(:system.tab_previous_page || '_FIX');
:parameter.g_query_find := 'TRUE';
go_block(:system.tab_new_page);
execute_query;
:parameter.g_query_find := 'FALSE';
ELSE
--FORM未保存,不能切换
set_canvas_property('TAB_LINES'
,topmost_tab_page
,:system.tab_previous_page);
RAISE form_trigger_failure;
END IF;
ELSE
--FORM未发生改变,直接切换
show_view(:system.tab_new_page || '_STK');
show_view(:system.tab_new_page || '_FIX');
hide_view(:system.tab_previous_page || '_STK');
hide_view(:system.tab_previous_page || '_FIX');
:parameter.g_query_find := 'TRUE';
go_block(:system.tab_new_page);
execute_query;
:parameter.g_query_find := 'FALSE';
END IF;
END IF;
17:如何点击查询按钮时进入需要查询的块进行查询
:Parameter.G_Query_Find := 'TRUE';
App_Find.Find('PRICE_HEADERS');
:Parameter.G_Query_Find := 'FALSE';
18:如何在一个字段改变值得时候清除其他字段的值
给该字段添加WHEN-VALIDATE-ITEM触发器,并添加代码:
app_field.clear_fields(field1 => 'PRICE_LINES_DOOR.SUBCATEGORY_CODE'
,field2 => 'PRICE_LINES_DOOR.SUBCATEGORY_DESC');
//当MAIN_QF.ASKED_BY_NAME为空的时候才进行清除动作
App_Field.Clear_Dependent_Fields(Master_Field => 'MAIN_QF.ASKED_BY_NAME'
,Field1 => 'MAIN_QF.ASKED_BY');
19:如何给主从块添加关系:
PRICE_HEADERS.HEADER_ID=PRICE_LINES_DOOR.HEADER_ID
20:如何弹出新的窗口,并设置其显示位置
set_window_property('MAIN_PICTURES', position, 3.5, 0.5);
show_window('MAIN_PICTURES');
go_block('PRICE_PICTURES');
execute_query;
21:如在在form里面循环去操作数据(此处是处理所有选中的checkbox框)
DECLARE
BEGIN
GO_BLOCK(‘PRICE_HEADERS’);
first_record;
LOOP
IF :price_headers.check_box = 'Y' THEN
--进行操作
NULL;
ELSE
--进行其他操作
NULL;
END IF;
IF :system.last_record = 'TRUE' THEN
EXIT;
ELSE
next_record;
END IF;
END LOOP;
END;
22:如何给form添加库存组织(如下图)
1、首先在parameter中加上CHART_OF_ACCOUNTS_ID,ORG_NAME,ORG_CODE,ORG_ID四个参数;
2、在FORM级触发器中的PRE-FORM中加上FND_ORG.CHOOSE_ORG ,放在app_window.set_window_position之后。
23:如何设置项取得时间为当前系统时间
添加触发器:KEY-LISTVAL
触发器中添加代码:calendar.show;
设置LOV值列表为:ENABLE_LIST_LAMP
且对LOV不进行验证
设置属性的初始值为:$$DATE$$
24:如何获取当前页面的page,块,项等数据
获取当前数据块名::system.current_block
获取当前page名::system.tab_new_page
获取当前选中的项名称:system.current_item
25:如果是folder列的动态隐藏和显示,这有一份代码可以参考:
–隐藏字段
PROCEDURE hide_item(block_name IN VARCHAR2, item_name IN VARCHAR2) IS
l_display_property VARCHAR2(30);
BEGIN
l_display_property := get_item_property(block_name || '.' || item_name,
displayed);
IF l_display_property = 'FALSE' THEN
RETURN;
END IF;
go_item(block_name || '.' || item_name);
app_folder_del_fld;
END;
–显示字段
PROCEDURE show_item(block_name IN VARCHAR2, item_name IN VARCHAR2) IS
l_item_name VARCHAR2(60);
l_display_property VARCHAR2(30);
BEGIN
l_display_property := get_item_property(block_name || '.' || item_name,
displayed);
IF l_display_property = 'TRUE' THEN
RETURN;
END IF;
l_item_name := block_name || '.' || item_name;
go_item('dist.subinventory_desc'); --要显示在哪一个列后面
app_folder_add_to_group(item_name);
END;
27:设置block为活动块
app_folder.define('ACTIVE_BLOCK', l_block_name);--设置该BLOCK为活动块
插入一个列:
app_folder.define('INSERT_COLUMN'
,l_item_name || ':' || l_position_after_column
,l_prompt_name
,l_display_width);
app_folder.define('CUT_COLUMN', l_item_name);-- 隐藏名称为l_item_name的列。
app_folder.define('WIDTH',l_item_name|| ':' ||l_display_width);--改变该列的宽度。
app_folder.define('CHANGE_ACTIVE_PROMPT', l_item_name, l_prompt_name);-- 改变该列的显示名称。
app_folder.define('DISABLE_CUT', l_item_name);--不让列隐藏
app_folder.define('ACTIVE_BLOCK', l_block_name);--设置该BLOCK为活动块
然后再初始化即可,不然设置没有效果。
28:全局变量:只能存储字符型数据,可以在当前会话的所有表单内引用
语法::global.name
例:可以when-new-form-instance中声明一个全局变量
Global.name:=‘this is a global‘;
然后在when-button-pressed中引用
Message(:Global.name);
29:参数(Parameter):在Forms中直接创建一个参数
语法::Parameter.parameter1 := ?test‘;
另外:在EBS中,可以通过在注册功能时,给Parameter赋值。
30:系统变量:这个是FORMS预定义的,直接使用即可
例::SYSTEM.CURRENT_DATETIME
31:信息提示框之基本用法
1、message Usage:message(‘提示信息’);
Effect:在FORMS左下角会出现这个提示信息。
2、fnd_message用法大全 2.1 FND_Message.Debug
Usage::fnd_message.debug(‘提示信息’);
Effect:会直接弹出一个对话框,与vb中的msgbox(“提示信息”)类似。
2.2、fnd_message.question .
Usage: -----------------------------------------------------------------------------
declare
v_num number;
begin
FND_MESSAGE.SET_STRING(‘确要执行此操作吗?’);
v_num := FND_MESSAGE.QUESTION(‘否’, ‘是’,NULL, 1,2); i
f v_num=2 then fnd_message.debug(‘选择了是’);
elsif v_num=1 then fnd_message.debug(‘选择了否’);
end if;
end;
Effect: Effect:会直接弹出一个选择框,与vb中的msgbox(“提示信息”,vbokcancel)类似。
32:实现将LOV可以自行录入内容
在WHEN-NEW-ITEM-INSTANCE触发器加入
begin set_item_property('block.item1',
VALIDATE_FROM_LIST, property_false);
end;
33:在FORMS调用WEB页面
web.show_document(‘http://www.sina.com.cn’,’_blank’); 第二参数为页面的加载方式,有四种选择。
_SELF
_PARENT
_TOP
_BLANK
34:Name_In()\COPY()函数
1、 Name_In()函数有点奇怪,丢进去是字符串,返回也是字符串。
Oracle官方文档说是为了实现indirect reference。
例:
IF :emp.ename = 'smith' -- direct reference
IF NAME_IN('emp.ename') = 'smith' -- indirect reference
另外:Name_In()可以用来间接引用一些系统函数。例:var t_form varchar2(50):=Name_In(?system.current_form‘);
2、Copy()函数呢?也是一样,也是为了实现indirect reference。 例:
:emp.ename := 'smith'; -- direct reference
Copy('smith','emp.ename'); -- indirect reference
3、后来在ITPUB上面看到,说此两个函数是为了实现类似于C++中宏定义。
3.1 NAME_IN实现宏定义的例子
FUNCTION FUN_JF (PRE_BLOCK_NAME
IN VARCHAR) RETURN BOOLEAN IS
BEGIN
if name_in(pre_block_name'sj.dwjtc')>name_in(pre_block_name'yj.dwjtc') then
message(' 测试!');
return false;
end if;
return true;
END;
-- PRE_BLOCK_NAME是形参,实际调用时,通过Name_in()函数来实现变量宏替换成FORMS.ITEM。
3.2 COPY实现宏定义的例子:
BEGIN
DELCATE
strItemName varchar2(20);
BEGIN
for I in 1 „6 loop
strItemName:=':b.l"to_char(i);
copy(null,strItemName); --strItemName由变量宏替换成Forms中Item。
end loop;
END;
4、通过上面两个例子,应该可以明白indirect reference与direct reference的区别。但我个人觉得C++的宏定义很少这样作用,一般都是起常量的作用。例:#difned BUFFER 100。而且ANSI C++推荐使用const来代替宏定义。
35:Forms数据提交的方式
1、commit_form
先针对form上面的数据变动进行commit,然后对于代码中的类似DML语句也进行提交; 如果form上面的数据变动和代码中的数据变动有冲突,最后以FORM上的为准。 适用:一般来在直接修改Form上的数据时,就使用commit_form。
2、commit
对form和数据库进行提交。如果form上面的数据和代码中的数据变动有冲突,最后以FORM上的为准。 适用:一般来在直接使用DML代码修改数据时,就使用commit。
3、do_key(‘commit_form’)
会首先寻找form下的triggers中的KEY-COMMIT这个trigger,并执行KEY-COMMIT中所写的代码。 如果没有KEY-COMMIT这个trigger,则会针对form和代码一起提交。 如果form上面的数据变动和代码中的数据变动有冲突,最后以界面上的为准。 适用:只是更改了一下代码执行的任先顺序,没有什么实质区别。
4、forms_ddl(‘commit’)
只针对代码中的update,insert,delete语句进行提交。如果form上面的数据有变动,是不会提交的。 适用:一般不用。
48:fnd_message的各种方法
fnd_message.debug('TEST1');--调试消息
fnd_message.set_string('TEST2');
fnd_message.show; --输出显示消息
fnd_message.set_string('TEST2');
fnd_message.error; --输出错误消息
fnd_message.set_string('TEST2');
IF fnd_message.warn THEN
--输出警告消息,返回BOOLEAN值
fnd_message.debug('True');
ELSE
fnd_message.debug('False');
END IF;
--从消息字典获取一条消息,首先需要存储消息
fnd_message.set_name('CUX', 'CUX_LM_ERR_MSG');
--替换消息中的信息变量,
fnd_message.set_token('varname', '测试');
fnd_message.show;
--fnd_message.question 询问消息
FUNCTION question(button1 IN VARCHAR2 DEFAULT 'YES',--1
button2 IN VARCHAR2 DEFAULT 'NO',--2
button3 IN VARCHAR2 DEFAULT 'CANCEL',--3
default_btn IN NUMBER DEFAULT 1,
cancel_btn IN NUMBER DEFAULT 3,
icon IN VARCHAR2 DEFAULT 'question')
RETURN NUMBER
fnd_message.set_string('CHLTEST2测试' || chr(10) || '是否继续');
IF (fnd_message.question('确定', NULL, '取消', 1, 3, 'NOTE')) = 3 THEN
fnd_message.debug('False');
ELSIF (fnd_message.question('确定', NULL, '取消', 1, 3, 'NOTE')) = 1 THEN
fnd_message.debug('True');
END IF;
Fnd_message.get取出消息。
49:如何记录form界面上光标的位置
--保留光标所在的位置,刷新后自动定位到该光标位置
l_cursor_record := :system.cursor_record;--光标的位置
go_record(l_cursor_record);
50:如果Folder上的STK画布数据无法显示问题
把数据块的FOLDER_SWITCHER设置在FIX画布或者MAIN画布上,其中该项不要设置可用键盘导航,否则会出问题的。
51:开发Form时,点击功能无法显示form界面问题
解决办法1:可能是要显示的数据块的各个项的属性没有设置为可用键盘导航。
解决办法2:可能是没有没有设置主窗口或者主画布问题。
解决办法3:可是是第一个导航块没有设置。
52:如何在工具栏添加新按钮
SPECIAL1—SPECIAL15在“工具”主菜单下。
SPECIAL16—SPECIAL30在“报表”主菜单下。
SPECIAL31—SPECIAL45在“活动”主菜单下。
SPECIAL46 以上就直接报错了。
1:首先在from中添加form级别触发器如:SPECIAL1
2:然后在from触发器:WHEN-NEW-FORM-INSTANCE中添加如下代码
App_Special.Instantiate(Option_name => 'SPECIAL1'
,Hint => '刷新附件信息'
,Icon => NULL
,Initially_enabled => TRUE
,Separator => '');
53:一个from调用另一个form(两个form必须要在同一个菜单下面才可以)
方法1:(第三个参数一般设为null(可附加的参数),第一个参数为from名称(注册的功能名))
BEGIN
fnd_function.execute(function_name => 'CUXINVSPPL'
,open_flag => 'Y'
,session_flag => 'Y'
,other_params => 'P_STOCK_ID ="' ||
:stock_plan.stock_id || '"');
END;
方法二:
BEGIN
fnd_function.execute(function_name => 'CUXSQLTSETS'
,open_flag => 'Y'
,session_flag => 'Y'
,other_params => 'SECURITY_NAME= " ' ||
to_char(:pablk_sqltd_v.securityname_c) ||
'" SECURITY_DESC= " ' ||
to_char(:pablk_sqltd_v.securityname_c) ||
' " ');
END;
56:设置按钮变灰暗不可用
set_item_property('CONTROL.NDPRINT', enabled, PROPERTY_FALSE);
57:如何删除Form中LIST多余的行
按住CRTL+SHIFT+<即可删除该行
58:如何使用代码关闭窗口
app_custom.close_window('LOT_WIN');
-- hide_window('LOT_WIN');
go_block('ORDER_SWITCH');
59:如何打开From,界面会自动查询数据
给查询块添加块级触发器WHEN-NEW-BLOCK-INSTANCE,然后再触发器内写入
go_block('FOLDER');
execute_query;
60:form_success用法
用form_success判断form是否没有错误,在某些时候是不能完全检测到form的错误。
比较正确的做法是对system.form_status是否是query进行判断。
IF Form_Success THEN
Commit;
IF :System.Form_Status <> 'QUERY' THEN
Message('Error prevented Commit');
RAISE Form_Trigger_Failure;
END IF;
END IF;
有时候看情况是否要增加SQLCODE的判断
IF form_success or SQLCODE = 0 THEN
1:如何判断一串字符串全是数字组成的
Select REPLACE(translate(STR, '0123456789', '0'), '0', '') from dual;
如何STR为全是数字组成的字符串,则查询结果为NULL。
2:获取当天的初始和末尾时刻
SELECT TRUNC(SYSDATE) FROM DUAL;
SELECT TRUNC(SYSDATE)+1 - 0.00001 FROM DUAL;
3:解决HTML导出Excel表数字变成科学计数法
https://www.cnblogs.com/lx1137433756/p/6423517.html
程序包中’’
4:查询一个字符在一段字符串中出现的次数
–此处查询“,”在一段字符串中的出现的次数
SELECT length(regexp_replace(REPLACE('10101,10102,10103,10104,10105,10106,10107,10108,10109,10110',
',',
'|'),
'[^|]+',
'')) AS COUNT
FROM dual;
5:查询一个消息在哪里包使用
SELECT *
FROM dba_source l
WHERE l.text LIKE '%消息%';
6:查看一个包的最后编译时间
SELECT *
FROM dba_objects db
WHERE db.object_name = 'WSH_SHIP_CONFIRM_ACTIONS’;
SELECT t.*
FROM user_jobs t;
SELECT *
FROM user_scheduler_job_log
WHERE job_name = 'NIFM_FILE_PRO_OTFCACTION71122'
ORDER BY log_id DESC;
SELECT *
FROM user_scheduler_job_run_details
WHERE log_id = 1512482;
SELECT job,
what,
failures,
broken
FROM user_jobs;
--job id,job 名称,失败次数,状态
--所有的job:
SELECT ju.name username,
j.obj#,
jo.name,
j.failure_count
FROM sys.obj$ jo,
sys.user$ ju,
sys.obj$ co,
sys.scheduler$_job j
WHERE j.obj# = jo.obj#
AND jo.owner# = ju.user#
AND j.class_oid = co.obj#(+)
ORDER BY NAME;
--在运行的job:
SELECT sid,
job
FROM dba_jobs_running;
8.MO_GLOBAL包中一些过程和函数的使用(MOAC)
DECLARE
v_current_org_id NUMBER;
v_access_mode VARCHAR2(2);
v_ou_count NUMBER;
v_org_id NUMBER;
v_mo_init_done VARCHAR2(2);
v_check_access VARCHAR2(2);
v_ou_name VARCHAR2(240);
BEGIN
mo_global.init('AR'); --初始化Multi Org,临时表 mo_glob_org_access_tmp 有数
mo_global.set_policy_context(p_access_mode => 'S', p_org_id => 93); --设置Org访问模式,S为单OU访问,M为多OU访问,A为所有OU访问
SELECT mo_global.check_access(101)
INTO v_check_access
FROM dual; --检查Org_id是否存在临时表 mo_glob_org_access_tmp;check_valid_org与check_access类似,check_valid_org可以跑出错误信息
SELECT mo_global.get_current_org_id
INTO v_current_org_id
FROM dual; --获取当前Org_id;若没有init,访问模式为S或A,则返回当前Org_id,若有init,且访问模式为S,则返回init的org_id
SELECT mo_global.get_access_mode
INTO v_access_mode
FROM dual; --获取当前Org访问模式
SELECT mo_global.get_ou_count
INTO v_ou_count
FROM dual; --获取当前多组织访问可访问的OU数;若没有init,则为空
SELECT mo_global.get_valid_org(101)
INTO v_org_id
FROM dual; --验证并返回Org_id;若没有init,且访问模式为S;或者有init,则返回Org_id
SELECT mo_global.is_mo_init_done
INTO v_mo_init_done
FROM dual; --验证MO是否已初始化,Y/N;若有init或者没有init但访问模式为S,则返回Y
SELECT mo_global.get_ou_name(101)
INTO v_ou_name
FROM dual; --获取临时表 mo_glob_org_access_tmp中Org名称
END;
BEGIN
FOR rec_mo IN (SELECT mo.organization_name,
mo.legal_entity_name
FROM mo_glob_org_access_tmp mo) LOOP
fnd_message.set_string(rec_mo.organization_name || ':' ||
rec_mo.legal_entity_name);
fnd_message.show;
END LOOP;
END;
9:查询哪里包会使用到某个表或者其他的文件信息
select * from dba_dependencies l where l.referenced_name='CGL_CROSS_ORG_RCV';
user_source,dba_source这两个表有所有程序包中的语句,也可以用来查标准报错在哪个程序包
1:启动并发管理器:
cd $ADMIN_SCRIPTS_HOME
adcmctl.sh start --启动并发管理器
查看并发管理器运行数
ps -elf | grep FNDLIBR | grep -v grep | wc -l
查看并发进程
ps -ef |grep FND*
查看某个用户的特定并发进程
ps -e
2:停止应用和数据库服务器
停止应用和数据库服务器
停止应用服务器(使用 applprod 用户登录系统)
cd $ADMIN_SCRIPTS_HOME
adstpall.sh apps/apps
停止数据库服务器(使用oraprod用户登录系统)
cd /u01/DEV/db/12.1.0/appsutil/scripts/DEV_wms-dev01
/u02/uat/db/12.1.0/appsutil/scripts/UAT_wms-dev01
addlnctl.sh stop PROD
addbctl.sh stop
ps -ef |grep dev |grep NO
ps -ef |grep demo |grep NO
启动数据库和应用服务器
启动数据库服务器(使用oraprod用户登录系统)
cd /u01/DEV/db/12.1.0/appsutil/scripts/DEV_wms-dev01(DEV)
cd /u02/uat/db/12.1.0/appsutil/scripts/UAT_wms-dev01 (UAT)
addlnctl.sh start DEV
addbctl.sh start
启动应用服务器(使用 applprod 用户登录系统)
cd $ADMIN_SCRIPTS_HOME
adstrtal.sh apps/apps
ORACLE的重启命令
(1) 以oracle身份登录数据库,命令:su – oracle
(2) 进入Sqlplus控制台,命令:sqlplus /nolog
(3) 以系统管理员登录,命令:connect / as sysdba
(4) 启动数据库,命令:startup
(5) 如果是关闭数据库,命令:shutdown immediate
(5) 如果是关闭数据库,命令:shutdown abort
(6) 退出sqlplus控制台,命令:exit
(7) 进入监听器控制台,命令:lsnrctl
(8) 启动监听器,命令:start
(9) 退出监听器控制台,命令:
(10) 重启数据库结束
3:oracle中编译所有模块的from或者编译单独模块
步骤:
使用adadmin
系统会询问:
Is this the correct APPL_TOP [Yes] ? --回车
Filename [adadmin.log] --回车
Do you wish to activate this feature [No] ? --回车
Please enter the batchsize [1000] : --回车
Is this the correct database [Yes] ? --回车
Enter the password for your ‘SYSTEM’ ORACLE schema: --manager(默认)
Enter the ORACLE password of Application Object Library [APPS] : --apps或是回车
然后能看到下面的界面,然后选择 1
然后可以看到下面的界面,选择2
然后会看到下面的界面,直接默认就好了,到后面会看到让你选择模块,根据自己需要选择就好了,我是直接选择ALL的,然后出现的选择全部默认就可以了。
最后会出现如下的编译界面,然后等待就可以了,最后编译完成之后再进行默认,最后就会退出编译界面的,然后就完成了整个编译流程。