EBS常用技术开发技巧总结

EBS常用技术开发技巧总结

  • Form常用开发小技巧
  • PL/SQL常用小技巧
  • 服务器常用命令

Form常用开发小技巧

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的错误
EBS常用技术开发技巧总结_第1张图片
在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

EBS常用技术开发技巧总结_第2张图片

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添加库存组织(如下图)

EBS常用技术开发技巧总结_第3张图片

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;

26:如何使用当前数据块的别名值
EBS常用技术开发技巧总结_第4张图片

EBS常用技术开发技巧总结_第5张图片

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赋值。
EBS常用技术开发技巧总结_第6张图片

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
EBS常用技术开发技巧总结_第7张图片
2:然后在from触发器:WHEN-NEW-FORM-INSTANCE中添加如下代码

App_Special.Instantiate(Option_name => 'SPECIAL1'
                             ,Hint => '刷新附件信息'
                             ,Icon => NULL
                             ,Initially_enabled => TRUE
                             ,Separator => '');        

然后在对应的触发器中写功能代码即可:
EBS常用技术开发技巧总结_第8张图片

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;

这样From在打开的时候就会自动查询
EBS常用技术开发技巧总结_第9张图片

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

PL/SQL常用小技巧

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’;

EBS常用技术开发技巧总结_第10张图片
7:Oracle查看所有的Job

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
EBS常用技术开发技巧总结_第11张图片
然后可以看到下面的界面,选择2
EBS常用技术开发技巧总结_第12张图片
然后会看到下面的界面,直接默认就好了,到后面会看到让你选择模块,根据自己需要选择就好了,我是直接选择ALL的,然后出现的选择全部默认就可以了。
EBS常用技术开发技巧总结_第13张图片
EBS常用技术开发技巧总结_第14张图片
最后会出现如下的编译界面,然后等待就可以了,最后编译完成之后再进行默认,最后就会退出编译界面的,然后就完成了整个编译流程。

你可能感兴趣的:(EBS,Oracle,Form,Linux,Linux,Oracle,EBS,Form)