2024年5月25日发(作者:)
1. 创建U9 SV
1.1 按照BP开发的方式,开发SV
可参考《课程讲解资料V3.5》的BP开发步骤。
1.2 假定业务逻辑案例
SV调用采购订单操作BP,PoShipLineBP,;
传入ID(长整型)、ActionType(整型,0提交,1审核,2弃审);
返回布尔值。
1.3 主要步骤
新建服务项目>>删除默认服务组件>>改配件名>>增加服务组件(可按单据分类)>>改命名空间>>按需增加服务。
构造>>复制DLL>>升级脚本>>发布。
1.4 部署SVC
在生成的SV代码目录内,BpImplement中,有相应的.svc文件,如:EXSVBpImplement
把.svc文件复制到PortalServices下
修改文件,在最尾端追加Services节点,如下:
……
behaviorConfiguration="U9SrvTypeBehaviors">
说明:蓝色字体之间的内容为追加的节点;其中,
service name为.svc文件名的修改,ionSVStub,前缀与.svc文件名一
样,后面粗体字的改为:前面去掉I,后面加Stub;
U9SrvTypeBehaviors为固定值;
endpoint contract为.svc文件名:tionSV;
basicHttpBinding为固定值。
2015-06-22 add by peter 可新建.config文件进行部署(便于出补丁)
在PortalServices下新建config文件,如:(文件名可以svc文
件名命名)
内容参考如下:
behaviorConfiguration="U9SrvTypeBehaviors">
(U9V2.8中经验证过,Config文件内的注释不支持中文)
浏览器中测试服务,效果如下:(与标准产品的有所不同,但验证过能用)
1.5 测试服务是否正常工作
vml-win2008r2/U9/Services/
1.6 业务逻辑代码参考
//引用,
//引用
public override object Do(object obj)
{
OperationSV bpObj = (OperationSV)obj;
//校验
if ( <= 0) { return false; }
try
{
//调用PM操作(提交、审核、弃审)BP
PoShipLineBPProxy p1 = new
PoShipLineBPProxy();
//操作类型
switch (Type)
{
case 0:
Type = (int)ingAct;
break;
case 1:
Type = (int)edAct;
break;
case 2:
Type = (int)t;
break;
default:
return false;
}
//采购订单计划行ID(提交、审核、弃审,传入一计划行ID即为整单操作)select * from PM_POShipLine
LineKey = ;
();
}
catch (Exception ex1)
{ throw new Exception(e); }
return true;
}
编译并复制更新SV DLL
1.7 使用API测试工具,测试该SV是否生效。
使用API测试工具,出现的情况说明:
1、 v2.5金盘,报Support_CultureNameList为空的错;升级补丁后,则报:
[ERROR][ionSVStub]-ion: 当前环境下默认语种为空;目前未解决。
(始终保持不升级补丁)解决,反编译,直接修改源代码,加传入参数:
Value(6, "DefaultCultureName", "zh-CN");
Value(7, "Support_CultureNameList", "zh-CN");
修改后的工具如下:
API-TEST(m).rar
遗留问题:
提交、审核操作成功,弃审报行已打开、挂起或终止,不能再打开的错,暂未去研究。
2、在v2.8下测试,则调用正常。
V2.5(培训版)升级后无Lincense的问解决:
1、 升级前,先备份(培训版Base dll):;
a) 同时备份:35(注意看是否为适合vs2005调试模式而改名了),,以备用;
2、 升级后,也备份(权限版Base dll):;
a) 同时备份:40,,以备用;
3、 停止UFSysManageService_2.1服务,使用培训版Base dll覆盖权限版Base dll;
4、 重新启动UFSysManageService_2.1服务,重启iis,即可继续使用U9。
升级后可能出现的错误:
1、未能从程序集中加载类型dule。
解决:
检查Internet信息服务管理器中,应用程序池U9 AppPool CLR4,
.net framework版本若为v2.0,则portal下需覆盖还原为升级前备份的那个;
.net framework版本若为v4.0,则portal下需覆盖还原为升级后的40。
如果仍未解决,则进入此目录c:meworkv4.0.30319>,管理员用户在cmd命令中运行
aspnet_ -i –enable,表示安装.net framework 4.0。
2. Session
2.1 Session的概念
在现在UBF中,Session的本意是work unit,即持久层的一个边界,非常轻,主要用作批量提交,并标识这次批量提交的
边界,不涉及到事务等概念。
当前ISession可以通过Session的Current属性获得,每调用一次Session的Open方法,Current属性都会被更新。
2.2 Session的使用
using(ISession session = ()){
...
(); //提交更改,但只是Session范围内的修改更新
}
2.3 Session嵌套
当发生session嵌套的情况时,每次提交都是真正提交
示例:
using(ISession session1 = ()){
...
using(ISession session2 = ()){
...
(); //提交更改,但只是Session2范围内的修改更新
}
(); //提交更改,只处理Session1的修改更新
}
2.4 实体新建
新建实体实体的操作分为主实体的新建和非主实体的新建,如果是主实体新建,用不带参数的Create方法,如果是非
主实体的,用带上级实例参数的Create方法。
举例:
using (ISession session = ())
{
A_Com1c1 objA = A_();
_A_Com1c1 = 1000;
_A_Com1c1 = "objA“;
B_Com1c1 objB = B_(objA);//B为A的子实体
_B_Com1c1 = 1001;
_B_Com1c1 = “objB”;
();
}
2.5 实体更新
using(ISession session = ()){
Customer obj = ID(id);
if(obj!=null)
= "new name";
(obj);
... ...
();
}
2.6 实体删除
对于组合关系,如果删除主实体,那么,主实体下面的所有子实体,孙实体会被级联删除, 对于非主实体的删除,可以
用子集合的RemoveAt和Remove(entity)方法,这2个方法等价,例如
using (ISession session = ())
{
A_Com1cN objA = A_ID(aID);
objA.B_At(0);
//或用下面的方式:
B_Com1cN b = ID(bID);
objA.B_(b);
();
}
3. 实体查询方式
3.1 实体的查询类Finder
返回强类型的对象
常用方法:Find,FindByID,FindAll
举例
OqlParamList pList = new OqlParamList();
string strOql = “Code=@Code";
(new OqlParam(“Code”, “11”));
List list=l(strOql, y());
3.2 EntityDataQuery
EntityDataQuery 主要用于希望返回结果是IDataReader,DataSet,单值的情况
创建方式:
1、通过Entity对象:
EntityDataQuery q = DataQuery();
2、通过EntityFullName:
EntityDataQuery q = new EntityDataQuery("er");
EntityDataQuery q = new EntityDataQuery(_FullName);
返回DataSet:FindDataSet
1、全OQL方式
DataSet ds =
taSet(“select ID,Name,Code from UFIDA::U9::CBO::SCM::Customer::Customer");
2、条件OQL方式
DataSet ds = taSet( "ID>1");
返回IDataReader :FindDataReader
1、全OQL方式
IDataReader dr = taReader ("select ID,Name,Code from UFIDA::U9::CBO::SCM::Customer::Customer");
2、条件OQL方式
IDataReader dr = taReader ( "ID>1");
返回单值:
lue("select Max(ID) where id > 111");
分页查询:
DataSet ds = taSetByPage(1, 2, " ID > @ID and Name = @mmm order by ID");
3.3 EntityQuery
主要用于希望返回的结果是实体(弱类型)
以强类型的方式使用,其对外接口和功能与EntityQuery类似,只是返回强类型的对象,
EntityQuery返回弱类型的对象。
创建方式:
1、通过Entity对象:
EntityQuery eq = Query();
2、通过EntityFullName:
EntityQuery q = new EntityQuery("er");
EntityQuery q = new EntityQuery(_FullName);
返回实体:FindByID和Find
FindByID ,先从缓存加载对象,如果缓存没有,则从数据库加载对象;
Customer a = ID();
Customer a = (Customer)ID();
Find方式,直接从数据库加载, 然后查缓存,如果缓存有,用缓存对象替换;
(“ID = @ID”);
("ID = @ID”);
返回实体集合
条件OQL方式:
q = new EntityQuery(_FullName);
l(“ID >1 ");
3.4 EntityViewQuery
报表中用。
4. 第三方程序(DotNet平台)以Web方式调用U9 SV
4.1 找到所需的服务
查询集团文档或利用SQL语句结合查询,如:
select
yName As [类显示名 ]
,a. FullName as [ 类全名]
,c. AssemblyName as [ 程序集名]
,c. Kind as [ 组件类型]
,d. DisplayName as [ 组件显示名 ]
from UBF_MD_Class as a
left join UBF_MD_Class_Trl as b on a. Local_ID=b .Local_ID
left join UBF_MD_Component as c on a. MD_Component_ID=c .ID
left join UBF_MD_Component_Trl as d on c. Local_ID=d .Local_ID
where (1 =1)
and ( c. Kind='SV' )
and B. DisplayName like '%创建%物料%'
(U9的服务均在PortalServices内)
4.2 测试服务是否可用
以创建物料(料品)的服务为例,IE地址栏中输入(第一次加载比较慢):
vml-win2008r2/u9/services/
4.2.1 可能的出错情况
服务不可用时,可能会出现的情况:
1、提示:配置错误 无法读取配置文件,因为它超过了最大文件大小
解决:
<<>>
修改注册表
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINESOFTWAREMicrosoftInetStpConfiguration]
"MaxWebConfigFileSizeInKB"=dword:00000000
(可把以上内容,粘贴到txt文件中,注意靠左,然后修改txt文件为reg文件,双击reg文件进行注册即可)
注册后需重启iis。
如仍出现这个问题:
运行->inetmgr->应用程序池->DefaultAppPool->设置应用程序池默认设置->启用32位应用程序->False;
2、之后,还有可能出现MIME映射问题;
提示:由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加
MIME 映射
解决:
执行:meworkv3.0Windows Communication -I
(建议在命令窗口内执行)
作用:安装此版本的Windows Communication Foundation ......
4.3 生成代理类
Svcutil vml-win2008r2/u9/services/ /ser:DataContractSerializer
生成一个.cs文件,一个.config文件。
4.4 .NET架构项目
1. 用VS新建项目,
2. 把代理类和配置文件加到项目中
3. 修改名称为
4. 添加和引用
(如果一个项目中需要用到调用多个服务,则需要合并代理类和配置文件,请参考合并代理类说明文档,未测试)
4.5 尝试编译
“ExceptionDetail”方法没有采用“0”个参数的重载
在报错的相应位置的类里面添加
public ServiceExceptionDetail(Exception exception) : base(exception) { }
4.6 项目实现细节
4.6.1 调用服务框架代码
private void button1_Click(object sender, EventArgs e)
{
d = false;
//实例化代理类
UFIDAU9ISVItemIBatchCreateItemByDTOSRVClient client;
client = new UFIDAU9ISVItemIBatchCreateItemByDTOSRVClient();
//返回异常信息,目前还没有使用此属性
eBase[] returnMsg;
//上下文信息
object context;
9CBOPubControllerContextDTOData contextdto1 = new
UFIDAU9CBOPubControllerContextDTOData();
//该服务的返回结果
9CBOSCMItemItemMasterData[] returnItems;
//该服务的传入参数
UFIDAU9ISVItemItemMasterDTOData[] itemMasterDtos;
try
{
//给上下文信息赋值
context = CreateContextObj();
contextdto1 = CreateContextDto();
//给传入参数赋值
itemMasterDtos = SetItemMasterDtos();
//服务调用(经验证,v2.5第二个参数context可传null),add by peter 2015-05-25 Context
可传入其中一个即可(杂发单中验证通过),context or contextdto1
returnItems = (out returnMsg, context, itemMasterDtos, contextdto1);
("一个料品生成成功!");
}
catch (Exception ex)
{
//异常信息捕获
throw new Exception(GetExceptionMessage(ex));
}
finally
{ d = true; }
}
4.6.2 上下文信息
// 给上下文信息赋值
private static Context CreateContextObj()
{
// 实例化应用上下文对象
Context thContext = new ThreadContext();
nary
发布评论