• EBS 11i升级R12


     http://blog.csdn.net/y657356105/article/details/8181081

     概述

    从EBS 11i升级至R12,总的来说更变较大的就是多OU访问(MOAC)和表视图的更变。

    因为标准功能oracle都帮我们做了升级,本文档所说的11升12都是客户化的更改。

     

    多OU访问[1][2]

    不同于11i限定ORG_ID的方式,使得视图只能筛选单个OU的数据,R12使用安全策略来控制OU数据的访问,可以用类似下面的执行语句注册客户化的应用:

    DECLARE

      CURSOR c_init_mo IS

        SELECT fa.application_short_name

          FROM fnd_application fa

         WHERE fa.application_short_name LIKE 'ZZ%';

      l_init_app VARCHAR2(20);

    BEGIN

      FOR l_init_app IN c_init_mo

      LOOP

        fnd_mo_product_init_pkg.register_application(l_init_app.application_short_name, 'SEED', 'N');

      END LOOP;

    END;

    由于是将11的功能完全移植到R12,form与报表需要设置OU访问层次的地方全部设为单个OU。

    FORM更改当中,有可能用到11i当中是视图,R12当中是同义词的表(例如PO_HEADERS),如果简单进行编译,有可能取不到任何数据,在pre-form的地方需要加以语句进行初始化:

    MO_GLOBAL.init(‘ZZOM’);

    报表遇到类似的情况也要做相应处理:

    切换到:系统管理员->系统管理->并发->程序

    查询出需要设置的请求,设置为单个OU。

     

    数据库对应字段为:

    fnd_concurrent_programs.multi_org_category (S,M)

     

    选取FORM源代码

    可能会出现之前实施标准不一致,出现同一个form在form/ZHS出现forms/US出现以及form目录都出现,并且时间不一样的情况。为了避免以后由于版本不对造成的一系列问题。在取form源代码的时候可以进入APPL_TOP,使用下面的语句筛选最符合要求,时间离fmx最近的一个fmb源代码:

    find . -name "ZZCSTDBT034F.fmb" -exec ls -l {} ;

     

     

    R12视图更变

    处理视图更变是R12升级最占时间的一项工作,一些客户化的程序包使用11i当中存在,R12当中不存在;R12表字段更变、表字段缺失;R12数据存储方式更变的各种情况。

    以下列出一些常见的表视图更变实例及替换:(肯定还有其他的)

    GL_TRANSLATION_RATES_V

    基表筛选或新增视图

    RA_ADDRESSES_ALL

    基表筛选或新增视图

    RA_SITE_USES_MORG

    基表筛选或新增视图

    RA_ADDRESSES

    基表筛选或新增视图

    AR_CUSTOMERS_V

    基表筛选或新增视图

    RA_CUSTOMERS

    ar_customers

    RA_HCUSTOMERS

    ar_customers

    RA_CONTACTS

    基表筛选或新增视图(HZ_CUST_ACCOUNT_ROLES)

    AP_AE_HEADERS_ALL

    XLA_AE_HEADERS

    AP_AE_LINES_ALL

    XLA_AE_LINES

    AP_ACCOUNTING_EVENTS_ALL

    XLA_EVENTS

    AP_BANK_ACCOUNTS_ALL

    CE_BANK_ACCOUNTS

    AP_BANK_ACCOUNT_USES_ALL

    CE_BANK_ACCT_USES_ALL

    AR_CUSTOMER_BANK_ACCOUNTS_V

    特别对待

    AP_BANK_BRANCHES

    CE_BANK_BRANCHES_V

    AP_CHECK_FORMATS

    IBY_FORMATS_B

    AP_CHECK_STOCKS_ALL

    CE_PAYMENT_DOCUMENTS

    RA_SITE_USES_ALL

    HZ_CUST_SITE_USES_ALL

    RA_SITE_USES

    HZ_CUST_SITE_USES_ALL

    AR_HCUSTOMER_PROFILE_AMOUNTS

    HZ_CUST_PROFILE_AMTS

    AR_VAT_TAX_ALL

    AR_VAT_TAX_ALL_B

    ZX_RATES_B

    AR_CUSTOMER_PROFILE_AMOUNTS

    HZ_CUST_PROFILE_AMTS

    GL_TRANSLATION_RATES

    期间汇率不用了

     

    注意:这里只提到了_ALL的表,实际开发肯定要将不带_ALL的也考虑进更替项当中。考虑到form当中也可能用到这些表或者视图(R12不用,但是表存在),建议升级客户化修改当中首先将这些表的apps同义词删除!

    补充:RA_ADDRESSES_ALL发现,基于11i的表视图筛选有问题!!!有部分数据筛选不出来,hz_loc_assignments更变比较大,建议RA_ADDRESSES_ALL直接用表hz_cust_acct_sites_all替换

    其中,对于AP_AE_HEADERS_ALL与AP_AE_LINES_ALL表,部分字段R12存储在其他表当中了,比如AP_AE_LINES_ALL的SUBLEDGER_DOC_SEQUENCE_ID存在了GL_IMPORT_REFERENCES表(可能是考虑到了数据重复的情况,11里面查询subledger_doc_sequence_value,subledger_doc_sequence_id全部对应)。具体可以视情况而定,不清楚可以查看相应oaf界面。

    可以用以下SQL确认subledger_doc_sequence_id字段:

    SELECT a.subledger_doc_sequence_id,

           a.subledger_doc_sequence_value,

           b.subledger_doc_sequence_id,

           b.subledger_doc_sequence_value

      FROM gl_import_references a,

           ap_ae_lines_all      b

     WHERE a.gl_sl_link_table = 'APECL'

       AND b.gl_sl_link_id = a.gl_sl_link_id

       AND a.subledger_doc_sequence_id IS NOT NULL

       AND a.subledger_doc_sequence_value != b.subledger_doc_sequence_value

     

    数据变换比较大的是这两个表:

    AP_BANK_ACCOUNTS_ALL、AP_BANK_ACCOUNT_USES_ALL

    在11当中,客户银行账户、供应商银行账户、内部银行账户全部存在上面2个表当中,而R12,内部银行账户存储在列出的变换表中,但是客户银行账户、供应商银行账户分别以其他的方式存储了。有些包使用供应商地点ID、客户地点ID关联银行账户就会出错。

    这种情况通过在界面上进行查看,可以找出在12当中筛选出供应商、客户银行账户的相关信息:

    客户银行账户:

    SELECT iby_bank.currency_code,

           cust_site.site_use_id,

           ce_br.bank_name,

           ce_br.bank_branch_name,

           iby_bank.bank_account_name

      FROM iby_external_payers_all iby_player,

           iby_pmt_instr_uses_all  iby_use,

           hz_cust_site_uses_all   cust_site,

           iby_ext_bank_accounts   iby_bank,

           ce_bank_branches_v      ce_br

     WHERE iby_use.ext_pmt_party_id = iby_player.ext_payer_id

       AND iby_player.acct_site_use_id = cust_site.site_use_id

       AND iby_bank.ext_bank_account_id = iby_use.instrument_id

       AND ce_br.branch_party_id(+) = iby_bank.branch_id

       AND cust_site.site_use_id = 10509;

    供应商银行账户:

    SELECT iby_bank.currency_code,

           ce_br.bank_name,

           ce_br.bank_branch_name,

           iby_bank.bank_account_name,

           iby_bank.bank_account_num,

           iby_player.ext_payee_id

      FROM iby_external_payees_all iby_player,

           iby_pmt_instr_uses_all  iby_use,

           iby_ext_bank_accounts   iby_bank,

           ce_bank_branches_v      ce_br

     WHERE iby_use.ext_pmt_party_id = iby_player.ext_payee_id

       AND iby_player.payee_party_id = 27900 --ap_supplier.party_id

       AND iby_bank.ext_bank_account_id = iby_use.instrument_id

       AND ce_br.branch_party_id(+) = iby_bank.branch_id;

    说明:

    iby_external_payees_all

    这个表的payee_party_id就是ap_supplier的party_id

    银行账户对应的主要字段

    PARTY_SITE_ID,SUPPLIER_SITE_ID,ORG_ID

     

    账户分配层次:地点

    PARTY_SITE_ID,SUPPLIER_SITE_ID,ORG_ID都不为空

     

    账户分配层次:地址

    PARTY_SITE_ID不为空

     

    账户分配层次:地址 - 业务实体

    PARTY_SITE_ID,ORG_ID不为空

     

    账户分配层次:供应商

    都为空

     

    其余还可能遇到一些11、12都存在,12字段缺失,但是不像上面那么凶猛的案例,比如PO_VENDORS的bill_to_location_id,R12没有,PO_VENDORS在R12是视图,这种情况可以直接使用ap_suppliers的对应字段。

     

    视图更变当中还2 视图XLA_AP_INV_AEL_GL_V、XLA_AP_PAY_AEL_GL_V在12当中不存在,也不能简单进行表的替换,一些列字段不存在,如果是只选取一些信息出来,那么可以做一些特殊处理,从界面上查找出数据源,筛选相应信息。

     

     

    R12 OAF数据源[3]

    在11i当中很容易查找到数据源,在form界面上使用历史记录,或者last_query就可以知道具体sql,但是R12有很多OAF界面,不是那么简单就可以看到具体筛选的表的。

    设置预制文件:Personalize Self-Service Defn为YES

    之后OAF界面的左下角就会出现一个“关于此页”的标签。点击进去可以看到OAF界面用到的VO,查找出具体的SQL。

     

     

     

     

     

     

     

    标准值集更变

    一些在11i当中可以用的值集,R12进行了相应更改,就拿值集GL_SRS_PERIOD_NAMES来说,值集定义where条件的地方R12用到了另外一个值集:$FLEX$.GL_SRS_LEDGER_ID_UNVALIDATED,此处并不能随意猜测,我们可以参考标准功能用到GL_SRS_PERIOD_NAMES值集的请求:

    SELECT fcpv.user_concurrent_program_name,

           fdfcu.flex_value_set_id,

           ffvs.flex_value_set_name,

           fe.execution_file_name

      FROM fnd_descr_flex_col_usage_vl fdfcu,

           fnd_concurrent_programs_vl  fcpv,

           fnd_flex_value_sets         ffvs,

           fnd_executables             fe

     WHERE '$SRS$.' || fcpv.concurrent_program_name = fdfcu.descriptive_flexfield_name

     AND ffvs.flex_value_set_id = fdfcu.flex_value_set_id

     AND fe.executable_id = fcpv.executable_id

     AND ffvs.flex_value_set_name LIKE upper('%GL_SRS_PERIOD_NAMES%')

    或者可以在form界面上查看:

     

    对于GL_SRS_PERIOD_NAMES值集,R12标准功能是添加了P_LEDGER_ID,值集为GL_SRS_LEDGER_ID_UNVALIDATED,默认值配置文件:gl_set_of_bks_id

    后来发现可以将此值集更改为:JGZZ_GL_PERIOD_NAMES即可

     

    GL_SRS_TRANS_CURRENCIES_USD_STAT

    该值集R12升级where条件发生错误

     

    原因是GL_TRANSACTION_TRACKING的SET_OF_BOOKS_ID在12中叫做LEDGER_ID

    可以将相应字段进行替换,或者考虑到是标准的一个值集,也可以新建一个与其一样的值集,并加以修正。

     

    Servlet程序发布

    有些功能是被直接做成了Servlet,在11i当中是使用 Jserver发布Servlet,非常简单,只需将 Servlet文件放进$IAS_ORACLE_HOME/ Apache/Jserv/servlets既可。

    而R12并无Jserver,全部使用OC4J进行管理。这需要将class文件放到$JAVA_TOP下面,之后修改以下配置文件$ORA_CONFIG_HOME/10.1.3/j2ee/oacore/application-deployments/oacore/html/orion-web.xml,参照以前的配置加入servlet的定义,servlet mapping配置。重启应用即可。

     

     

    查询客户化的请求、报表

    R12升级主要就是改客户化的东西,但是如何确定该功能是客户化的呢?为了标准化,我想许多客户化的东西都会加上一些专门的标志,比如说这次的R12升级客户化的东西是以ZZ开头的(报表、FORM、PKG)。

    但是假如客户化的名字并不是那么标准,那么对于查找来说就比较困难,确保没有遗漏的东西,建议装一个R12 DEMO或者PROD环境专门执行此事,将升级过后的R12当中,R12 DEMO不存在的FORM、报表筛选出来。这些东西就很有可能是客户化的程序。

     

     

     

    PO无法取消

    在升级测试环境2遇到一个PO无法取消的问题,最后查出来是这么一个package无效导致:PO_CHG_REQUEST_PVT,但是测试环境1那里并没有这种情况,原因是DBA在升级测试环境2的时候多加了一些oracle建议设置的东西,造成测试环境2的PO无法取消。提了SR,oracle的回复是打一个补丁(18M),改了很多包,造成了更多严重的问题,PO模块直接瘫痪。最终不得不重新克隆测试环境再次升级,如果你也遇到类似情况,请直接使用这个包吧!

     

     

    其余课题

    u  ARXRWMAI 收款界面发生如下错误:

    FRM-41014: ERROR "CANNOT SET ATTRIBUTE OF NULL CANVAS ITEM"

    解决方法:菜单ONT_SETUP_CUSTOMERS 加上功能 全球化弹性域    (AR_GL_FLEXFIELD)

     

    u  有时候提交请求会出现一些莫名的报错,可以尝试换个语言环境进行提交。

     

    u  R12升级过后,一些基本的设置,比如CNY币种的启用,供应商编号方法等会发生更变,一定要进行系统测试,上线的时候进行更改。

     

    u  应用->帮助->诊断->检查,报“职责找不到对应函数”,不能进行相应查看。

    解决方法:设置profile“公用程序: 诊 断”为是。

     

    u  请求日志内容无法通过“复制”在浏览器中阅读

    解决方法:

    1、个性系统配置文件“RRA: 已启用”,值设置为“是”
    2、确保系统配置文件“RRA: 服务前缀”为空,不允许有空格

     

    u  升级过后会标准功能或多或少会出现问题,建议标准FORM全部重新编译一次(服务器执行 adadmin)

     

    u  升级之后,加入了 VPD的功能,执行某些 SQL语句的时候会发生错误。

    DELETE FROM oe_hold_sources

     WHERE hold_entity_code = 'I'

       AND hold_entity_id = 1

       AND - 1 = (oe_sys_parameters.value('MASTER_ORGANIZATION_ID', org_id));

    exec_delete 5 ORA-01732: data manipulation operation not legal on this view

    发生地:INV->Items->Delete Items 带出的请求Delete Item Information(追踪即可得到这个SQL,参数改了下)

    参照Metalink 1487181.1的解决方案sys执行:

    GRANT MERGE ANY VIEW TO apps;

     

     

    u  DBA_DIRECTORY的更变

    升级过后某些路径会发生更变,检查一下DBA_DIRECTORY

     

    u  ap_invoices_interface_s、ap_invoice_lines_interface_s

    收款界面操作报错,最后查是这2个sequence的nextval 小于接口表当中的值,所以报错,增加他们的nextval值,留意类似的接口表sequence。

     

    u  R12 FORM日期显示格式中文为DD-MM-YYYY,英文为DD-MON-YYYY  ,而11当中中英文都为DD-MON-YYYY

    这其实是11i当中的一个配置文件:ICX_DATE_LANGUAGE,而R12 该配置文件已经失效!建议类似情况直接改代码。[ID 393861.1]

     

    u  升级过后提交部分客户化请求会报莫名其妙的错误,但是查的话实际上并不知道到底怎么回事。 其实只需进入程序定义界面,在请求参数的地方做一个保存操作(随便怎么,主要发生保存操作,比如description那里多加一个空格),之后提交就正常了。暂不知具体如何将这些需要做保存操作的请求筛选出来。(后来得知是有的请求参数定义直接采用代码进行更新,对于此类请求都需要做保存操作!)

     

    u  JAVA LIB

    升级过后,会发现客户化加入的java jar无法找到,可以在这里进行重新添加:

    $INST_TOP/ora/10.1.3/j2ee/oacore/application-deployments/oacore/orion-application.xml   [ID 433241.1]

     

    u  值集源表order by

    有一个客户化值集定义的非常牛逼,基于表筛选,而源表那里末尾直接弄了一个order by ,造成使用的时候报了莫名其妙的错误。将order by 去掉即可。[ID 1461060.1]

     

    u  自动开票主程序、程序 - 自动过账计划请求报错

    重新提交一个计划请求

    [ID 1406913.1]、[ID 1374519.1]

     

    u  日记账行追溯报错

    You are not authorized to access the function View Material Transactions. Please

    contact your System Administrator

    GL_SUPERS菜单(报错职责对应的菜单)加上以下function

    View Material Trxns

    Receiving Transaction Summary

    View Resource Transactions

    Lot Based Job Transactions

    View Write-Off Transactions

     

    u  废弃的东西

    Supplier Customer Netting Report [ID 556146.1]

    Payables Account Analysis Report [ID 752596.1]

    XLA_MO_TOP_REPORTING_LEVEL (Mo: Top Reporting Level) (PROFILE) [ID 1184318.1]

    SYNCHRONIZE WORKFLOW LOCAL TABLES (1) (REPORT SET) [ID 1061277.1]

    Response Processor[E16342-04.P45]

    u  AP发票的汇率都移到了AP_INVOICES_ALL

    u  Material Account Distribution Detail报表不展示来源

    标准功能就是这样,只显示目标子库存,不显示来源子库存[ID 1330609.1]

    u  XLA_DISTRIBUTION_LINKS数据移植不全

    参见[ID 604893.1]

     

    升级有用的SQL

    客户化的东西比较多,直接不知道form或者某个报表在什么地方,弄了些常用SQL查询这些东西

    Form使用处

    SELECT frv.responsibility_name,

           menu.user_menu_name,

           menu.prompt,

           menu.lv

      FROM (SELECT LEVEL lv,

                   entr.prompt,

                   entr.description,

                   menu.menu_name,

                   menu.user_menu_name,

                   menu.menu_id

              FROM fnd_menus_vl        menu,

                   fnd_menu_entries_vl entr

             WHERE menu.menu_id = entr.menu_id

             START WITH function_id = (SELECT fun.function_id

                                         FROM fnd_form_functions_vl fun,

                                              fnd_form              form

                                        WHERE fun.form_id = form.form_id

                                          AND upper(form.form_name) = upper('ZZCSTDBT011F'))

            CONNECT BY PRIOR entr.menu_id = entr.sub_menu_id) menu,

           fnd_responsibility_vl frv

     WHERE frv.menu_id(+) = menu.menu_id;

     

    报表提交处

    SELECT fcpv.concurrent_program_id,

           --frg.request_group_name,

           res.responsibility_name,

           fcpv.user_concurrent_program_name,

           fcpv_tl.user_concurrent_program_name,

           fe.execution_file_name,

           decode(frgu.request_unit_type, 'P', '程序', 'A', '应用', '其他') 类型

      FROM fnd_request_group_units         frgu,

           fnd_request_groups              frg,

           --fnd_request_sets_vl             frsv,

           apps.fnd_responsibility_vl      res,

           apps.fnd_concurrent_programs_vl fcpv,

           apps.fnd_concurrent_programs_tl fcpv_tl,

           fnd_executables                 fe

     WHERE ((fcpv.concurrent_program_id = frgu.request_unit_id AND frgu.request_unit_type = 'P' --程序

           ) OR (fcpv.application_id = frgu.request_unit_id AND frgu.request_unit_type = 'A' --应用

           ))

       AND fe.executable_id = fcpv.executable_id

       AND fe.application_id = fcpv.executable_application_id

       AND res.request_group_id = frg.request_group_id

       AND frg.request_group_id = frgu.request_group_id

       AND fcpv_tl.application_id(+) = fcpv.application_id

       AND fcpv_tl.concurrent_program_id(+) = fcpv.concurrent_program_id

       AND fcpv_tl.language(+) != userenv('lang')

       AND fcpv.executable_application_id = fe.application_id

       AND upper(fe.execution_file_name) LIKE upper('%%')

       AND (upper(fcpv.user_concurrent_program_name) LIKE upper('%%')

       and upper(fcpv_tl.user_concurrent_program_name) like upper('%%'))

       AND upper(fcpv.concurrent_program_name) LIKE upper('%%');

     

    历史请求运行状态

    SELECT fcr.actual_start_date "起始",

           fcr.actual_completion_date "结束",

           fcr.request_id "请求编号",

           (fcr.actual_completion_date - fcr.actual_start_date) * 24 * 60 "运行时间(分钟)",

           fcr.argument_text "参数",

           decode(fcr.description,

                  NULL,

                  fcpv.user_concurrent_program_name,

                  fcr.description || '(' || fcpv.user_concurrent_program_name || ')') "请求名",

           flv.meaning "状态",

           flvv.meaning "阶段",

           frv.responsibility_name,

           fu.user_name

      FROM apps.fnd_concurrent_requests    fcr,

           apps.fnd_concurrent_programs_vl fcpv,

           fnd_lookup_values               flv,

           apps.fnd_lookup_values_vl       flvv,

           apps.fnd_responsibility_vl      frv,

           fnd_user                        fu

     WHERE fcr.concurrent_program_id = fcpv.concurrent_program_id

       AND fcr.program_application_id = fcpv.application_id

       AND flv.lookup_type = 'CP_STATUS_CODE'

       AND flv.language = userenv('lang')

       AND flv.view_application_id = 0

       AND flvv.lookup_type = 'CP_PHASE_CODE'

       AND flvv.lookup_code = fcr.phase_code

       AND flvv.view_application_id = 0 --不确定

       AND flv.lookup_code = fcr.status_code

       AND frv.responsibility_id = fcr.responsibility_id

       AND fu.user_id = fcr.requested_by

    --AND fcpv.concurrent_program_id = 52375

    --AND fcr.actual_start_date IS NOT NULL

    --AND fcr.request_id = 4695935

     

    /*AND status_code IN ('I', 'Q')

    AND ((decode(implicit_code, 'N', status_code, 'E', 'E', 'W', 'G') = status_code OR

        decode(implicit_code, 'W', 'E') = status_code))

    AND (nvl(request_type, 'X') != 'S')

    and fcr.hold_flag='N'  --计划请求

    */

     ORDER BY fcr.request_id DESC

     

    查询客户化请求以程序包

    SELECT t.object_name,

           fe.execution_file_name,

           fe.executable_name,

           fcpv.concurrent_program_name,

           fcpv.user_concurrent_program_name

      FROM dba_objects t,

           (SELECT upper(f.execution_file_name) execution_file_name,

                   f.executable_name,

                   f.executable_id,

                   f.application_id

              FROM apps.fnd_executables f) fe,

           apps.fnd_concurrent_programs_vl fcpv

     WHERE t.object_name LIKE 'ZZ%'

       AND t.object_type = 'PACKAGE'

       AND fcpv.executable_id(+) = fe.executable_id

       AND fcpv.executable_application_id(+) = fe.application_id

          --AND t.status = 'VALID'

       AND fe.execution_file_name(+) LIKE upper(t.object_name) || '%'

     ORDER BY t.object_name;

     

    查看EBS打过的补丁

    SELECT pp.creation_date,

           dd.patch_name,

           pp.driver_file_name,

           lang.language,

           pp.last_update_date

      FROM ad_patch_drivers      pp,

           ad_applied_patches    dd,

           ad_patch_driver_langs lang

     WHERE pp.applied_patch_id = dd.applied_patch_id

       AND lang.patch_driver_id = pp.patch_driver_id

    --AND patch_name = '2408149'

     ORDER BY pp.last_update_date DESC;

     

    监控用户登陆信息

    SELECT fu.user_name,

           frv.responsibility_name,

           ff.user_form_name,

           login_form.start_time,

           login_form.end_time

      FROM fnd_logins                 fl,

           fnd_user                   fu,

           fnd_login_resp_forms       login_form,

           fnd_form_tl                ff,

           fnd_login_responsibilities r,

           fnd_responsibility_vl      frv

     WHERE fl.user_id = fu.user_id

       AND fu.user_name LIKE upper('Z%')

       AND fl.login_id = login_form.login_id

       AND fl.login_id = r.login_id(+)

       AND r.responsibility_id = frv.responsibility_id(+)

       AND r.resp_appl_id = frv.application_id

       AND ff.form_id = login_form.form_id

       AND login_form.form_appl_id = ff.application_id

       AND login_form.start_time BETWEEN r.start_time AND r.end_time

       AND ff.language = userenv('lang')

     ORDER BY fl.login_id           DESC,

              login_form.start_time DESC;

  • 相关阅读:
    R.drawable 转 bitmap
    opengl
    android 时间1
    mysql 管理工具
    使用BroadcastReceiver实现开机启动Service或Activity
    webView
    博客收藏1
    popupWindow 弹出菜单
    viewpager android viewGroup左右滑动方法1
    Android中Bitmap和Drawable
  • 原文地址:https://www.cnblogs.com/xiaoL/p/3461788.html
Copyright © 2020-2023  润新知