所有由小潘发布的文章

喜欢分享的小潘.

Oracle EBS系统物料信息变更BUG

        物料名称在中文环境(英文环境政策)下更新后,mtl_system_items_b和mtl_system_items_tl这两个表的数据不一致,这是EBS系统BUG,Oracle至今没解决。因此,取物料名称等相关信息,从mtl_system_items_tl表取值最准确。当然为了使基表mtl_system_items_b信息同步,可以通过写程序去定时同步更新相关的字段数据。

Oracle EBS多OU总结

(一)  多OU总结

1.  Form多OU实现

1)  创建一个Table,以CUX_AP_CHECK_HEADER_ALL为例

2)  创建Table的两个Synonym(一个不含_ALL,一个以_ALL结尾):CUX_AP_CHECK_HEADER和CUX_AP_CHECK_HEADER_ALL

3)  给不含_ALL的Synonym:CUX_AP_CHECK_HEADER加上组织屏蔽的策略函数

dbms_rls.add_policy(object_name       => 'CUX_AP_CHECK_HEADER',

          policy_name       => 'ORG_SEC',

          policy_function => 'MO_GLOBAL.ORG_SECURITY',

              policy_type       =>  dbms_rls.shared_context_sensitive);

4)  在不含_ALL的Synonym的基础上创建视图: CUX_AP_CHECK_HEADER_V

5)  进入FORM时(pre-form触发器)添加代码:

mo_global.init(&p_appl_shortname);–p_appl_shortname为应用简称

6)  当选择某个OU时(一般在when_validate_item触发器)中添加代码:mo_global.set_policy_context('S',&p_org_id);–p_org_id为OU的id

2.  Report多OU实现

1)  给并发程序设置业务实体模式:单个,多个和空(默认)。一般设置为‘单个’

业务实体模式对应表fnd_concurrent_programs中的multi_org_category字段

2)  得到当前OU的值。

使用:mo_global.get_current_org_id或者fnd_global.org_id

3)  在报表的参数和报表的逻辑中加上OU的限制

3.  GL数据的多OU实现

1)  得到当前OU的值。

使用:mo_global.get_current_org_id或者fnd_global.org_id

2)  根据OU的值得到部门段的值:

DECLARE

    l_segment1  VARCHAR2(150);–部门段

   BEGIN

SELECT o3.attribute5

   INTO l_segment1

  FROM hr_all_organization_units     o,

       hr_all_organization_units_tl  otl,

       hr_organization_information   o2,

       hr_organization_information   o3

WHERE o.organization_id = o2.organization_id

   AND o.organization_id = o3.organization_id

   AND o2.org_information_context = 'CLASS'

   AND o3.org_information_context = 'Operating Unit Information'

   AND o2.org_information1 = 'OPERATING_UNIT'

   AND o2.org_information2 = 'Y'

   and o.organization_id = otl.organization_id

   and o.organization_id = &p_org_id –OU id

   AND otl.LANGUAGE = USERENV('LANG');

END;

3)  将步骤2得到的值作为限制条件:

SELECT gl_code_combinations gcc WHERE gcc.segment1 = l_segment1;

4.  Interface多OU总结

1)  给并发程序设置业务实体模式:单个,多个和空(默认)。业务实体模式对应表fnd_concurrent_programs中的multi_org_category字段

2)  如果接口的导入程序中OU作为一个参数,则应该将所有的OU作一次循环。

5.  多OU实现扩展知识

1)  给客户化应用注册和取消MOAC的控制

fnd_mo_product_init_pkg.register_application(注册应用)

fnd_mo_product_init_pkg.remove_application(取消应用)

查看支持MOAC的应用SQL:

SELECT * FROM fnd_mo_product_init;

2)  给数据库对象注册和取消策略-policy

dbms_rls.add_policy(注册策略)

dbms_rls.drop_policy(取消策略)

3)  多OU 涉及到的表

a)   查看数据库对象是否增加了策略-policy

SELECT * FROM dba_policies;

b)   查看当前session所能访问的OU

SELECT * FROM mo_glob_org_access_tmp;

c)   查看当前session应用上下文(context)的值(说明:OU的值保存在context中)

SELECT * FROM dba_context dc WHERE dc.namespace LIKE 'MULTI%';

MOAC使用的应用程序上下文:MULTI_ORG,MULTI_ORG2

(二)  多帐套总结

1.   客户化开发中的多帐套屏蔽

1)  得到当前OU的值。

使用:mo_global.get_current_org_id或者fnd_global.org_id

2)  根据组织id得到帐套id和公司名称。SQL语句为:

DECLARE

   l_org_information3 VARCHAR2(150);–帐套id

        l_company_desc     VARCHAR2(150);–公司中文描述

  BEGIN

   SELECT o3.org_information3,o3.attribute3

     INTO l_org_information3,l_company_desc

     FROM hr_all_organization_units    o,

          hr_all_organization_units_tl otl,

          hr_organization_information  o2,

          hr_organization_information  o3

    WHERE o.organization_id   = o2.organization_id

      AND o.organization_id   = o3.organization_id

      AND o2.org_information_context || '' = 'CLASS'

      AND o3.org_information_context = 'Operating Unit Information'

      AND o2.org_information1 = 'OPERATING_UNIT'

      AND o2.org_information2 = 'Y'

      AND o.organization_id   = otl.organization_id

      AND otl.language        = USERENV('LANG')

      AND o.organization_id   = &p_org_id;–OU id

   END;

3)  得到本位币,SQL语句为:

DECLARE

l_local_currency_code VARCHAR2(15);–本位币

BEGIN

SELECT gsob.currency_code

    INTO l_local_currency_code

   FROM gl_sets_of_books gsob, hr_operating_units hou

  WHERE gsob.set_of_books_id = hou.set_of_books_id

  AND   hou.organization_id  = &p_org_id;–OU ID

END;

4)  在程序中加上帐套和本位币的限制

2.   多帐套实现扩展

1)  得到帐套的SQL语句为:

SELECT * FROM gl_ledgers;

2)  得到法人的SQL语句为:

SELECT * FROM xle_entity_profiles;

转载地址:http://blog.csdn.net/cunxiyuan108/article/details/6454450

PLSQL存储过程金额大写的转换

function lcw_get_money(money in number) return varchar2 is
    c_money  VARCHAR2(12);
    b_string VARCHAR2(80);
    m_string VARCHAR2(60) := '分角圆拾佰仟万拾佰仟亿';
    n_string VARCHAR2(40) := '壹贰叁肆伍陆柒捌玖';
    n        CHAR;
    len      NUMBER(10);
    i        NUMBER(10);
    tmp      NUMBER(12);
    is_zj    BOOLEAN;
    z_count  NUMBER(10);
    l_money  NUMBER;
    l_money1 NUMBER;
    l_sign   VARCHAR2(10);
  BEGIN
    l_money1 := to_number(money);
    l_money  := abs(money);
    IF l_money1 < 0 THEN
      l_sign := '负';
    ELSE
      l_sign := '';
    END IF;
    tmp     := round(l_money, 2) * 100;
    c_money := rtrim(ltrim(to_char(tmp, '999999999999')));
    len     := length(c_money);
    is_zj   := TRUE;
    z_count := 0;
    i       := 0;
    WHILE i < len LOOP
      i := i + 1;
      n := substr(c_money, i, 1);
      IF n = '0' THEN
        IF len – i = 6 OR len – i = 2 OR len = i THEN
          IF is_zj THEN
            b_string := substr(b_string, 1, length(b_string) – 1);
            is_zj    := FALSE;
          END IF;
          IF len – i = 6 THEN
            b_string := b_string || '万';
          END IF;
          IF len – i = 2 THEN
            b_string := b_string || '圆';
          END IF;
          IF len = i THEN
            b_string := b_string || '整';
          END IF;
          z_count := 0;
        ELSE
          IF z_count = 0 THEN
            b_string := b_string || '零';
            is_zj    := TRUE;
          END IF;
          z_count := z_count + 1;
        END IF;
      ELSE
        b_string := b_string || substr(n_string, to_number(n), 1) ||
                    substr(m_string, len – i + 1, 1);
        z_count  := 0;
        is_zj    := FALSE;
      END IF;
    END LOOP;
    b_string := l_sign || b_string;
    RETURN b_string;
  EXCEPTION
    WHEN OTHERS THEN
      RETURN(SQLERRM);
  END;

Form开发常用命令点

1. 根据条件,输出错误提示

IF :detail_line.quantity <= 0 THEN
        fnd_message.set_string('数量不能为0或负数!');
        fnd_message.error;
        RAISE form_trigger_failure;
END IF;

2.  完成MOAC的初始化
   CUX_MOAC_PKG.pre_form;   
   app_window.set_window_position('MAIN', 'FIRST_WINDOW');

3. 初始化folder块,可初始化多个folder块
    app_folder.define_folder_block(object_name=>'CUXGSPCHK01',
                                   folder_block_name=>'DETAIL_HEADER',
                                   prompt_block_name=>'DETAIL_HEADER_PROMPT',
                                   folder_canvas_name=>'DETAIL_HEADER_STK',
                                   folder_window_name=>'MAIN',
                                   disabled_functions=>null,
                                   tab_canvas_name=>null,
                                   fixed_canvas_name=>null);
    app_folder.event('INSTANTIATE');

4. 功能:当进入FORM时,执行pre_form程序完成MOAC的初始化
   procedure pre_form
   is
      l_default_org_id  number;
      l_default_ou_name varchar2(240);
      l_ou_count         number;
   begin
        MO_GLOBAL.init('CUX');
       
        mo_utils.get_default_ou(l_default_org_id, l_default_ou_name, l_ou_count);
     
        copy(l_default_org_id,'PARAMETER.mo_default_org_id'); 
        copy(l_default_ou_name,'PARAMETER.mo_default_ou_name');
        copy(l_ou_count,'PARAMETER.mo_ou_count'); 
       
        –fnd_message.debug('l_default_org_id = ' || l_default_org_id);
        –fnd_message.debug('l_default_ou_name = ' || l_default_ou_name);
        –fnd_message.debug('l_ou_count = ' || l_ou_count);
       
        –判断是否找到了OU,如果没有找到,则报错
        if nvl(l_ou_count,0) <= 0 then
            fnd_message.set_name('CUX', '没有找到相应的OU,请联系系统管理员或开发人员!');
            fnd_message.error;
            raise form_trigger_failure;
        end if;           
   end pre_form;

 5. 帮助》历史记录灰掉问题

问题:在一个FORM中发现历史记录菜单灰掉

解决:这个跟块查询灰掉一样,块查询是把块级触发器WHEN-NEW-RECORD-INSTANCE触发器层级修改为BEFORE,

这个问题需要将WHEN-NEW-BLOCK-INSTANCE触发器层级修改为BEFORE,因为这两个的可用与否,是FORM级触发器判断的,如果覆盖,就不可用了。

PS:使用历史记录时报“历史记录不可用”,是由于在该块中没有5个数据库WHO字段的原因,添加上就行。

6. 设置ITEM属性

set_item_instance_property('DETAIL_LINE.LOT_NUMBER',
                                   current_record,
                                   update_allowed,
                                   property_false);

 set_item_property('QUERY_FIND.VENDOR_CUST_NAME'
                       ,insert_allowed
                       ,property_false);

7.Form客户化设置消息例子,参考系统用户创建form,用户创建触发器

FND_USER_PKG_WRP

FND_USER_PKG

8.问题描述: 手电筒功能查询一次后变灰色,不可用

原因:QUERY_FIND查询块中的Query_Allowed属性为NO

方法:把该属性设置为YES即可。

原因:这是主数据块(被查询的数据块)上When-new-record-instance触发器的执行层次问题

方法:改一下主data block的触发器WHEN-NEW-RECORD-INSTANCE ,把属性execution hierarchy改为after。

EBS并发程序相关SQL

–所有客户化并发程序
SELECT FC.USER_CONCURRENT_PROGRAM_NAME,
       FC.DESCRIPTION,
       FC.CONCURRENT_PROGRAM_NAME,
       UPPER(FE.EXECUTION_FILE_NAME)
  FROM FND_CONCURRENT_PROGRAMS_VL FC,
       FND_EXECUTABLES_FORM_V     FE,
       FND_APPLICATION            FA
 WHERE 1 = 1
   AND FA.APPLICATION_ID = FC.APPLICATION_ID
   AND FA.APPLICATION_SHORT_NAME = 'CUX'
   AND FC.CONCURRENT_PROGRAM_NAME = FE.EXECUTABLE_NAME
   AND FC.ENABLED_FLAG = 'Y'
 ORDER BY FC.CREATION_DATE DESC;

–并发程序对应参数
SELECT FV.COLUMN_SEQ_NUM                序号,
       FV.END_USER_COLUMN_NAME          参数,
       FV.DESCRIPTIVE_FLEXFIELD_NAME    可执行程序,
       FV.ENABLED_FLAG                  是否启用,
       FV.DISPLAY_FLAG                  显示,
       FFVS.FLEX_VALUE_SET_NAME         值集名称,
       FV.DEFAULT_TYPE                  默认类型,
       FV.DEFAULT_VALUE                 默认值,
       FV.REQUIRED_FLAG                 必需,
       FV.SECURITY_ENABLED_FLAG         启用安全性,
       FV.RANGE_CODE                    范围,
       FV.DISPLAY_SIZE                  显示大小,
       FV.MAXIMUM_DESCRIPTION_LEN       说明大小,
       FV.CONCATENATION_DESCRIPTION_LEN 级联说明大小,
       FV.FORM_ABOVE_PROMPT             提示,
       FV.SRW_PARAM                     变量
  FROM FND_DESCR_FLEX_COL_USAGE_VL FV, FND_FLEX_VALUE_SETS FFVS
 WHERE FV.FLEX_VALUE_SET_ID = FFVS.FLEX_VALUE_SET_ID
   AND SUBSTR(FV.DESCRIPTIVE_FLEXFIELD_NAME, 7) IN
       (SELECT FC.CONCURRENT_PROGRAM_NAME
          FROM FND_CONCURRENT_PROGRAMS_VL FC,
               FND_EXECUTABLES_FORM_V     FE,
               FND_APPLICATION            FA
         WHERE 1 = 1
           AND FA.APPLICATION_ID = FC.APPLICATION_ID
           AND FA.APPLICATION_SHORT_NAME = 'CUX'
           AND FC.CONCURRENT_PROGRAM_NAME = FE.EXECUTABLE_NAME
           AND FC.ENABLED_FLAG = 'Y')
 ORDER BY FV.DESCRIPTIVE_FLEXFIELD_NAME, FV.COLUMN_SEQ_NUM;