自定义单据(高级)U9客户化开发支持部杨旭2009年 6月12日课程编号:课程概述后台组件编程基础前台组件编程基础专题研究主题课程概述后台组件编程基础前台组件编程基础专题研究主题课程概述课程目标在《自定义单据(初级)》课程基础之上,理解前后台编程接口和编程方法,深入挖掘单据开发功能课程内容内容涵盖前后台模型开发,前后台编程基础;听课基础自定义单据(初级),OQL语言,C#项目开发考查目标课程概述后台组件编程基础前台组件编程基础专题研究主题实体对外结构的基础组成实体的Key(强类型的EntityKey)实体的查询类Finder实体的强类型集合EntityList实体的资源属性和强类型访问属性的辅助类EntityRes实体的OriginalData实体的状态SysStateSessionSession的概念在现在UBF中,Session的本意是work unit,即持久层的一个边界,非常轻,主要用作批量提交,并标识这次批量提交的边界,不涉及到事务等概念。当前ISession可以通过Session的Current属性获得,每调用一次Session的Open方法,Current属性都会被更新Session的使用using(ISession session = Session.Open ()){...session.Commit();//提交更改,但只是Session范围内的修改更新}Session嵌套当发生session嵌套的情况时,每次提交都是真正提交示例:using(ISession session1 = Session.Open ()){...using(ISession session2 = Session.Open ()){...session2.Commit();//提交更改,但只是Session2范围内的修改更新}session1.Commit();//提交更改,只处理Session1的修改更新}实体新建新建实体实体的操作分为主实体的新建和非主实体的新建,如果是主实体新建,用不带参数的Create方法,如果是非主实体的,用带上级实例参数的Create方法。举例:using (ISession session = Session.Open()){A_Com1c1 objA = A_Com1c1.Create();objA.Code_A_Com1c1 = 1000;objA.Name_A_Com1c1 = "objA“;B_Com1c1 objB = B_Com1c1.Create(objA)//B为A的子实体objB.Code_B_Com1c1 = 1001;objB.Name_B_Com1c1 = “objB”;session.Commit();}最好在Session中创建实体更新using(ISession session = Session.Open ()){Customer obj = Customer.Finder.FindByID(id);if(obj!=null)obj.Name = "new name";session.Modify(obj);... ...session.Commit();}实体删除对于组合关系,如果删除主实体,那么,主实体下面的所有子实体,孙实体会被级联删除, 对于非主实体的删除,可以用子集合的RemoveAt和Remove(entity)方法,这2个方法等价,例如using (ISession session = Session.Open()){A_Com1cNobjA = A_Com1cN.Finder.FindByID(aID);objA.B_Com1cN.RemoveAt(0);//或用下面的方式:B_Com1cN b = Com1cN.Finder.FindByID(bID);objA.B_Com1cN.Remove(b);session.Commit();}实体查询方式实体的查询类FinderEntityDataQueryEntityQueryEntityViewQuery实体查询实体的查询类Finder返回强类型的对象常用方法:Find,FindByID,FindAll举例OqlParamList pList = new OqlParamList();string strOql = “Code=@Code";pList.Add(new OqlParam(“Code”, “11”));Customer.EntityList list=Customer.Finder.FindAll(strOql, pList.ToArray());实体查询EntityDataQueryEntityDataQuery 主要用于希望返回结果是IDataReader,DataSet,单值的情况创建方式:1、通过Entity对象:EntityDataQuery q = Customer.Finder.CreateDataQuery();2、通过EntityFullName:EntityDataQuery q = new EntityDataQuery("UFIDA.U9.CBO.SCM.Customer.Customer");EntityDataQuery q = new EntityDataQuery(Customer.EntityRes.BE_FullName);返回DataSet:FindDataSet1、全OQL方式DataSet ds =q.FindDataSet(“select ID,Name,Code from UFIDA::U9::CBO::SCM::Customer::Customer");2、条件OQL方式DataSet ds = q.FindDataSet( "ID>1");实体查询EntityDataQuery返回IDataReader :FindDataReader1、全OQL方式IDataReader dr = q.FindDataReader ("select ID,Name,Code from UFIDA::U9:...