K3Cloud70插件开发应用案例讲课讲稿Word文件下载.docx
《K3Cloud70插件开发应用案例讲课讲稿Word文件下载.docx》由会员分享,可在线阅读,更多相关《K3Cloud70插件开发应用案例讲课讲稿Word文件下载.docx(14页珍藏版)》请在冰点文库上搜索。
a)
新建(打开)收货单插件工程(MyDev.K3.SCM.Stock.Business.PlugIn);
b)
重载OnInitialize方法,定义List<
EnumItem>
用于存储下拉列表枚举值;
c)
通过this.View.BusinessInfo.GetFieldList()方法获取所有字段;
d)
通过this.View.GetControl<
ComboFieldEditor>
方法获取界面上的下拉列表控件;
e)
SetComboItems绑定值;
f)
代码如下:
C#
publicoverridevoidOnInitialize(InitializeEventArgse)
{
base.OnInitialize(e);
List<
list=newList<
();
foreach(Fieldfieldinthis.View.BusinessInfo.GetFieldList())
{
EnumItemitem=newEnumItem();
item.Caption=field.Name;
item.EnumId=field.Key;
item.Value=field.Key;
list.Add(item);
}
this.View.GetControl<
("
FCombo"
).SetComboItems(list);
}
在分录菜单上增加库存查询(tbQueryInventory)菜单项;
运行IDE,选择单据体-菜单集合,新增菜单:
保存;
点击库存查询时,查询分录上当前焦点所在物料的库存;
打开插件工程,重载方法EntryBarItemClick
判断BarItemKey==库存查询(tbQueryInventory)
取当前分录行
设置ListShowParameter参数,打开表单
这里介绍2种获取当前分录字段数据的方法:
TryGetEntryCurrentRow:
获取单据体当前行,返回是否取到值以及行数据和行号;
另外一种方法:
先获取单据体当前行号,再取指定行数据;
2种方法没什么区别。
示例代码如下:
publicoverridevoidEntryBarItemClick(BarItemClickEventArgse)
base.EntryBarItemClick(e);
if(e.BarItemKey=="
tbQueryInventory"
)
ShowQueryInventory();
privatevoidShowQueryInventory()
DynamicObjectrow;
introwIndex;
//直接获取当前分录行返回的是分录行对象。
if(this.Model.TryGetEntryCurrentRow("
FEntity"
outrow,outrowIndex))
ListShowParameterparameter=newListShowParameter();
parameter.FormId="
STK_Inventory"
;
//即时库存的FormId
parameter.MultiSelect=false;
parameter.ListFilterParameter.Filter=string.Format("
FMaterialId='
{0}'
"
Convert.ToString(row["
FBase_Id"
]));
this.View.ShowForm(parameter);
取单据体当前行号,再取指定行的字段数据的方法如下:
//获取当前行
introwIndex=this.Model.GetEntryCurrentRowIndex("
);
if(rowIndex>
-1)//判断当前行有数据
//取指定行的物料(ide中设置key为FBase)字段数据
DynamicObjectmaterialObj=(DynamicObject)this.Model.GetValue("
FBase"
rowIndex);
materialObj["
Id"
].ToString());
调试状态下,可以屏蔽代码parameter.ListFilterParameter.Filter看看过滤条件的效果。
注意:
ListFilterParameter的Filter属性设置的字段是用IDE中的字段标识。
查询库存时按组织隔离,只查询当前组织的库存:
增加过滤条件,组织=当前组织
FORGID={0}"
this.Model.Context.CurrentOrganizationInfo.ID)});
重载AuthPermissionBeforeF7Select方法,设置参数IsIsolationOrg=false;
同样,如果需要F8时控制只显示当前组织的物料,该参数设置为true。
在BOS系统中,默认是按组织隔离的,即非共享基础资料,在F8时都是只显示当前组织的物料。
代码示例如下:
publicoverridevoidAuthPermissionBeforeF7Select(AuthPermissionBeforeF7SelectEventArgse)
base.AuthPermissionBeforeF7Select(e);
if(e.FieldKey=="
e.IsIsolationOrg=false;
publicoverridevoidBeforeDoOperation(BeforeDoOperationEventArgse)
base.BeforeDoOperation(e);
if(e.Operation.FormOperation.Operation.Equals("
DRAFT"
StringComparison.OrdinalIgnoreCase))
this.Model.SetValue("
FBillTypeID"
null);
F8时只显示审核日期〉2014-03-22的供应商;
重载BeforeF7Select事件;
设置列表过滤参数ListFilterParameter的属性Filter;
publicoverridevoidBeforeF7Select(BeforeF7SelectEventArgse)
base.BeforeF7Select(e);
FSupplierId1"
stringfilter="
FCreateDate>
'
2014-03-20'
if(string.IsNullOrEmpty(e.ListFilterParameter.Filter))
e.ListFilterParameter.Filter=filter;
else
e.ListFilterParameter.Filter+="
AND"
+filter;
新建收货单服务插件工程MyDev.K3.SCM.App.Stock.ServicePlugIn;
定义保存服务类SaveServicePlugIn,继承自AbstractOperationServicePlugIn;
重载OnAddValidators方法;
publicoverridevoidOnAddValidators(AddValidatorsEventArgse)
base.OnAddValidators(e);
SaveValidatorsaveValidator=newSaveValidator();
saveValidator.EntityKey="
FBillHead"
e.Validators.Add(saveValidator);
定义保存校验类SaveValidator,继承自AbstractValidator;
重载方法:
Validate:
i.
获取单据体分录数据,取到物料Id;
ii.
查询物料库存;
iii.
检查库存是否〉100;
iv.
构造校验结果信息;
代码示例:
publicoverridevoidValidate(ExtendedDataEntity[]dataEntities,ValidateContextvalidateContext,Kingdee.BOS.Contextctx)
if(dataEntities==null||dataEntities.Length==0)
return;
Dictionary<
long,decimal>
dictErrMaterialId=newDictionary<
//取所有物料
long>
listMaterialId=newList<
foreach(ExtendedDataEntityentityObjindataEntities)
DynamicObjectCollectioncollection=(DynamicObjectCollection)entityObj["
];
foreach(DynamicObjectrowObjincollection)
listMaterialId.Add((long)rowObj["
]);
stringsql="
selecta.FMATERIALID,sum(a.FBASEQTY)FQTYfrom
T_STK_INVENTORYawhereexists(select1fromTABLE(fn_StrSplit(@FMATERIALID,'
'
1))twheret.FID=a.FMATERIALID)groupbyFMATERIALID"
SqlParamparam=newSqlParam("
@FMATERIALID"
KDDbType.udt_inttable,listMaterialId.Distinct().ToArray());
using(IDataReaderdr=DBUtils.ExecuteReader(this.Context,sql,param))
while(dr.Read())
decimalqty=Convert.ToDecimal(dr["
FQTY"
if(qty>
100)
dictErrMaterialId.Add(Convert.ToInt64(dr["
FMATERIALID"
]),qty);
if(dictErrMaterialId.ContainsKey((long)rowObj["
]))
ValidationErrorInfoerrinfo=newValidationErrorInfo("
Convert.ToString(entityObj.DataEntity["
]),entityObj.DataEntityIndex,Convert.ToInt32(rowObj["
]),"
SaveValidator"
"
库存数量大于100"
校验失败"
ErrorLevel.Error);
validateContext.AddError(entityObj,errinfo);
锁定字段的方法:
this.View.LockField;
该锁定与事务无关,只要在客户端保存后事件(AfterBarItemClick)处理即可;
“收料部门”、“收料员”的key可以在IDE设计器中拷贝;
代码如下:
publicoverridevoidAfterBarItemClick(AfterBarItemClickEventArgse)
base.AfterBarItemClick(e);
tbSave"
this.View.LockField("
FBase1"
true);
FBase2"
保存后自动记录收料日志(KDV_stk_ReceiptLog);
根据需求设计收料日志表:
字段
名称
类型
说明
KDV_ID
日志ID
int
自增长
KDV_UserID
操作用户
Int
关联用户表ID
KDV_Date
操作时间
Datetime
缺省getdate
KDV_Content
日志内容
Nvarchar(2000)
保存有2种方法:
方法1:
在IDE中定义收料日志基础资料;
打开收货单服务插件保存服务类SaveServicePlugIn;
根据收料日志基础资料的元数据定义,创建动态实体对象;
设置对象属性值;
调用BusinessDataService服务的保存方法保存动态实体对象;
publicoverridevoidAfterExecuteOperationTransaction(AfterExecuteOperationTransactione)
base.AfterExecuteOperationTransaction(e);
MetaDataServicemetaService=newMetaDataService();
FormMetadataformMetaData=(FormMetadata)metaService.Load(this.Context,"
1823871d-b9cf-4d8b-93af-39c0c37011a5"
DynamicObjectTypedt=formMetaData.BusinessInfo.GetDynamicObjectType();
DynamicObjectobj=newDynamicObject(dt);
dt.Properties["
KDV_UserID_Id"
].SetValueFast(obj,this.Context.UserId);
KDV_Content"
].SetValueFast(obj,"
保存"
ISaveServicesaveService=ServiceHelper.GetService<
ISaveService>
saveService.Save(this.Context,newDynamicObject[]{obj});
方法2:
自定义收料日志表;
获取日志的自增长(序列)值;
执行insert;
SequenceReadersequence=newSequenceReader(this.Context);
int[]ids=(int[])sequence.GetSequence("
KDV_stk_ReceiptLog"
1);
intid=ids[0];
insertintoKDV_stk_ReceiptLog(FID,KDV_UserID,KDV_Content)values(@FID,@KDV_UserID,@KDV_Content)"
SqlParam[]sqlParams=newSqlParam[3];
sqlParams[0]=newSqlParam("
@FID"
KDDbType.Int64,id);
sqlParams[1]=newSqlParam("
@KDV_UserID"
KDDbType.Int64,this.Context.UserId);
sqlParams[2]=newSqlParam("
@KDV_Content"
KDDbType.String,"
DBUtils.Execute(this.Context,sql,sqlParams);