Update Strategy Transformation组件 详解

合集下载

INFO教学

INFO教学

INFA教学1、岗位介绍(基于数据流动方向进行岗位介绍)2、ETL介绍(处理流程,转换例子)3、info介绍(功能介绍,组建介绍)3、数据仓库介绍(上游数据源、层次、下游应用系统)4、数据仓库项目介绍(结合农信银和哈尔滨银行项目进行介绍)5、java项目介绍(项目流程)1、Informatica中,Update组件叫什么?更新机制?2、Informatica中,LookUp组件有哪几类?区别是什么?3、Informatica中,如何调用存储过程?4、Informatica中,工作流控制有哪些组件?5、Informatica优化方案?ETL是什么?ETL是数据抽取(Extract)、清洗(Cleaning)、转换(Transform)、装载(Load)的过程。

是构建数据仓库的重要一环,用户从数据源抽取出所需的数据,经过数据清洗,最终按照预先定义好的数据仓库模型,将数据加载到数据仓库中去。

INFA发展史:Informatica,1993年创立于美国加利福尼亚州,并于1999年4月在纳斯达克上市。

作为全球领先的独立企业数据集成软件提供商,Informatica 帮助世界各地的组织为其首要业务提供及时、相关和可信的数据,从而在当今全球信息经济中获得竞争优势。

借助Informatica全面、统一、开放且经济的数据集成平台,组织可以在改进数据质量的同时,访问、发现、清洗、集成并交付数据,以提高运营效率并降低运营成本。

Informatica平台是一套完善的技术,可支持多项复杂的企业级数据集成计划,包括:企业数据集成、大数据、数据质量控制、主数据管理、B2B Data Exchange、应用程序信息生命周期管理、复杂事件处理、超级消息和云数据集成。

PowerCenter的优势:(1). 可视化界面,方便管理R。

(2). 可视化界面,开发简单D。

(3). 可视化界面,维护方便D、W。

(4). 可视化界面,错误排查M。

informatica中常用各组件的功能

informatica中常用各组件的功能

目录未找到目录项。

Informatica 数据整合分为三类数据集成,即下游集成、中游集成和上游集成下游集成:指数据仓库,显著特点是,从数据流的角度看,数据仓库的主体功能是所有应用系统的下游,所有数据都会流向数据仓库中游集成:指数据交换平台,特点是,任何平台和它的关系都是对等的,它是这个数据枢纽hub的中心点,用来支持所有系统之间数据的数据交换,用于解决数据集成毛团问题。

上游集成:指主数据平台,而且是交易型主数据平台。

用于管理企业核心数据的黄金记录,作为企业核心记录的黄金数据的标准平台。

Informatica 的四个客户端及作用:1,Repository Manager:用于管理Repository本身,如创建文件夹,导入/导出Mapping、Worlkfolw,版本管理,部署,Repository的清除。

2,Designer:用于导入ETL元数据,开发ETL程序。

在Power Center中ETL程序被叫做Mapping,即源到目标的映射。

3,Workflow Manager:用于对Mapping的进行数据源、数据目标、使用的字符集、调优及参数配置等,使Mapping能够运行。

此外,还提供了基本的调度和排程的能力。

4,Workflow Monitor:用于监控运行时的Workflow和session,监控ETL运行是否正常、执行效率及异常时的错误信息。

Power Center的开发过程:0,使用PowerCenter客户端连接域(Domian)和数据库服务器Repository Service;建立一个文件夹(Folder),用于开发学习;1,在客户端PowerCenter Designer中导入源表和目标表的结构定义;注:在Power Center Designer中导入的仅仅是表结构,与执行过程的表名无强相关2,在Designer中,创建Mapping(ETL流程)3,在Designer中,拖动源和目标,以及相应组件进入Mapping4,在Designer中,建立源和目标,以及相应组件之间的映射5,在Workflow Manager中提供相应的配置信息及参数6,通过Workflow Monitor客户端进行监控7,预览执行结果重要概念:Mapping:是一个程序,但它不直接可以执行Session:是一个Mapping的实例,指定相关的配置信息后,可以执行;Workflow:可以执行一个或者多个Session,对Session或者其他Task组件进行排程基础组件:1,Source:源文件数据源可以是数据库表,文本文件,XML文件,SAP等,应用系统、Hadoop,MQ等源文件常用方法:手工创建,通过数据库、文本文件、样例文件导入注意:理论上,源表结构定义继承了数据库中表的定义,但是实践中有可能导入后的数据类型发生变化,如表中varchar2,而导入后变为nvarchar2,从而引起Session执行异常。

Informatica组件应用详解

Informatica组件应用详解

Informatica组件应⽤详解Informatica组件介绍⼀、update的功能Update 主要是与lookup相组合的搭档。

根据lookup来与源表数据相对⽐,来跟新数据数据抽取。

它起到⼀个插⼊和拒绝的作⽤。

1.Powercenter的更新策略包括两个⽅⾯:A.在Mapping中:⽤Update Strategy Transformation标识⾏为Insert,Update,Delete或者Reject;B.在Session中:配置Treat source row as 属性(Insert,Update,Delete或者Data driven),配置Target的属性(Insert,Update [as Update](只是更新) | [as Insert](把更新视为新增) | [else Insert](先更新,更新不到则新增) ,Delete,Truncate target table option);2.在Update Strategy Expression中可以输⼊常量(DD_INSERT, DD_UPDATE,DD_DELETE, DD_REJECT)或者数字值(0,1,2,3),其它数字值被解析为0,可以⽤IIF或者DECODE函数构建逻辑表达式来区别每⼀⾏的更新策略;3.Forward Rejected Rows:勾选时被Rejected的⾏会存⼊对应Target配置的Reject⽂件中去,不选时,可能会写⼊Session Log中去,根椐当前Transformation的Tracing Level的属性来决定;如果在会话属性中配置了出错⾏⽇志属性,则不会⽣成Reject⽂件;⼆、Expression 的功能表达式编辑器可以使⽤不同的颜⾊来标记表达式的语法,以便很好的阅读。

如果你有最新的Rich Edit,riched20.dll,安装到了系统,表达式显⽰表达式函数为兰⾊,注释式灰⾊,引⽤的字符串式绿⾊。

kettle 组件讲解

kettle 组件讲解

kettle 组件讲解Kettle 组件讲解Kettle 是一个开源的ETL(Extract-Transform-Load)工具,也是Pentaho Data Integration(PDI)的一部分。

它提供了一种简单而强大的方法来从不同的数据源提取数据,进行转换和加载到目标系统中。

在本文中,我们将详细讲解Kettle的组件及其功能。

1. 数据输入组件Kettle提供了多种数据输入组件,包括文本文件输入、数据库表输入、Excel文件输入等。

这些组件使得从不同的数据源中提取数据变得简单。

例如,文本文件输入组件可以从文本文件中读取数据,并将其发送到下一个步骤进行处理。

2. 数据输出组件Kettle同样提供了多种数据输出组件,例如文本文件输出、数据库表输出、Excel文件输出等。

这些组件可以将数据加载到不同的目标系统中。

例如,数据库表输出组件可以将数据写入到数据库表中。

3. 转换组件转换组件是Kettle中最重要的组件之一。

它提供了多种转换操作,例如字段计算、数据过滤、数据合并等。

通过这些组件,我们可以对数据进行各种各样的转换操作,以满足特定的需求。

4. 数据清洗组件数据清洗是数据转换过程中的重要一环。

Kettle提供了多种数据清洗组件,例如去重组件、空值处理组件、格式转换组件等。

这些组件可以帮助我们清洗数据,提高数据的质量。

5. 聚合组件聚合组件是Kettle中的另一个重要组件。

它可以对数据进行聚合操作,例如求和、计数、平均值等。

通过聚合组件,我们可以快速计算出需要的统计结果。

6. 数据输出组件除了数据加载到目标系统外,Kettle还提供了多种数据输出组件,例如邮件输出组件、文件输出组件等。

这些组件可以将转换后的数据以不同的方式输出,以满足不同的需求。

7. 调度组件Kettle的调度组件可以帮助我们实现定时执行任务的功能。

通过调度组件,我们可以设置任务执行的时间、频率以及其他相关参数。

这样,我们就可以实现自动化地执行数据转换任务。

transformation讲解 -回复

transformation讲解 -回复

transformation讲解-回复什么是Transformation(变革)?Transformation(变革)是指将一个事物或系统从一种状态转变为另一种状态的过程。

在各个领域,Transformation被广泛应用于实现改进、创新和发展的目标。

Transformation具有以下几个关键特征:1. 目标导向:Transformation是通过设定明确的目标来实现的。

这些目标可以是在某个时间点实现某种特定状态,也可以是逐步实现长期发展的目标。

2. 非线性变化:Transformation是一种根本的变化,它通常不是简单的线性改进,而是涉及到组织结构、流程、文化等多方面的整体变革。

3. 全局观:Transformation是综合性的变化,它需要考虑和影响整个系统的各个组成部分。

单纯的局部改进通常不能实现总体的Transformation 效果。

4. 持续性:Transformation是一个长期的过程,它需要长期投入和持续改进,不能一蹴而就。

在这个过程中,需要不断追求新的目标和挑战,以保持组织和系统的竞争力和创新能力。

那么,如何进行Transformation?Transformation的过程通常包括以下几个关键步骤:1. 制定变革策略:在进行Transformation之前,需要制定明确的变革策略。

这包括明确Transformation的目标、范围和时间,确定关键的变革领域和重点,以及选择适当的变革方法和工具。

2. 识别变革需求:在制定变革策略之后,需要识别和分析组织或系统中存在的问题和瓶颈,确定变革的需求和紧迫性。

这一步骤通常包括对组织文化、业务流程、管理体系等方面的深入调研和分析。

3. 制定变革计划:根据变革策略和需求分析的结果,制定变革计划。

这包括确定各个变革项目的目标、任务和资源,制定变革项目的时间表和里程碑,以及建立变革项目的组织和团队。

4. 执行变革计划:执行变革计划是实现Transformation的核心步骤。

update fixedupdate原理

update fixedupdate原理

update fixedupdate原理Update和FixedUpdate是Unity游戏引擎中常用的两个函数,用于控制游戏物体的更新逻辑。

本文将详细介绍Update和FixedUpdate 的原理及其使用方法。

我们需要了解游戏引擎的工作原理。

在Unity中,游戏引擎会以一定的帧率来刷新画面,通常为每秒60帧(FPS)。

每一帧的时间间隔称为deltaTime(Δt),它表示上一帧和当前帧之间的时间差。

游戏引擎会在每一帧中更新所有的游戏物体,包括它们的位置、旋转、动画等等。

在Unity中,Update函数是一个在每一帧都会被调用的函数。

它适合处理与时间相关的逻辑,比如键盘输入、鼠标操作、移动物体等。

在Update函数中,我们可以通过检测键盘输入来控制游戏物体的移动方向和速度。

例如,我们可以利用Input.GetAxis函数获取玩家输入的方向键,并根据每一帧的deltaTime来更新物体的位置。

然而,Update函数的调用频率与帧率有关,如果帧率过低,游戏物体的移动就会变得不连贯,甚至出现跳帧的情况。

为了解决这个问题,Unity引入了FixedUpdate函数。

FixedUpdate函数是一个固定时间间隔被调用的函数,通常为每秒50次(FixedFPS)。

与Update函数不同,FixedUpdate函数的调用频率是恒定的,不会受到帧率的影响。

因此,它适合处理与物理相关的逻辑,比如刚体的受力和碰撞检测等。

在使用FixedUpdate函数时,我们需要注意一些细节。

首先,因为FixedUpdate函数的调用频率是固定的,所以deltaTime的值也是固定的,通常为0.02秒。

这意味着我们不能直接使用deltaTime来计算物体的移动距离,而是需要根据FixedUpdate函数的调用频率来进行调整。

其次,由于FixedUpdate函数的调用频率与帧率无关,所以它不适合处理与时间相关的逻辑,比如动画的播放和粒子效果的更新。

Informatica 常用组件使用方法

Informatica 常用组件使用方法

常用组件使用方法表1中列出的是informatica中的所有组件。

不会在本文档中出现的会在组件名后标出。

表1Lookup概要描述获得一个关联的值。

例如:源里包含employee ID,但你还需要employee name。

用于计算的植。

例如:只是汇率或者个人所得税之类的固定数值,不是计算得出来的数据。

Update slowly changing dimension tables。

主要是根据条件查出原表,若查出了,就把自己添加的标志位设为真,否则就设置为假。

Connected or unconnectedConnected 和unconnected 的transformations的输入和输出是不同的,不同点如表2列出的。

表2Connected下面是Integration Service处理connected Lookup transformation的过程:1.一个connected Lookup transformation通过pipeline从其他的transformation获得输入值。

2.为每个输入行,Integration Service会通过lookup ports 和condition从源或者缓存中查询。

3.如果组件没有使用缓存或者使用的静态缓存,Integration Service会使用lookupquery来返回值。

4.如果组件使用的动态缓存,当Integration Service在缓存找不到这行,它会把这行插入到缓存中。

当Integration Service找到这行,它会修改这行在缓存中或者什么都不做。

它标记这行是插入、修改或者是不做变动。

5.Integration Service从查询中返回值到下一个transformation。

如果transformation使用动态缓存,你可以把这行通过Filter 或者Router transformation来过滤后在到目标中。

管理信息系统战略规划的常用方法

管理信息系统战略规划的常用方法

管理信息系统战略规划的常用方法制定MIS战略规划的方法有多种,主要有关键成功因素法(Critical Success Factors, CSF)、战略目标集转化法(Strategy Set Transformation,SST)和企业系统规划法(Business System Planning, BSP)等三种。

还有几种用于特殊情况,或者作整体规划的一部分使用,如企业信息分析与集成技术(BIAIT )、产出/方法分析 (E/MA )、投资回收法(ROI)、征费法(Chargeout)、零线预算法、阶石法等。

一、关键成功因素法(CSF)1970年哈佛大学William Zani 教授在MIS模型中用了关键成功变量,这些变量是确定MIS成败的因素。

过了10年,麻省理工学院John Rockart教授把CSF提高成为MIS的战略。

应用这种方法,可以对企业成功的重点因素进行辨识,确定组织的信息需求,了解信息系统在企业中的位置。

所谓的关键成功因素,就是关系到组织的生存与组织成功与否的重要因素,它们是组织最需要得到的决策信息,是管理者重点关注的活动区域。

不同组织、不同的业务活动中的关键成功因素是不同的,即使在同一组织同一类型的业务活动中,在不同的时期,其关键成功因素也有所不同。

因此,一个组织的关键成功因素应当根据本组织的判断,包括企业所处的行业结构、企业的竞争策略、企业在本行业中的地位、市场和社会环境的变动等。

CSF是通过分析找出企业成功的关键因素,然后再围绕这些关键因素来确定系统的需求,并进行规划。

其步骤如下:(1)了解企业和信息系统的战略目标。

(2)识别影响战略目标的所有成功因素。

(3)确定关键成功因素。

(4)识别性能指标识别和标准。

确定关键成功因素所用的工具是树枝因果图。

例如,某企业有一个目标,是提高产品竞争力,可以用树枝图画出影响它的各种因素,以及影响这些因素的子因素,见图4.2.1所示。

图4.2.1 树枝图如何评价这些因素中哪些因素是关键成功因素,不同的企业是不同的。

unity update原理

unity update原理

unity update原理Unity Update 原理解析什么是 Unity Update?在 Unity 引擎中,Update 是指一种用于更新游戏逻辑的函数。

它是 Unity 内置函数之一,可以在 MonoBehaviour 类中重写。

当游戏进入每一帧时,Unity 引擎会自动调用 Update 函数,从而让开发者能够在游戏运行过程中实时更新游戏对象的行为。

Unity Update 的执行顺序在 Unity 引擎中,Update 的执行顺序是按照脚本的挂载顺序来确定的。

即先挂载的脚本会先执行 Update 函数,后挂载的脚本则会在其后执行。

这样的执行顺序在某些情况下可能会导致游戏逻辑的混乱,所以开发者需要注意脚本的挂载顺序。

Update 函数的用途Update 函数在游戏开发过程中有着广泛的应用。

它可以用于处理用户输入、控制角色移动、更新游戏状态等等。

以下是一些常见的 Update 函数用途示例: - 根据用户输入更新游戏对象的位置和旋转 - 检测碰撞并处理碰撞事件 - 更新游戏关卡的状态 - 控制游戏对象的动画状态运用时间间隔来控制 Update 的执行在 Update 函数中,Unity 引擎会传入一个时间间隔参数,用于指示距离上次 Update 函数调用经过了多长时间。

开发者可以根据这个时间间隔来控制游戏逻辑的更新速度。

以下是一个示例代码,展示了如何使用时间间隔来控制角色每秒钟移动的距离:float speed = ; // 角色移动的速度void Update(){float distancePerFrame = speed * ;( * distancePerFrame);}FixedUpdate 函数除了 Update 函数,Unity 还提供了另一个函数叫做FixedUpdate。

与 Update 函数不同,FixedUpdate 的执行时间是固定的,不受帧率的影响。

在某些情况下,使用 FixedUpdate 函数可能更加合适。

ETL全量与增量总结

ETL全量与增量总结

Informatica PowerCenter 8.6 全量与增量总结ζ太阳团队ξ文档变更记录目录ETL全量与增量 (3)设置Oracle连接 (3)设置时间变量 (3)ETL全量 (4)整个过程预览 (4)2创建一个Mapping (4)3源与目标的导入 (5)导入源 (5)导入目标表 (6)4 组建Mapping (7)打开源节点 (7)插入“表达式组件” (7)添加字段 (7)添加字段或修改字段类型 (7)添加目标表 (8)添加删除条件 (8)连接目标表 (9)ETL增量 (10)整个过程预览 (10)组建Mapping (10)添加Lookup Transformation (10)时间戳的定义 (11)Epression transformation设置 (12)添加Update Strategy Transformation (12)测试 (13)注意事项全量 (15)全量 (15)注意事项增量 (16)ETL全量与增量设置Oracle连接在\oracle\product\10.2.0\db_1\network\ADMIN路径下,双击文件,对oracle连接进行配置。

例如:ods = (DESCRIPTION=(FAILOVER = yes)(ADDRESS = (PROTOCOL = TCP)(HOST =10.100.20.11)(PORT = 1521))(ADDRESS = (PROTOCOL = TCP)(HOST =10.100.20.13)(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = cedb)))这个是ODS的连接地址。

设置时间变量点击Mapping,选择,在点击。

ETL全量ETL全量,即将源库里的数据全部导进目标库,其重要注意的是,可能要添加'ETL_DATE'这个字段。

Informatica学习日记(转 很好)

Informatica学习日记(转 很好)

一、 1. INFORMATICA CLIENT的使用1.1 Repository Manager 的使用1.1.1 创建Repository。

前提: a. 在ODBC数据源管理器中新建一个数据源连接至你要创建Repository的数据库(例:jzjxdev)b. 要在你要连接的数据库中新建一个用户(例:name: ETL password: ETL)现在你可以创建一个Repository了。

选择Repository –Create Repository,输入Repository Name(例:JZJX),Database,Username(例:etl),Database Password(例:etl),ODBC Data Source(例:jzjxdev),Native Connect String(数据库所在ip例:141.20.52.108)。

1.1.2 添加Repository。

通过这一步你可以添加别人已经建好的Repository。

选择Repository –Add Repository,输入Repository Name(例:JZJX),Username(例:etl),点击ok就可以看到名为JZJX的Repository在左边的浏览器中,但是此时还看不到它的内容,要看到它的内容或者对它进行操作必须先连接它。

1.1.3 添加Folder选择Folder – Create,输入文件夹名称即可。

1.2 Designer 的使用首先连接Repository,可以看到该Repository在Repository Manager 中创建的文件夹。

1.2.1 SourcesSources文件夹下的表是抽取的来源表。

导入方法:选择Tools菜单下的Source Analyzer,然后选择Sources菜单下的Import from database,连接想要连接的数据库,连接上后选择你要抽取的表点击ok你所选择的表就会出现在Sources文件夹下。

Unity学习——变换(Transform)组件

Unity学习——变换(Transform)组件

Unity学习——变换(Transform)组件介绍变换(Transform)组件确定场景中每个对象的“位置(Position)”、“旋转(Rotation)”和“缩放(Scale)”。

每⼀个游戏对象(GameObject)都有⼀个变换(Transform)组件。

属性位置:变换组件在X、Y、Z轴上的位置(后⾯将解释为什么不说是物体的轴上的位置信息)旋转:变换组件绕X、Y、Z轴所旋转的度数缩放:变换组件沿X、Y、Z轴上的缩放,值为1时则为原始⼤⼩(被导⼊或创建时物体的⼤⼩)注意:变换的位置、旋转以及缩放是相对于该物体的(变换组件的)⽗级测量的。

当没有⽗级时则在世界坐标下显⽰其属性。

相关脚本(注:代码块上⽅是属性或⽅法的作⽤域、数据类型和访问权限(get/set),代码块中是具体的使⽤⽅法)属性public int childCount { get; }transform.childCount物体的(变换组件的)⼦对象的数⽬(不包括⾃⾝)public Vector3 eulerAngles { get; set; }transform.eulerAngles物体旋转属性的以度为单位的欧拉⾓(即与变换组件中旋转的三个量相对应)public Vector3 forward { get; set; }transform.forward世界空间中,物体的(变换组件的)z轴应当注意当物体旋转⾓度后,其⾃⾝的坐标轴也随之变换,使⽤“transform.forward”可以获取物体当前⾃⾝坐标系(Local⽽⾮Global)的z轴public bool hasChanged { get; set; }transform.hasChanged⾃从上⼀次"hasChanged"被设为false后,变换组件是否发⽣了变化?应注意其默认值为true。

因此需⼿动设置为false后进⾏检测。

当其改变为true后,其真值不会⾃⾝改变为falsepublic int hierarchyCapacity { get; set; }transform.hierarchyCapacity变换在层级中数据结构的变换能⼒即⽬前该物体在Hierarchy窗⼝中对应的树的可容纳最⼤结点数应注意其数值会随着结点数的增加⽽扩容,因此对于需要频繁增加⼦物体的物体,可以事先设置该值⽐预计的最⼤值⾼⼀点,以避免反复修改此值造成的性能降低public int hierarchyCount { get; }transform.hierarchyCount变化在层级中数据结构的所包含的变换组件数⽬即物体及其⼦物体所包含的变换组件的总数⽬public Vector3 localEulerAngles { get; set; }transform.localEulerAngles物体的相对于⽗级所旋转的欧拉⾓如需设置请注意使⽤正值且不要超过360度public Vector3 localPosition { get; set; }transform.localPosition物体相对于⽗级的位置,没有⽗级则与世界坐标下⼀致public Quaternion localRotation { get; set; }transform.localRotation物体相对于⽗级的旋转属性public Vector3 localScale { get; set; }transform.localScale物体相对于⽗级的缩放属性public Matrix4x4 localToWorldMatrix { get; }transform.localToWorldMatrix将点从局部空间转换为世界空间的矩阵public Vector3 lossyScale { get; }transform.lossyScale世界坐标系下物体的缩放属性注意当物体的⽗级进⾏了缩放并且该物体旋转后,该值不再准确public Transform parent { get; set; }transform.parent物体的⽗级的变换属性public Vector3 position { get; set; }transform.position物体在世界坐标系下的位置属性public Vector3 right { get; set; }transform.right世界空间中,物体的(变换组件的)x轴应当注意当物体旋转⾓度后,其⾃⾝的坐标轴也随之变换,使⽤“transform.right”可以获取物体当前⾃⾝坐标系(Local⽽⾮Global)的x轴public Transform root { get; }transform.root返回物体所在层级结构的根的变换属性,没有⽗级则为⾃⾝public Quaternion rotation { get; set; }transform.rotation物体在世界坐标系下的变换属性,以四元数形式存储注意它并不与变换组件中对应的旋转的三个属性对应(可以使⽤transform.eulerAngles进⾏修改)它的值⼩于180度public Vector3 up { get; set; }transform.up世界空间中,物体的(变换组件的)y轴应当注意当物体旋转⾓度后,其⾃⾝的坐标轴也随之变换,使⽤“transform.right”可以获取物体当前⾃⾝坐标系(Local⽽⾮Global)的y轴public Matrix4x4 worldToLocalMatrix { get; }transform.worldToLocalMatrix将点从世界空间转换为局部空间的矩阵公开⽅法public void DetachChildren();transform.DetachChildren()将物体的所有⼦对象都与其取消⽗⼦关系public Transform Find(string n);参数string n:要找到的⼦物体的名字返回值如果找到了该孩⼦,则返回其变换组件,否则返回nulltransform.Find("ChildName");transform.Find("ChildName/GrandChildName");通过名字n找到物体的⼦对象的变换组件注意以上⽤法只适⽤于⼦物体⽽不适⽤与孙物体或更多层级下的物体查找如需查找更低层级的物体,可以像路径名⼀样进⾏查找,如第⼆⾏所⽰public Transform GetChild(int index);参数int index:⼦物体对应的索引返回值索引对应的⼦物体的变换组件transform.GetChild(0);//找到第⼀个⼦物体变换组件transform.GetChild(0).GetChild(0);//找到第⼀个⼦物体的第⼀个⼦物体的变换组件⼦物体的索引在层级窗⼝从上⾄下由0开始递增public int GetSiblingIndex();返回值⼦物体相对于⽗物体的索引值transform.GetSiblingIndex();获取物体在层级窗⼝下的索引,即是其⽗物体的从上之下的第⼏个物体(从0开始)注意⽆⽗物体时,则会在层级窗⼝最外层从上⾄下由0开始排列public Vector3 InverseTransformDirection(Vector3 direction);参数Vector3 direction:表⽰某个⽅向的三维向量返回值物体⾃⾝坐标系下direction的⽅向向量transform.InverseTransformDirection(Vector3.forward);//将世界坐标系下的z轴⽅向转换为物体⾃⾝坐标系下的⽅向将direction由世界坐标系转换为物体的⾃⾝坐标系下的向量表⽰public Vector3 InverseTransformDirection(float x, float y, float z);参数float x, float y, float z:表⽰⽅向的三个轴上的参数返回值物体⾃⾝坐标系下(x,y,z)的⽅向向量transform.InverseTransformDirection(0, 0, 1);将(x,y,z)由世界坐标系转换为物体的⾃⾝坐标系下的向量表⽰public Vector3 InverseTransformPoint(Vector3 position);参数Vector3 position:表⽰某个点(位置)的三维向量返回值物体⾃⾝坐标系下position的位置向量transform.InverseTransformPoint(Camera.main.transform.position);//将世界坐标系下的主相机的位置转换为物体⾃⾝坐标系下的位置(即与相机的相对位置)将position由世界坐标系转换为物体的⾃⾝坐标系下的向量表⽰public Vector3 InverseTransformPoint(float x, float y, float z);参数float x, float y, float z:表⽰某个点(位置)的三个轴上的参数返回值物体⾃⾝坐标系下(x,y,z)的位置向量transform.InverseTransformPoint((0,0,0));将(x,y,z)由世界坐标系转换为物体的⾃⾝坐标系下的向量表⽰注意这个函数会受到缩放的影响public Vector3 InverseTransformVector(Vector3 vector);Vector3 vector:某个向量返回值物体⾃⾝坐标系下某个向量的表⽰transform.InverseTransformVector(Vector3.forward);//将世界坐标系下的z轴⽅向转换为物体⾃⾝坐标系下的⽅向将vector由世界坐标系转换为物体的⾃⾝坐标系下的向量public Vector3 InverseTransformVector(float x, float y, float z);参数float x, float y, float z:表⽰某个向量的三个轴上的参数返回值物体⾃⾝坐标系下(x,y,z)的转换后的向量transform.InverseTransformVector((0,0,0));将(x,y,z)由世界坐标系转换为物体的⾃⾝坐标系下的向量注意这个函数会受到缩放的影响public bool IsChildOf([NotNull] Transform parent);参数[NotNull] Transform parent:⽗对象的变换属性,空值时会提⽰错误返回值若该对象是parent的⼦对象或更深层次的对象,则返回true;否则返回falsetransform.IsChildOf(parent.transform);判断⼀个物体是否是parent的⼦物体或更深层的物体public void LookAt(Transform target, [DefaultValue("Vector3.up")] Vector3 worldUp);参数Transform target:物体所看向的变换属性[DefaultValue("Vector3.up")] Vector3 worldUp:所指定的向上的向量,默认值为Vector3.up,即(0,1,0)transform.LookAt(target.transform);transform.LookAt(target.transform,Vector3.down);旋转变换组件,使得指向前⽅的向量指向⽬标位置确定向前的向量(蓝轴)后,需要确定绕蓝轴旋转的⾓度,这⾥使⽤⼀个表⽰物体上⽅向的向量来约束,注意这个参数是⾮强制性⽽是以引导的作⽤旋转变换组件(优先确保先指向⽬标位置)public void LookAt(Vector3 worldPosition, [DefaultValue("Vector3.up")] Vector3 worldUp);参数Vector3 worldPosition:物体所看向的位置[DefaultValue("Vector3.up")] Vector3 worldUp:所指定的向上的向量,默认值为Vector3.up,即(0,1,0)transform.LookAt(target.transform.position);transform.LookAt(target.transform.position,Vector3.down);此重载函数与上⽅类似,不再赘述public void Rotate(Vector3 eulers, [DefaultValue("Space.Self")] Space relativeTo);Vector3 eulers:旋转所绕的表⽰轴的向量(在世界坐标系下;考虑模长)[DefaultValue("Space.Self")] Space relativeTo:确认旋转轴是在世界坐标下还是⾃⾝坐标下,默认值是在⾃⾝坐标系下transform.Rotate(Vector3.up,Space.World);//绕世界坐标系下的(0,1,0)⽅向,每帧旋转1度绕eulers对应的轴进⾏旋转,relativeTo确定在世界还是⾃⾝坐标系下public void Rotate(float xAngle, float yAngle, float zAngle, [DefaultValue("Space.Self")] Space relativeTo);参数float xAngle, float yAngle, float zAngle:旋转所绕向量的三个轴上的信息(在世界坐标系下;考虑模长)[DefaultValue("Space.Self")] Space relativeTo:确认旋转轴是在世界坐标下还是⾃⾝坐标下,默认值是在⾃⾝坐标系下transform.Rotate(0,5,0,Space.World);//绕世界坐标系下的(0,1,0)⽅向,每帧旋转5度绕(x,y,z)对应的轴进⾏旋转,relativeTo确定在世界还是⾃⾝坐标系下public void Rotate(Vector3 axis, float angle, [DefaultValue("Space.Self")] Space relativeTo);参数Vector3 axis:所旋转的轴(不考虑模长)float angle:每帧旋转的⾓度[DefaultValue("Space.Self")] Space relativeTo:确认旋转轴是在世界坐标下还是⾃⾝坐标下,默认值是在⾃⾝坐标系下transform.Rotate(Vector3.up * 5, 1, Space.World);//绕世界坐标系下的(0,1,0)⽅向,每帧旋转1度以给定⾓度定义的度数旋转对象public void RotateAround(Vector3 point, Vector3 axis, float angle);参数Vector3 point:旋转的中⼼点Vector3 axis:旋转轴float angle:每帧旋转⾓度transform.RotateAround(Vector3.zero, Vector3.up, 1);//绕世界坐标原点,(0,1,0)的⽅向,每帧1度的速度进⾏旋转public void SetAsFirstSibling();transform.SetAsFirstSibling();将物体移动⾄所在层级的⾸位public void SetAsLastSibling();transform.SetAsLastSibling();将物体移动⾄所在层级的末位public void SetParent(Transform p);public void SetParent(Transform parent, bool worldPositionStays);参数Transform p/Transform parent:⽗对象的变换属性bool worldPositionStays:⽗对象变换属性是否保持原来不变transform.SetParent(parent.transform);transform.SetParent(parent.transform, false);设置物体的⽗对象当worldPositionStays设为false时,设置⽗⼦关系之后,⼦对象的transform组件保持与未建⽴关系之前⼀致;否则物体的在世界坐标下的位置保持不变public void SetPositionAndRotation(Vector3 position, Quaternion rotation);transform.SetPositionAndRotation(Vector3.zero, Quaternion.Euler(Vector3.up));//将物体设置为坐标原点,旋转⾓度设为(0,1,0)设置物体在世界坐标下的位置与旋转public void SetSiblingIndex(int index);参数int index:要设置的索引transform.SetSiblingIndex(1);设置物体所在在层级中的索引,同时会真正改变层级窗⼝中的位置public Vector3 TransformDirection(Vector3 direction);参数Vector3 direction:表⽰某个⽅向的三维向量返回值世界坐标系下direction的⽅向向量transform.TransformDirection(Vector3.forward);//将⾃⾝坐标系下的z轴⽅向转换为世界坐标系下的⽅向将direction由⾃⾝坐标系转换为世界坐标系下的向量表⽰public Vector3 TransformDirection(float x, float y, float z);参数float x, float y, float z:表⽰⽅向的三个轴上的参数返回值世界坐标系下(x,y,z)的⽅向向量transform.TransformDirection(0, 0, 1);将(x,y,z)由⾃⾝坐标系转换为世界坐标系下的向量表⽰public Vector3 TransformPoint(Vector3 position);参数Vector3 position:表⽰某个点(位置)的三维向量返回值世界坐标系下position的位置向量transform.TransformPoint(Camera.main.transform.position);//将物体坐标系下的主相机的位置转换为坐标系下的位置将position由⾃⾝坐标系转换为世界坐标系下的向量表⽰public Vector3 InverseTransformPoint(float x, float y, float z);参数float x, float y, float z:表⽰某个点(位置)的三个轴上的参数返回值世界坐标系下(x,y,z)的位置向量transform.TransformPoint((0,0,0));将(x,y,z)由⾃⾝坐标系转换为世界坐标系下的向量表⽰注意这个函数会受到缩放的影响public Vector3 TransformVector(Vector3 vector);参数Vector3 vector:某个向量返回值世界坐标系下某个向量的表⽰transform.TransformVector(Vector3.forward);//将物体⾃⾝坐标系下的z轴⽅向转换为世界坐标系下的⽅向将vector由物体坐标系转换为世界的坐标系下的向量public Vector3 TransformVector(float x, float y, float z);参数float x, float y, float z:表⽰某个向量的三个轴上的参数返回值世界坐标系下(x,y,z)的转换后的向量transform.TransformVector((0,0,0));将(x,y,z)由物体⾃⾝坐标系转换为世界坐标系下的向量注意这个函数会受到缩放的影响public void Translate(Vector3 translation, [DefaultValue("Space.Self")] Space relativeTo);参数Vector3 translation:移动⽅向(考虑模长)[DefaultValue("Space.Self")] Space relativeTo:相对⾃⾝或世界坐标系移动,默认为⾃⾝坐标系transform.Translate(Vector3.forward,Space.World);//沿着世界坐标系下的前进⽅向,按每帧1单位的速度平移物体沿translation的⽅向,以Space relativeTo的坐标系,根据translation的速度进⾏平移public void Translate(float x, float y, float z, [DefaultValue("Space.Self")] Space relativeTo);参数float x, float y, float z:移动⽅向在三个轴上的属性[DefaultValue("Space.Self")] Space relativeTo:相对⾃⾝或世界坐标系移动,默认为⾃⾝坐标系transform.Translate(0, 0, 1,Space.World);沿(x,y,z)的⽅向,以Space relativeTo的坐标系,(x,y,z)速度进⾏平移public void Translate(Vector3 translation, Transform relativeTo);public void Translate(float x, float y, float z, Transform relativeTo);参数Vector3 translation:移动⽅向(考虑模长)float x, float y, float z:移动⽅向在三个轴上的属性relativeTo:相对移动的变换属性transform.Translate(Vector3.up, Camera.main.transform);//相对相机,向上⽅进⾏移动transform.Translate(0,1,0,Camera.main.transform);//相对相机,向上⽅进⾏移动相对relativeTo的transform属性进⾏移动relativeTo为空时,则相对世界坐标移动。

transformation结构讲解

transformation结构讲解

transformation结构讲解一、商业领域中的transformation在商业领域中,transformation通常指的是企业的转型升级。

随着市场环境、消费者需求和技术进步的变化,企业需要不断适应和改变,以保持竞争力。

这种transformation可能涉及产品创新、业务模式变革、组织架构调整等方面。

例如,传统的实体零售商在互联网兴起后面临了巨大的挑战。

为了适应新的消费习惯和市场趋势,许多实体零售商开始进行电商转型。

他们建立了在线购物平台、优化了物流配送系统,并通过数字化营销手段吸引更多的消费者。

这种transformation不仅帮助企业适应了新的市场环境,还提升了企业的效率和竞争力。

二、科技领域中的transformation在科技领域中,transformation常常指的是技术的转变和创新。

科技的迅速发展和进步不仅对商业领域产生了影响,也深刻地改变了我们的生活方式和社会结构。

一个典型的例子是数字化转型。

随着互联网、人工智能、大数据等技术的发展,许多传统行业开始进行数字化转型,将传统的业务流程和模式与新技术相结合。

例如,在医疗领域,许多医院引入了电子病历系统、远程诊断技术和智能医疗设备,提高了医疗服务的效率和质量。

三、社会领域中的transformation在社会领域中,transformation可以指社会结构和价值观念的变革。

社会的发展和进步往往需要对旧有的制度和观念进行改变,以适应新的时代需求和发展方向。

例如,在性别平等领域,许多国家和地区开始进行性别平等的transformation。

他们推动男女平等的法律法规、提高女性教育和就业机会、减少性别歧视等,以实现性别平等的目标。

这种transformation不仅能够提升女性的地位和权益,也有助于社会的和谐发展。

四、个人领域中的transformation除了在组织和社会层面上的transformation,个人也可以通过改变自己的思维方式、学习新技能、培养健康习惯等来进行个人的transformation。

react-rnd updateposition详解

react-rnd updateposition详解

react-rnd的updateposition函数详解及示例
React-rnd 是一个用于在 React 中创建可拖拽、可调整大小的元素的库。

其中的updatePosition 函数用于更新元素的位置。

下面将详细解释该函数的用法,并提供一个示例代码。

1.函数详解:
updatePosition 函数用于更新元素的位置。

它接受一个包含x 和y 坐标的对象作为参数,并更新元素的位置。

函数的语法如下:
参数说明:
●x:要更新的元素的 x 坐标。

●y:要更新的元素的 y 坐标。

2.示例代码:
下面是一个使用updatePosition函数的示例代码:
在上面的示例中,我们首先从react-rnd中导入useRnd钩子。

然后,在MyComponent组件中,我们使用useRnd钩子来获取一个包含当前元素位置的x 和y的对象,以及一个用于拖拽的函数drag。

接下来,我们定义了一个onDragEnd 函数,该函数在拖拽结束时被调用,并使用updatePosition函数来更新元素的位置。

最后,我们使用ref属性将拖拽函数绑定到div元素上,并使用style 属性设置元素的位置。

在div元素内部,我们添加了一个按钮,当点击该按钮时,将调用onDragEnd函数来更新元素的位置。

react数据更新方法

react数据更新方法

react数据更新方法摘要:1.理解React数据更新原理2.React中的数据更新方法3.实战案例与应用4.总结与建议正文:一、理解React数据更新原理React是一个用于构建用户界面的JavaScript库,它的核心理念是通过组件化的方式来构建可复用、可组合的界面。

在React中,数据更新是一个重要环节,理解其原理有助于我们更好地掌握React的使用。

React采用了一种称为“虚拟DOM”的技术来实现数据驱动的界面渲染。

当组件数据发生变化时,React会创建一颗新的虚拟DOM树,对比新老两棵虚拟DOM树之间的差异,然后针对差异部分进行DOM操作,以实现高效的页面更新。

二、React中的数据更新方法1.使用state进行数据更新在React中,可以通过定义state来管理组件的数据。

当组件的状态发生变化时,会自动触发组件的重新渲染。

以下是一个简单的示例:```javascriptclass Counter extends ponent {constructor(props) {super(props);this.state = {count: 0};}increment = () => {this.setState((prevState) => ({count: prevState.count + 1}));};render() {return (<div><p>Count: {this.state.count}</p><button onClick={this.increment}>Increment</button> </div>);}}```2.使用props进行数据传递在React中,可以通过props将数据从父组件传递给子组件。

当子组件需要更新数据时,可以通过更新props来实现数据更新。

以下是一个简单的示例:```javascriptclass ChildComponent extends ponent {render() {return (<div><p>Parent data: {this.props.data}</p></div>);}}class ParentComponent extends ponent {render() {return (<div><ChildComponent data="Hello, React" /></div>);}}```3.使用useState和useEffect进行数据更新在React Hooks中,可以使用useState和useEffect来管理组件的状态和副作用。

updateingeneric 方法

updateingeneric 方法

updateingeneric 方法
更新是软件开发中不可避免的过程,因为随着时间的推移,需求和用户需求的变化,软件需要不断地进行改进和更新。

而更新通用方法也是软件开发中常见的问题。

在更新通用方法中,我们需要考虑以下几个方面:
1. 确定更新的目的和范围:在更新之前一定要清楚地了解到需要更新的内容是什么,更新的目的是什么,以及更新的范围是多大。

2. 制定详细的计划:在更新之前需要制定详细的更新计划,确定更新的时间、更新的步骤、更新的人员等等。

3. 备份数据:在更新之前务必备份好数据,以防止数据丢失。

4. 测试更新:在更新之后,我们需要进行测试,以确保更新后的软件能够正常工作,没有出现新的问题。

5. 宣传和培训:在更新之后,我们需要宣传和培训,以便用户能够了解新的功能和改进,以及如何使用。

总之,更新通用方法是一个需要认真考虑和执行的过程,只有这样才能确保软件的稳定和持续发展。

- 1 -。

[管理工具-战略管理]SST战略目标集转移法(StrategySetTransformation)

[管理工具-战略管理]SST战略目标集转移法(StrategySetTransformation)

SST战略目标集转移法(Strategy Set Transformation)战略目标集转化法简介战略目标集转化法是William King于1978年提出的,他把整个战略目标看成“信息集合”,由使命、目标、战略和其它战略变量组成,MIS的战略规划过程是把组织的战略目标转变为MIS战略目标的过程。

战略目标集转化法的步骤第一步是识别组织的战略集,先考查一下该组织是否有成文的战略式长期计划,如果没有,就要去构造这种战略集合。

可以采用以下步骤:①描绘出组织各类人员结构,如卖主、经理、雇员、供应商、顾客、贷款人、政府代理人、地区社团及竞争者等。

②识别每类人员的目标。

③对于每类人员识别其使命及战略。

第二步是将组织战略集转化成MIS战略,MIS战略应包括系统目标、约束以及设计原则等。

这个转化的过程包括对应组织战略集的每个元素识别对应的MIS战略约束,然后提出整个MIS的结构。

最后,选出一个方案送总经理。

SST方法、CSF方法、BSP方法的比较CSF方法能抓住主要矛盾,使目标的识别突出重点。

用这种方法所确定的目标和传统的方法衔接得比较好,但是一般最有利的只是在确定管理目标上。

SST方法从另一个角度识别管理目标,它反映了各种人的要求,而且给出了按这种要求的分层,然后转化为信息系统目标的结构化方法。

它能保证目标比较全面,疏漏较少,但它在突出重点方面不如前者。

BSP方法虽然也首先强调目标,但它没有明显的目标引出过程。

它通过管理人员酝酿“过程”引出了系统目标,企业目标到系统目标的转换是通过组织/系统、组织/过程以及系统/过程矩阵的分析得到的。

这样可以定义出新的系统以支持企业过程,也就把企业的目标转化为系统的目标,所以我们说识别企业过程是BSP战略规划的中心,绝不能把BSP方法的中心内容当成U/C矩阵。

我们把这三种方法结合起来使用,把它叫CSB方法即(CSF,SST和BSP结合)。

这种方法先用CSF 方法确定企业目标,然后用SST方法补充完善企业目标,并将这些目标转化为信息系统目标,用BSP方法校核两个目标,并确定信息系统结构,这样就补充了单个方法的不足。

ETL抽取工具Informatica介绍-1

ETL抽取工具Informatica介绍-1
VANDA SYSTEMS & COMMUNICATIONS HOLDINGS LIMITED
PowerCenter内置的部分转换组件
• ������ Lookup:查找相关的值并且传送给其他的对象 • ������ Joiner:关联异构数据源 • ������ Stored Procedure:调用存储过程并且获取返回值 • ������ External Procedure: 从共享库中调用一个外部的用户定
• Workflow Monitor:监控Workflow和Session运行情况,生成日志 和报告
• Repository Manager:资料库管理,包括安全性管理等,元数据维护 和安全操作,如:元数据查找,用户、组、权限管理等。
• Repository Server Administrator Console:对知识库的操作,如: 知识库的创建、备份、恢复等。
VANDA SYSTEMS & COMMUNICATIONS HOLDINGS LIMITED
2个Server
• Informatica Repository Server:资料库Server, 管理ETL过程中产生的元数据 用来管理所有对资料库中元数据的请求和操作。
• Informatica Server:实际的ETL引擎
VANDA SYSTEMS & COMMUNICATIONS HOLDINGS LIMITED
Informatica公司其他产品
• PowerAnalyzer:BI前端工具,用于数据展现,内 置了170多种分析报表,用于元数据的浏览和分析
• PowerExchange:适用于连接主机数据,实时数据 和CDC数据处理
VANDA SYSTEMS & COMMUNICATIONS HOLDINGS LIMITED
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Update Strategy Transformation
Transformation type: Active 、Connected
如何设置Update Strategy :
使用如下步骤来定义一个修改策略:
●加入一个Update Strategy transformation到mapping的目的是控制怎样处理一个被标记
的行,在mapping中是插入,修改,删除,或者抛弃。

●当你配置session时,怎样对待标记行。

你可以标记所有的行为插入,删除,或者修改,
或者你可以选择data driven选项,这意味着Integration Service按照Update Strategy transformations中的编码来执行。

●当你在session中配置插入,修改和删除选项时,它是对每个目标都起作用的。


target-by-target basis,你可以允许或者不允许插入和删除,并且你可以选择三种方法来捕捉修改,基于对session的修改策略的设置。

为Session设置修改策略:
当你配置一个session,你有一些选项来处理特定的数据库,包括修改。

为所有行指定操作:
当你配置一个session时,你可以为一个数据库选择一个对所有行的操作,使用Treat Source Rows As选项。

配置Treat Source Rows在属性tab:
为个别的目标表指定操作:
一旦你决定了在session中怎样处理所有的行,你也需要为单个的目标设置修改策略。

在ession properties的Mapping tab中的Transformations view定义修改策略。

如下图:
你可以设置如下修改策略选项:
Insert.选择该选项。

把一行插入目标表。

Delete.选择该选项。

从表删除一行。

Update.你可以使用如下的选项:
Update as Update.修改已存在的行。

Update as Insert..插入一行作为修改。

Update else Insert.如果存在就修改,否则,插入它。

Truncate table. 在读取数据前,先truncate 目标表。

Mapping级:
修改策略表达式:
择一个)。

这样,就有3个地方可以控制数据加载的类型,鉴于以上用Update Strategy处理方式(目标表有则更新,无则插入)我以前的做法一直是这样的,不用这个组件,session:Properties这个tab中有这个Attribute:Treat source rows as 选则Update,session:Mapping这个tab中对应的目标表有这个Attribute:选中Insert,Update else Insert同样可以达到想要的效果。

最近总会被同事问及到这个问题,其实我也有点迷糊,也找了些资料我曾在网上找了个文档写的蛮好的,也很能迷惑人(注:《Informatica Update 机制详解》)
总结下,是这样的:
1,在session:Properties这个tab中有这个Attribute:Treat source rows as有4个选项Insert,Update,Delete,Data Divern,其实这个地方才是最开始的数据加载方式,这里从Source表中出来的数据进行置位,也就是说在Mapping中SQ这个组件过后的数据rowtype就已经通过该地方被设置过了。

2,在Mapping中遇到Update Strategy时,这个组件会根据条件,对数据加以区分,有DD_UPDATE, DD_INSERT, DD_DELETE这样的几种rowtype,当然这个时候没有被选中的数据rowtype是不会被更改的,依旧是1中设置的状态(如有疑问可以用debug,查看)。

3,最后在session:Mapping这个tab中对应的目标表有这个Attribute,这个是控制目标的加载方式,其实有点类似,有对目标表Insert Update,
Delete的权限一样,这里默认选中了Insert,Update as Update,Delete 其实相当于给出了Insert Update,Delete这个三个权限。

Update as Update 就是以更新的方式更新,至于Update as Insert,是只对更新的数据记录以插入的方式放入目标表,Update else Insert这个是有数据需要更新的进行更新,对新数据(主键记录条数)进行插入,当然这个时候如果有新的数据Insert这个选项一定也是要选中的,否则新数据会被拒绝掉。

(其实这就相当于你想往表里面插入数据,但你对表没有插入权限)
注:在设计mapping 中如果已经用到Update Strategy这个组件了,那么后面的在session:Properties这个tab中有这个Attribute:Treat source rows as也就被定格在Data Divern这个选项了。

相关文档
最新文档