用友U9-ERP软件实施宝典5-UBF与客开_第1页
用友U9-ERP软件实施宝典5-UBF与客开_第2页
用友U9-ERP软件实施宝典5-UBF与客开_第3页
用友U9-ERP软件实施宝典5-UBF与客开_第4页
用友U9-ERP软件实施宝典5-UBF与客开_第5页
已阅读5页,还剩331页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

UBFUBF与客开U9U9实施应用宝典—应用篇前言本书内容U9开发平台衔接起来,提高二次开发效率,进而使项目高满意度交付成为一个关键议题。二次开发的角度讲解分析进行简单档案单据开发及报表开发,并辅以实例讲解。本书案例均在U92.0SP2下编译调试通过。U9的部署及常见问题和注意事项。适用于二PC配置,服务器部署请参考实施技术相关。Oql。U9二次开发命名进行了一些约定。UBF开发环境。BE实体建模,UI界面设计,参照设计,BP操作设计,列表开发,单据装配等基本操作。一些关键点。7章,打印个性化。如何将系统的打印模版进行个性化的调整,本章将解答这个疑惑。OBA模版。U9免业务风险和损失、提高企业员工的生产率、提高员工自助服务的能力。及时预警的功能在项阅读本书的对象U9开发顾问U9二次开发顾问,不免都会有一番波折,导致的原因是多方面的,可能是环境部署的,可能是开发规范造成的,还可能是开发平台的缺陷。本书总结环境部署的一些通用性问题及开发命名规范,对于刚入门的初级开发工程师,良好的编程习惯及过程规范是非常必要的。对有开发经验的顾问作为参考手册,仍然具有较大参考价值,如相关引用的说明、模块介API调用说明等。U9实施顾问感谢感谢以下同事为本书的编撰付出的辛勤劳动:王怀亮、郭玉平、李培圣、邢华锋杨旭、杨占军、赵英睿20109月目 录第一章开发环境 1系统环境准备 1系统硬件 1系统软件 1开发环境安装 3安装U9安装服务器 3安装U9应用服务器 4安装管理控制台 5配置U9Portal 6登录管理控制台 6站点服务器配置 7新建企业 9JOB引擎配置 12安装UBF 13产品许可 15本机许可 15网络许可 16数据库的导入、导出 18数据库的导出 18数据导入 20报表服务器配置 26安装运行SqlServerReportingServices 26配置报表服务站点ReportServer 26部署自定义报表的DataCommand 27报表开发环境参数设置 27UBF环境设置 27UBF连接到数据库 28报表开发环境 29连接报表元数据库 31第二章UBF开发平台 32UBF介绍 32应用框架 32应用开发流程 33词汇表 35UBF开发环境参数设置 37UBF环境设置 37UBF连接到数据库 39启动服务 40OQL查询语言 41OQL简介 41简单条件过滤 43复杂报表查询 43OQL查询风格 47用户自定义函数与SQL标准函数 49临时表 49全景体验 51第三章二次开发命名规范 52命名通用规范 52命名方法概述 52使用规范 52U9标准产品发布对象对照表 52命名空间规范 543.2.1概述 54组成要素 54要素说明 55规则与约束 55举例说明 55解决方案规范 553.3.1概述 553.3.2约束规则 563.3.3示例 56项目规范 563.4.1概述 56约束规则 56项目粒度划分规则 563.4.4示例 56装备件规范 573.5.1概述 573.5.2约束规则 573.5.3示例 57组件规范 583.6.1概述 583.6.2约束规则 583.6.3示例 59模型类型规范 613.7.1概述 613.7.2约束规则 613.7.3示例 62数据库相关命名 63第四章单据实例开发 63需求设计 63功能概述: 64UML建模模型 64实体数据: 64用户界面 654.2 实现 66实体建模 66界面设计 82建立UIModel 85创建界面 89参照设计 1014.2.6建模 1264.2.7列表开发 131组装发布 135UBF构造 135组装工具使用 136打开组装工具 138生成SG文件 139应用分组 140组件装配 141页面装配 143菜单装配 149数据发布 151执行批处理文件 154脚本运行 155组件更新 155菜单授权 155本章小结 161第五章报表案例开发 1625.1 概述 1625.2 需求 1625.3 设计 164查找条件 164栏目说明 165算法说明 1655.4 实现 166新建报表模板 166新建报表目录 167新建报表容器 167新建报表页面 167新建DadaCommand 169编写DadaCommand业务逻辑 173报表模板设计 186模板布局设计 188报表参数设计 191报表处理策略 194发布浏览 197发布报表模板 197部署DataCommand 201菜单授权 203效果预览 204查询界面 204效果界面 204本章小结 205第六章打印个性化 206个性化工具平台(UBFStudio) 206启动及登陆 206打印元数据库 207设计器区域介绍 209菜单系统 216模版调整 219纸张调整 219区域调整 221布局调整 223增加显示对象 229印数据扩展 232增加用户自定义字段 233使用OQL表达式 235创建UIModel打印模版 237定义打印模板名称及语言类型 238设定UIModel 238打印字段定义(数据查询定义) 240定义布局类型 241设计标题 242完成打印向导 243打印模板发布 243SQL标准函数扩展 247操作步骤 247本章小结 248第七章个性化 251表单个性化 253卡片个性化 253Grid列表个性化 257功能区个性化 260添加自定义控件或列 261新增关联控件 263设置默认值 266字段管控设置 269个性化权限管控 272菜单个性化 273菜单分组的隐藏显示 275菜单分组中菜单项的隐藏显示 275菜单分组顺序 275查询个性化 276查询条件个性化设置 276栏目显示名称修改 277排序个性化设置 278查询方案的保存/删除 279列表个性化 280报表个性化 281报表查询条件个性化设置 281报表排序个性化 282报表行分组/列分组个性化 283调整列宽 284第八章Office应用集成 286核心价值 286环境配置 286OBA客户端安装 286权限设置 287功能应用 289模板设计和共享应用 290U9数据导入导出 297U9数据查看 302U9数输出和打印 302本章小结 303第九章预警 304周期性预警 305周期性预警设置 306调度方案 307管理提交 309通知管理 311实时预警 314实时预警设置 314请求监控 315消息中心 317通知管理 318我的订阅 319消息查询 320消息通道 321本章小结 322客户化开发篇U9实施应用宝典—应用篇UBFUBF与客开PAGEPAGE1PAGEPAGE10本章导读本章主要讲解U9二次开发环境的部署、许可、已经服务器配置;系统环境准备系统硬件2G以上,CPU2.6G以上系统软件1)操作系统Server2003+SP2IIS6.0IIS6.0的安装位置在:/Windows/应用程序服务器/详细信息/Internet信息服务(IIS)。IIS6.0。U9U9实施应用宝典—应用篇UBFUBF与客开点击【确定】、【下一步】后,系统提示插入操作系统光盘,可以插入系统光盘,如果没有系统光盘,可以定位到操作系统文件夹的i386framework2.0(VS2005,则已经存在该补丁包)framework2.0SP1安装.netframework3.02)其它软件IE7.0AdobeReaderPDF(打印输出用)版本管理工具(可选)如果需要使用UBFStudioV2.0UBFStudioV2.0MSVisualSourceSafeV6.0(或更高版本),以及IBMRationalClearCase2003数据库SQLServer2008ReportingServices,建议完全安装开发环境安装U9安装服务器务器”弹出下图:向导式完成即可。U9应用服务器U9123456,点击“下一步”,如下所示PC,我们建议选择“测试环境”,建立连接后,如下UBFUBF与客开U9U9实施应用宝典—应用篇PAGEPAGE5PAGEPAGE6默认全选,点击“安装”,即可安装管理控制台弹出下图:U9U9Portal登录管理控制台“U9-ERP2.0SP2U9Portal(123456)UBFUBF与客开U9U9实施应用宝典—应用篇PAGEPAGE11PAGEPAGE8站点服务器配置我们重点对数据库服务器及报表服务器的配置进行讲解,其他按默认配置即可。进入界面后,选择“站点管理”,如下所示双击“数据库服务器”,修改用户名和密码;双击“报表服务器”,如下所示刷新;获取报表服务器信息;如有多个报表服务器版本,请选择,如没有则为默认ReportServerLibReportServerLib新建企业点击“新增”录入企业编码,名称,点击“创建”选择服务器录入数据库名称选择数据库备份文件指定数据库及库日志文件存放路径注意:Portal2、确认之后开始创建数据库(OBA模块,可以不配置文档库),如下所示JOB引擎配置进入控制台界面后,选择“JOBUBFUBF与客开U9U9实施应用宝典—应用篇PAGEPAGE13PAGEPAGE14001”,弹出如下点击“确认”。UBFUAPUBFSPLASH.HTAUBFStutio”弹出如下:按向导完成即可,UBFPortalUBFUBF与客开U9实施应用宝典—应用篇PAGEPAGE15PAGEPAGE16产品许可本机许可管理人员,获得许可文件后导入即可。在管理控制台——许可证,获取注册请求信息,画面如下所示:系统管理工具->许可管理->获取注册请求信息reqmacmac确保本软件运行时,该网卡设备工作正常。申请流程请向机构负责人咨询;得到许可文件(.txt),导入所申请的服务器即可网络许可打开控制管理台,选“站点管理”site”,修改许可服务器为有许可的服务器U9U9实施应用宝典—应用篇UBFUBF与客开PAGEPAGE18PAGEPAGE19IP数据库的导入、导出U9程中需要一些数据,所以直接导入一个有数据的数据库对开发报表、代码调试方便。数据库的导出数据库导出、导入工具是“用友数据管理工具”。位置:UFIDA\U9ClientV2\ClientSystemManage\UFIDA.U9.SystemManage.DataManagerClient.exe初始密码:123456/数据管理”进入如下界面:单击目标按钮bak到现有备份集或者覆盖所有现有备份集,单击确认进行数据备份生成.BAK。数据导入数据库的导入还原有两种途径:1、使用“用友数据管理工具”还原。使用“用友数据管理工具”还原,方法如下:企业数据维护下的数据还原,进入如下界面:bak的文件页面选择.mdf与.ldf 文件后,单击确认进行数据库恢复。2、使用“用友系统管理工具”还原。位置:\UFIDA\U9ClientV2\ClientSystemManage\UFIDA.U9.SystemManage.SystemManagerClient.exe登录:初始密码:123456单击企业管理单击右边企业管理中的新增按钮单击“基本信息设置”数据库――创建,打开创建界面:创建数据库填写信息:11)需要填写创建的数据库名称,也可以点击浏览按钮选择已存在的数据库。22)数据库导出的备份文件,单击浏览选择数据文件的存储位置,\UFIDA\U9V2\Database\SQL2005_V2.BAKSQL2008_V2.bak33)该文件系统自动生成,可以修改文件存储地址,文件目录必须为已存在的,系统不会自动创建目录。U9-XX011报表服务器配置SqlServerReportingServicesSqlServerReportingServices,因为自定义sqlserver的报表服务(SqlServerReportingServices)请先按安装。ReportServerReportServerIIS。DataCommandDataCommand节中指定的报表服务库目录,如下图:报表开发环境参数设置UBF环境设置UBF\UBFStudio\IDEConfig.xmlOptions节RuntimeForReportDesigner属性为<OptionsRuntimeForReportDesigner="true">。<OptionsRuntimeForReportDesigner="true">,UBF<OptionsRuntimeForReportDesigner="false">,UBFUBF连接到数据库因为开发中使用的报表模板文件、实体模型等相关信息都是存储在数据库中,做自定义报表开发的前提是把UBF据库就是U9中的公司对应的数据库。UBFStudioV2.0UBF\UBFStudio\Runtime\environment.xmlenvironment.xml下:<system><connectionString>packetsize=4096;userid=u9test;ConnectionTimeout=150;MaxPoolsize=1500;datasource=u9ubfdb;persistsecurityinfo=True;initialcatalog=u9test;password=u9test</connectionString></system>datasource=u9ubfdb:表示数据库实例initialcatalog=u9test:表示数据库名userid=u9test:表示数据库的用户名SQLSERVER请根据所使用数据库的具体情况配置。报表开发环境运行登陆数据库服务器登录界面以及对应密码。连接报表元数据库第二章UBF本章导读本章将介绍了UBF开发平台的框架OQL进行深入介绍UBF介绍应用框架UBFDesigntimeRuntime以及一系列工具组成。UIFramewok应用开发流程(如下图所示)。在上图中,VSNetIDEC#代码。UBFStudioORUBFStudio中的相应工具将模型代码生成为C#的框架代码,开发人员在此基础上提供或者扩展模型的实现,编写业务逻辑;同时,设计完成的。模型可以发布到运行态元数据库中。UBFStudioUIP词汇表中文英文解释产品包ApplicationPackage总账等功能模块。产品包可以由多个小的产品包构成。每个小产品包由多个服务组构成。方案ApplicationSolution的所有服务、业务实体和业务操作必须被部署在一个站点中,解决方案被作为操作的主文件,并对应一个服务组。服务组ServiceGroup服务组,但服务组中的所有组件必须被整体的安装和卸载。地部署在一个站点内。的职责边界,服务组内部操作间的调用通过服务引擎完成,服务组对外只暴露服务但服务不能调用服务。服务组对应设计期的解决方案。U9实施应用宝典—应用篇UBFUBF与客开PAGEPAGE36PAGEPAGE37业务实体组件BusinessEntityComponent是一个业务数据管理的组件,包含一组BusinessEntity。BusinessEntityDataEntityBusinessEntity,这些Entity(BusinessObject)持久化到数据库中,或从数据库中装载数据。BusinessEntityDataBusinessEntityData,BusinessEntityDataBusinessEntity相同的属性和数据成员,但它仅用于数据的传输。BusinessEntityBusinessEntityEntityData业务操作组件BusinessProcessComponent业务操作组件包含一组业务逻辑的实现类——BusinessProcess。业务操作组件由两个程序集组成,一个是BusinessProcessBusinessProcessAgentBusinessProcessBusinessProcessAgentBusinessProcess用BusinessProcess的实现。服务组件ServiceComponent服务组件包含一组服务——Service。ServiceBusinessProcessService不能被任何BusinessProcessService数据库组件UIComponent页面、菜单、参照等几种不同的类型,用于完成人机交互中的不同任务。组件AnalysisComponent数据分析组件包含数据立方体、维度、KPI、报表、打印几种组件。件WorkflowComponent用于完成工作流的流程定义。DSLDomainSpecificLanguageUBFXMLDLLUBFUBFUBF(UfidaBusinessFramework)开发平台:采用元数据驱动的、分布式的、面向服务的架构,它提供了统一的编程抽象模型,是一个适合应用软件开发及部署的全角色平台。Studio务分析模型。工具、报表设计工具、打印风格格式设计器、规则开发工具、商业智能元模型开发工具等,全部集成在集成开发环境中(IDE)VSSCCUBF))《UBF2.0(使用).doc》UBF开发环境参数设置UBF环境设置在使用UBF Studio前,需要正确配置模型代码生成路径和界面生成路径到有效的目录。从UBFStudioU9U9实施应用宝典—应用篇UBFUBF与客开PAGEPAGE50PAGEPAGE39界面中的控件解释:名 称控件类型说 明安装路径只读文本框Studio系统引用库路径文件夹参照系统引用库PubRef模型代码生成路径文件夹参照模型代码的生成路径,在模型设计完成后生成代码时会用到测试用例生成路径文件夹参照UBF界面生成路径文件夹参照界面库路径文件夹参照应用组件运行库路径文件夹参照组件发布为运行态时保存的路径,应用模型层级树的设置文件也保存在该目录下。发布站点地址文件夹参照站点发布和部署时使用的路径。数据库脚本生成路径文件夹参照数据库脚本生成的路径应用服务器路径文件夹参照应用服务器的路径说明:配置对话框的配置信息均保存在安装目录下的\UFIDA\UBFV2\U9.VOB.Product.UBF\UBFStudio\IDEConfig.xml有效。UBF连接到数据库因为开发中使用的报表模板文件、实体模型等相关信息都是存储在数据库中,做自定义报UBFU9UBFStudioV2.0UBF\UBFStudio\Runtime\environment.xmlenvironment.xml<?xmlversion="1.0"encoding="utf-8"?><environment><system><connectionString>packetsize=4096;userid=sa;ConnectionTimeout=150;MaxPoolsize=1500;datasource=uf200901069;persistsecurityinfo=True;initialcatalog=U9_2010;password=sa</connectionString></system><view><mappertype="UFSoft.UBF.View.Query.MetadataDomainMapping,UFSoft.UBF.Business.Adapter"/><creatortype="UFSoft.UBF.View.Query.Adapter.TranslatorCreator,UFSoft.UBF.Business.Adapter"/></view><Path><Metadatalib>d:\</Metadatalib></Path><path><ubfbin>Runtime</ubfbin><ubfstudio>c:\ubf20\visualstudio</ubfstudio><ubfresources>c:\ubf20\resources</ubfresources><approot>c:\u9app</approot><!--class|component|assembly--><MDLoadStrategy>assembly</MDLoadStrategy></path><resource><componentid="05dfd73d-046e-457f-b08b-d17a905b2d94"/><componentid="cf4531fe-2991-444f-a84b-9f69073f62e5"/></resource><traceiisTrace="true"sqlTrace="false"/></environment>datasource=u9ubfdb:表示数据库的服务器名initialcatalog=u9test:表明数据库名userid=u9test:表示数据库的用户名请根据所使用数据库的具体情况配置。启动服务Window如果是手动安装,就启动下面这两个服务。1、Portal\SysManageServer\ServiceHostingConsole.exe2、Portal\ApplicationServer\ServiceHostingConsole.exe这两个服务是UBF、PortalUBFPortal个服务已经启动。为方便可创建快捷方式到桌面。OQL查询语言OQL简介对象查询语言OQL有两种风格,即有两种不同的使用场景:简单条件过滤与复杂报表查C#风格一致,OQL是大小写敏感的,因此所有的关键字都必须小写。1)基本功能1、ObjectQueryLanguage提供了一种基于对象的查询语言。2OPath语法风格的路径表达式。3、支持属于多个Entity的多列。4、OOOrderLine.Order.Customer.ContactName。5、支持聚合函数,SQL99标准函数(Entity语义)。6、支持列间表达式计算。7Group&Order&As(列别名)8EntityView定义,可以在Query定义中使用已有的EntityView!9、支持名空间的使用,支持中文。10fromleftjoin,rightjoin,fulljoin,crossjoin。11select,from,where子句中支持子查询。12OQL别名指代OPath,使OQL的表达更加简洁。13、UDF(UserDefinedFunction)的直接支持。14、union,unionall。15、临时表的支持。16、OQL风格指南17、对C风格a?b:cCaseWhen表达式的支持。18、对标准日期时间函数的支持。cast/convert类型转换函数的支持。20Update&Delete语句。优势与比较安装将$Dev\PubRef\Business\UFSoft.UBF.View.Query.dll添加到项目引用中,$Dev\PubRef\Business\UFSoft.UBF.Business.Adapter.dll,$Dev\PubRef\System下UFSoft.UBF.Util.Expression.dll,UFSoft.UBF.Util.dll,UFSoft.UBF.Util.SQLBuilder.dll,UFSoft.UBF.Util.Log.dll,Tools.dll需要拷贝到运行目录。environment.xml/environment/view/creator,如$Dev/PubRef/Businessenvironment.xml所示:<view><creatortype="UFSoft.UBF.View.Query.Adapter.TranslatorCreator,UFSoft.UBF.Business.Adapter"/></view>简单条件过滤简单条件过滤在概念上是针对一个强类型的对象集合指定一个过滤条件,对集合中的每个对象应用此过滤条件进行筛选,结果是所有满足条件的对象所构成的子集合。UBFBEBE.Finder.Find(xxx)返回对象集合。ObjectSpaceOPath(OPath启发而来),表示查询条件,使用时应当指定对应的主实体,即条件是在该主实体上过滤。OQL仅用在E.nde.ndAPI,)简单条件"Customer.IDALFKI'",CustomerCustomer,ID是CustomerCustomerCustomers表,ID映射为CustomerID列。EntityJoin条件"Customer.Order.ShipNameQueryEngineOrderCustomer类的一个属性,仍然没有即报错。最后一列总是属性,ShipNameOrder实体的属性。OPath风格指定条件"Customer.Order.ID>100andCustomer.Order.ID!=0",更复杂的路径表达式:"Customer.Order.OrderLine.ProductIDisnotnull",注意isnotnullProductID列是否为空。Betweenand"Order.OrderLine.UnitPricebetween23and50",逻辑或条件+参数"OrderLine.UnitPrice14orOrderLine.Quantity@a",参数以@命名规则@是ADO.NETXPath中的元素属性混淆。in"Product.OrderLine.Order.ShipNamein('a','b','CCCC')",like¬like"Product.OrderLine.Order.Employee.LastNamenotlike'D%'",复杂报表查询兼容性注意问题SQL风格特性的引入,OQLselect关键字,否则无法解析。这是新增功能所引起的唯一不兼容的地方,实际上更有助于意识到OQL两种风格:条件过滤和报表查询的差异。基本语法(select[Column]{,[Column]}{fromjoinClause}{whereCondition}{groupbycolumns{havingCondition}}orderbycolumns)(union|unionall)(select…)使用实体类没有别名时假设为当前类的属性。@"selectdistinctAgefromPersonswhereName='Pat'",@"selectdistinctx.AgefromPersonsx where x..Name='Pat'",from子句from子句可用逗号分隔多个路径表达式(OPath),innerjoin处理,crossjoin处理。@"selectc.AddressfromPersonsp,p.Childrenc",crossjoin,要对两个集合作笛卡尔积。@"selectpfromPersonsp,Flowersf wherep.Name=f.Name",@"select*fromAuditLoglog,Paymentpayment",leftjoin左外连接@"select*fromItemitemleftjoinitem.Bidswhereitem.Descriptionlike'%gc%'",OPath表达,OQLCompilerSQLon条件。@"select*fromBidbidleftjoinbid.Itemleftjoinbid.Bidderwherebid.Amount>100",innerjoinjoininnerjoin,OPathleft,right,full,三种外连接,outer关键字是可选的,inner也是可选的,OQLCompilerSQLon条件。@"select* fromItemitemjoinitem.Bidsbidwhereitem.Descriptionlike'%gc%'andbid.Amount>100",@"select*fromItemifulljoini.Selleruwhereu.UserName='steve'",@"selectitem.IDfromItemitemrightjoinitem.Bidswherebid.Amount>100",@"selectitem.ID,item.Description,bid.AmountfromItemitemrightouterjoinitem.Bidsbidwherebid.Amount>100",@"select*fromCatascatinnerjoincat.Mateasmateleftouterjoincat.Kittensaskitten",@"select*fromCatascatcrossjoincat.Mate.Kittensaskittens",@"select*fromCatascatleftouterjoincat.Kittensaskittenonkitten.BodyWeight>10.0",CrossjoinOQLCompilerSQLon条件。@"select*fromUseruser,LogRecordlogwhereuser.UserName=log.UserName",Distinct关键字@"selectdistinctitem.DescriptionfromItemitem"。数据库函数upper,任意这样的数据库函数,用户自定义函数可随意使用@"selectitem.StartDate,item.EndDate,upper(item.Name)fromItemitem",CountCount(*)@"selectcount(*)fromItem",Count@"selectcount(item.SuccessfulBid)fromItemitem",Count(distinct…)@"selectcount(distinctitem.Description)fromItemitem",Min,Max@"selectmin(bid.Amount),max(bid.Amount)fromBidbidwherebid.Item.ID=1",@"selectmax(BodyWeight)asmax,min(BodyWeight)asmin,count(*)asnfromCatcat",Groupby@"selectbid.Item.ID,count(bid),avg(bid.Amount)fromBidbidwherebid.Item.SuccessfulBidisnullgroupbybid.Item.ID",@"selectuser.LastName,count(user) fromUseruser groupbyuser.LastNamehavinguser.LastNamelike'A%'",子查询INPredicate中@"selects.SalaryfromStudentswheresin(selectsec.AssistantfromSectionssec)",EXISTSPredicate中@"selectscope1fromPersons,Citiescwhereexists(selectscope2fromChildrensaschild)",(correlatedsubquery)@"select*fromUseruwhere10<(selectcount(i)fromu.Itemsiwherei.SuccessfulBidisnotnull)",嵌套的标量子查询(nestedscalarsubquery)@"select*fromBidbidwherebid.Amount+1>=(selectmax(b.Amount)fromBidb)",全称子查询@"select*fromItemitemwhere100>all(selectb.Amountfromitem.Bidsb)",存在子查询@"select*fromItemitemwhere100<any(selectb.Amountfromitem.Bidsb)",@"select*fromItemitemwhere100=some(selectb.Amountfromitem.Bidsb)",@"select*fromDomesticCatascatwherecat.Name=some(selectname.NickNamefromNameasname)",@"select*fromCatascatwherenotexists(select*fromCatasmatewheremate.Mate=cat)",子查询用在in谓词中@"select*fromItemitemwhere100in(selectb.Amountfromitem.Bidsb)",@"select*fromDomesticCatascatwherecat.Namenotin(selectname.NickNamefromNameasname)"where条件中@"select*fromCatasfatcatwherefatcat.Weight>(selectavg(cat.Weight)fromDomesticCatcat)",select子句中@"selectcat.id,(selectmax(kit.weight)fromcat.kittenkit)fromCatascat",from子句中作为”derivedclass”@"select*fromCataleftjoin(selectp.NamerfromPlayerpwhere3>count(p.Scores))bonc.Name=b.Namewherec.Age>3",dateadd/datediff/datepart/datename中关键字的支持现在可以支持在dateadd/datediff/datepart/datename四个函数调用中用T-SQL风格的关键字day/year/month,etc,但是这不是一种标准和同一的风格,建议用字符串即单引号的方式.函数名大小写均可。@"selectdateadd(day,3,'20061031')fromProducts"@"selectdateadd('day',3,'20061031')fromProducts";'20061031',getdate())fromProducts";@"selectdatediff(dd,'20061031',getdate())fromProducts";@"selectdatepart(month,'20061031')fromProducts";@"selectdatepart('month',getdate())fromProducts";@"selectdatename(Hour,getdate())fromProducts";@"selectgetdate()fromProducts";@"selectgetutcdate()fromProducts";@"selectday(getdate())fromProducts";@"selectmonth(getdate())fromProducts";@"selectyear(getdate())fromProducts";对cast类型转换函数的支持OQLcast必须以下述纯函数风格调用@"selectcast('abc',varchar(5))fromProducts";convert函数使用没有特殊限制@"selectCONVERT(bigint,convert(varbinary(20),5.1))fromProducts";字符串函数注意字符串函数中,leftrightleftjoinrightjoinleftright用作字符串函数名时不能用小写,全大写或大小写混合均可。@"selectLeft('abc',2)fromProducts";@"selectRIGHT('abc',2)fromProducts";Update&Delete语句的支持@"updateUFIDA::U9::CBO::PL::PriceList::PriceListpsetp.ID=10232wherep.ID<0";@"updateUFIDA::U9::CBO::PL::PriceList::PriceListsetID=10232whereID<0";@"deletefromUFIDA::U9::CBO::PL::PriceList::PriceListpwherep.IDisnulland1=2";@"deletefromUFIDA::U9::CBO::PL::PriceList::PriceListwhereIDisnulland1=2"注意1、UpdateDelete语句只能用来操纵报表编程中的临时表,其它情形下行为不可预料。2、Deletefrom关键字是必选,这与SQLServerOraclefrom可省的习惯不同,但与SQL99标准兼容。3、OQLupdate/delete可使用表别名,SQL不支持。OQL查询风格如下所示:select2asApplyDocType,3asDocTag,billhead.idasDocDataTag,billhead.DocNo+billline.LineNumasDataNo,billhead.ReceivalDateasDataDate,0asPriorityGrade,0asDocOrderNo,billhead.ReceivalCurrencyasDocCurrency,billhead.RCToFCExchRateasDocExchangeRate,0asCanEnjoyDiscount,asSettlementMethod,billhead.Department.NameasDepartment,Transactor,billhead.ReceiverasReceiver,billhead.Project.NameasProject,nullasItembillheadinnerjoinbillhead.ReceivalBillLinebilllinewherebillhead.Organization=1002006051600036001andbillhead.HasSubReceive=0='C01'andbillhead.ReceivalCurrency=1105400andbillhead.ID=25809101使用别名风格从本质上更体现了ObjectQuery的本质语义,即OQL其实是在查询集合,billhead,billline可以理解成foreach的循环变量,理解这种风格会使我们U9的应用开发人C3.0VisualStudio2008C3.0的语言查询功能。join的,用别名形式,形如UFIDA::U9::AR::Receival::ReceivalBillHeadainnerjoina.ReceivalBillLinebfrom.B.B.C,可写为:fromAaleftjoina.Bbleftjoinb.Cc,select子句,where子句,导航表达式的级数没有限制。+相对于主实体开始的导航表达式如下所示:select2asApplyDocType,asDocTag,idasDocDataTag,DocNo+ReceivalBillLine.LineNumasDataNo,ReceivalDateasDataDate,0asPriorityGrade,0asDocOrderNo,RCToFCExchRateasDocExchangeRate,0asCanEnjoyDiscount,asSettlementMethod,Department.NameasDepartment,ReceiverasReceiver,Project.NameasProject,nullasItemwhereOrganization=1002006051600036001andHasSubReceive=0andCustomer.CustomerCode='C01'andReceivalCurrency=1105400andID=25809101joinOQL的标准形式。SQL风格的类名.属性名是不支持的。SQL的习惯和特征。用户自定义函数与SQL标准函数SQL标准函数不用任何特殊处理,直接在OQL语句中当函数使用,只是对应的参数用对xml文件(udf.xml)中注册:<?xmlversion="1.0"?><udf-binding><udffunction="hello"/><udffunction="puke"owner="sys"/></udf-binding>hello定义如下:createfunctionhello()returnsnvarchar(40)asbeginreturn'HelloFaint!'endownerOQLdbo这样:"selectIDasIDhelloDocType.IDasDocTypefromUFIDA::U9::CBO::PL::PriceList::PriceList"将被翻译为:@"selectA1.[ID]as[ID],dbo.hello(),A2.[ID]as[DocType]fromCBO_PriceListasAinnerjoin[Base_Doc]asA1on(A.ID=A1.ID) leftjoin[Base_DocType]asA2on(A1.[DocType]=A2.[ID])"临时表View,a.k.a.NamedOQL来实现,将API来体现,在语法上与EntityView的使用没有区别。以下是一个通过BE封装的,在报表DataCommand中临时集合使用例子。注意EntityViewQueryusing语句。usingSystem;usingSystem.Data;usingUFSoft.UBF.Report.Entity;usingUFSoft.UBF.Report;usingUFSoft.UBF.Report.Interface;usingUFSoft.UBF.Sys.Database;usingUFSoft.UBF.Business;usingUFSoft.UBF.View.Query;{///<summary>///OQLReportCommand的摘要说明。///</summary>publicclassOQLReportCommand:BaseReportDataCommand{privateEntityViewQueryq=newEntityViewQuery();publicOQLReportCommand(){////TODO:在此处添加构造函数逻辑//}publicoverrideIDataReaderExecuteDataReader(){(集合)Schema,用来创建//临时集合对象。ObjectQueryquery=q.CreateQuery("select*fromAssociation::A_Ass1to1");//query对象查询为schema创建临时表。//这相当于执行select*into#aaaViewfromA_Ass1to1.using(IDataReaderreader=q.ExecuteReader("aaaView",query)){//TODOwhatyoulike.}DataSetresult=q.ExecuteDataSet(query);{//TODOWhatyouwant.}//相当于执行select*from#aaaView.aaaView是前面定义的临时集合对象。IDataReaderreader2=q.ExecuteReader(q.CreateQuery("select*fromaaaView"));returnreader2;}}}publicintExecuteNonQuery(stringTempVariable,ObjectQueryquery,paramsUFSoft.UBF.PL.OqlParamoqlParameters)Queryint,表示受影响的纪录数。ds,注意这个dsEntityViewQuery方newEntityViewQueryq=newEntityViewQuery();inti=q.ExecuteNonQuery("aaaView",q.CreateQuery("select*fromAssociation::A_Ass1to1"),null);Assert.IsTrue(i>0);EntityViewQueryq=newEntityViewQuery();DataSetds0=q.ExecuteDataSet(q.CreateQuery("select*fromAssociation::A_Ass1to1whereid>@ttt"),newOqlParam(1));ds0.Tables[0].Rows[1][4]);row[4]="yel";q.UpdateDataSet(ds0);ds0=q.ExecuteDataSet(q.CreateQuery("select*fromAssociation::A_Ass1to1whereid>@ttt"),newOqlParam(1));ds0.Tables[0].Rows[1][4]);全景体验最后,来一次大规模的全景体验:@"selecto.id,sum(price.amount),count(item)fromOrderasojoino.lineItemsasitemjoinductasproduct,Catalogascatalogjoincatalog.pricesaspricewhereo.paid=falseando.customer=@customerandduct=productandcatalog.effectiveDate<sysdateandcatalog.effectiveDate>=all(selectcat.effectiveDatefromCatalogascatwherecat.effectiveDate<sysdate)groupbyohavingsum(price.amount@minAmountorderbysum(price.amount)desc"。本章导读本章主要介绍U9二次开发通用命名规范命名通用规范命名方法概述itemInfo;ItemInfo;btnSave,txtName;使用规范PascalCamelvoidGetInfoByCode(stringstrCode)2)类或者函数中声明的常量,变量3)私有类成员变量UIU9标准产品发布对象对照表ID代码节点层次名称30000101CBO2基础设置30020201GL230030202AR2应收管理30040203AP2应付管理UBFUBF与客开U9实施应用宝典—应用篇PAGEPAGE53PAGEPAGE5430050204NM2票据管理30060205TI2税务发票30070206CM2现金银行30080207CFP2现金流监控30090208FA2固定资产30100209ER2费用报销30150503SD2销售与分销30160504PM2采购管理30170505INV2库存管理30210601BOM2工程数据30230603CRP2细能力30240604ECN2工程变更30250605MO2生产管理30270607SFC2车间管理30280608MRP2需求计划30300610MOOS2可视化排程30320901CA2成本会计30330902IC2料品成本30340302PA2薪资管理30350303BEN2福利保险30410301HM2人事管理30511001CP2客户门户30521002VP2供应商门户30610701QC2质量管理30711201CS230810508DM2渠道管理31011101SM2系统管理32010210GC2全球合并32020211RET2关系企业交易32030212FN2资金结算33010213TB2全面预算34021301PMM2项目计划控制34031302CBS2项目成本命名空间规范概述使用层次模型组织类,其优点是可以防止对象命名上的冲突。组成要素公司名.产品线.客户化.行业.一级模块.二级模块UFIDA.U9.Cust.行业.一级模块.二级模块要素说明UFIDA产品线:U9客户化:Cust行业: CBO-公共TY -糖业JG YC-烟草YY-医药FZ-服装PM -项目Note:行业的划分和缩写命名待进一步确认规则与约束公司名(UFIDA)、产品线(U9)、客户化(Cust)是固定不变的;U9一级模块、二级模块可根据具体的项目情况自行定义,但要用缩写、命名要有含义;举例说明加多宝营销管控平台:UFIDA.U9.Cust.PM.:UFIDA.U9.Cust.TY.解决方案规范概述(SG)的基本单元。U9U9实施应用宝典—应用篇UBFUBF与客开PAGEPAGE100PAGEPAGE57约束规则“Cust_”+二级名称和前台(UI)AppUI示例件后缀名)Cust_Order.ubfsln项目规范概述一个解决方案下可有多个项目,模型项目组主要包括实体项目、操作项目、服务项目、UI项目、报表项目、查询项目。约束规则(BE、BP、SV、UI、Rpt)项目粒度划分规则BEBE务组下的实体。BP、SV示例如红框所示:装备件规范概述UFIDA.U9.Cust.OrderBE,那么编UFIDA.U9.Cust.OrderBE.dll。约束规则“UFIDA.U9.Cust.”+项目名。示例UFIDA.U9.Cust.OrderBEUFIDA.U9.Cust.OrderDocTypeUI如果涉及客开模块较多,可以在项目名中加入服务组,如UFIDA.U9.Cust.SCM.OrderDocTypeUI。组件规范概述UBFUIFromRef(参照)组件报表模板项目:报表模板组件约束规则BE组件主实体名称+“BE”BP组件“BP”结尾即可SV组件“SV”结尾即可UIModel组件与实体组件绑定的UIModel:主实体名称+“UIModel”UIModel:以“UIModel”结尾即可UIForm组件与实体组件绑定的UIForm:主实体名称+“UIForm”“UIForm”结尾即可参照组件参照实体名称+业务含义+“Ref”“业务含义”可以是:1)Find;该参照用于相应工具栏“查找”按钮事件

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论