本文描述了在开发接口实现其他出库单保存服务时遇到的问题。虽然单据在数据库中已保存成功,但在界面上不显示。原因是数据库中有一个关键字段【FOBJECTTYPEID】需要赋值才能在界面上显示单据,但该字段在BOS(业务对象服务)中没有与数据库字段关联,因此在保存操作时无法为该字段赋值。文中展示了保存单据的相关代码,包括创建单据视图、填充单据属性、执行保存操作及处理保存结果的逻辑。
问题描述:开发接口实现 其他出库单保存服务时,我的单据已经保存成功了,但是在界面不显示,我查看后台的数据发现,数据库中有一个字段的值需要有值,才能在前台界面的单据列表中显示出单据,但是这个字段在bos中并没有元素与数据库中的字段关联。我在做保存操作的时候没有办法从元数据给该字段赋值【FOBJECTTYPEID】,【FOBJECTTYPEID】是怎么样赋值?
代码如下:
private void ImportMaterial()
{
IBillView billView = this.CreateMaterialView();
((IBillViewService)billView).LoadData();
this.FillMaterialPropertys(billView);
OperateOption saveOption = OperateOption.Create();
this.SaveMaterial(billView, saveOption);
}
private void FillMaterialPropertys(IBillView billView)
{
billView.Model.SetValue("FBillNo", "", 0);
billView.Model.SetItemValueByNumber("FStockOrgId", "103", 0);
billView.Model.SetValue("FStockDirect", "普通", 0);
billView.Model.SetValue("FDocumentStatus", "A", 0);
billView.Model.SetValue("FOwnerTypeIdHead", "BD_OwnerOrg", 0);
billView.Model.SetItemValueByNumber("FOwnerIdHead", "103", 0);
billView.Model.SetItemValueByNumber("FDEPTID", "BM000005", 0);
billView.Model.SetItemValueByNumber("FMATERIALID", "SB000034", 0);
billView.Model.SetItemValueByNumber("FUnitID", "Pcs", 0);
billView.Model.SetItemValueByNumber("FBASEUNITID", "Pcs", 0);
billView.Model.SetItemValueByNumber("FSTOCKID", "CK001", 0);
billView.Model.SetItemValueByNumber("FSTOCKSTATUSID", "KCZT01_SYS", 0);
billView.Model.SetItemValueByNumber("FOWNERID", "103", 0);
billView.Model.SetValue("FSTOCKFLAG", true, 0);
billView.Model.SetValue("FBASEQTY", 1, 0);
billView.Model.SetValue("FQty", 1, 0);
}
private void SaveMaterial(IBillView billView, OperateOption saveOption)
{
// 调用保存操作
IOperationResult saveResult = BusinessDataServiceHelper.Save(
this.Context,
billView.BillBusinessInfo,
billView.Model.DataObject,
saveOption,
"Save");
// 显示处理结果
if (saveResult == null)
{
this.View.ShowErrMessage("未知原因导致保存失败!");
return;
}
else if (saveResult.IsSuccess == true)
{// 保存成功,直接显示
this.View.ShowOperateResult(saveResult.OperateResult);
return;
}
else if (saveResult.InteractionContext != null
&& saveResult.InteractionContext.Option.GetInteractionFlag().Count > 0)
{// 保存失败,需要用户确认问题
InteractionUtil.DoInteraction(this.View, saveResult, saveOption,
new Action
formResult, opResult, option) =>
{
// 用户确认完毕,重新调用保存处理
this.SaveMaterial(billView, option);
}));
}
// 保存失败,显示错误信息
if (saveResult.IsShowMessage)
{
saveResult.MergeValidateErrors();
this.View.ShowOperateResult(saveResult.OperateResult);
return;
}
}
private IBillView CreateMaterialView()
{
// 读取物料的元数据
FormMetadata meta = MetaDataServiceHelper.Load(this.Context, "STK_MISCELLANEOUS") as FormMetadata;
Form form = meta.BusinessInfo.GetForm();
// 创建用于引入数据的单据view
Type type = Type.GetType("Kingdee.BOS.Web.Import.ImportBillView,Kingdee.BOS.Web");
var billView = (IDynamicFormViewService)Activator.CreateInstance(type);
// 开始初始化billView:
// 创建视图加载参数对象,指定各种参数,如FormId, 视图(LayoutId)等
BillOpenParameter openParam = CreateOpenParameter(meta);
// 动态领域模型服务提供类,通过此类,构建MVC实例
var provider = form.GetFormServiceProvider();
billView.Initialize(openParam, provider);
return billView as IBillView;
}
private BillOpenParameter CreateOpenParameter(FormMetadata meta)
{
Form form = meta.BusinessInfo.GetForm();
// 指定FormId, LayoutId
BillOpenParameter openParam = new BillOpenParameter(form.Id, meta.GetLayoutInfo().Id);
// 数据库上下文
openParam.Context = this.Context;
// 本单据模型使用的MVC框架
openParam.ServiceName = form.FormServiceName;
// 随机产生一个不重复的PageId,作为视图的标识
openParam.PageId = Guid.NewGuid().ToString();
// 元数据
openParam.FormMetaData = meta;
// 界面状态:新增 (修改、查看)
openParam.Status = OperationStatus.ADDNEW;
// 单据主键:本案例演示新建物料,不需要设置主键
openParam.PkValue = null;
// 界面创建目的:普通无特殊目的 (为工作流、为下推、为复制等)
openParam.CreateFrom = CreateFrom.Default;
// 基础资料分组维度:基础资料允许添加多个分组字段,每个分组字段会有一个分组维度
// 具体分组维度Id,请参阅 form.FormGroups 属性
openParam.GroupId = "";
// 基础资料分组:如果需要为新建的基础资料指定所在分组,请设置此属性
openParam.ParentId = 0;
// 单据类型
openParam.DefaultBillTypeId = "";
// 业务流程
openParam.DefaultBusinessFlowId = "";
// 主业务组织改变时,不用弹出提示界面
openParam.SetCustomParameter("ShowConfirmDialogWhenChangeOrg", false);
// 插件
List
openParam.SetCustomParameter(FormConst.PlugIns, plugs);
PreOpenFormEventArgs args = new PreOpenFormEventArgs(this.Context, openParam);
foreach (var plug in plugs)
{// 触发插件PreOpenForm事件,供插件确认是否允许打开界面
plug.PreOpenForm(args);
}
if (args.Cancel == true)
{// 插件不允许打开界面
// 本案例不理会插件的诉求,继续....
}
// 返回
return openParam;
}
推荐阅读