如何通过SDK从已审批草稿创建SAP B1已审批文档?
通过SAP Business One SDK创建已审批文档的解决方案
首先明确:可以通过SDK创建带有审批状态及流程历史的已审批文档,你之前使用SaveDraftToDocument()的方式仅完成了草稿转普通文档的操作,并未触发审批流程逻辑,因此不会生成审批状态和流程历史记录(OWDD、WDD1表数据)。
要实现目标,需要结合SAP B1的审批流程API,完整走一遍「创建草稿→关联审批模板→提交审批→完成审批」的流程,以下是C#代码示例:
SAPbobsCOM.Company oCompany = new SAPbobsCOM.Company(); // 此处省略公司连接逻辑,确保oCompany已成功连接到SAP B1系统 try { // 1. 创建草稿并关联审批模板 SAPbobsCOM.Documents oDocDraft = (SAPbobsCOM.Documents)oCompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.oDrafts); // 设置草稿基础信息(以销售订单为例) oDocDraft.DocType = SAPbobsCOM.BoDocumentTypes.dDocument_Items; oDocDraft.CardCode = "C0001"; // 替换为实际客户编码 oDocDraft.DocDate = DateTime.Now; oDocDraft.DocDueDate = DateTime.Now.AddDays(7); // 添加行项目 oDocDraft.Lines.ItemCode = "I0001"; // 替换为实际物料编码 oDocDraft.Lines.Quantity = 10; oDocDraft.Lines.Price = 100; oDocDraft.Lines.Add(); // 关联预先创建的审批模板(需在SAP B1客户端配置好,获取模板ID) int approvalTemplateId = 1; // 替换为你的审批模板ID oDocDraft.ApprovalTemplate = approvalTemplateId; // 保存草稿 int saveResult = oDocDraft.Add(); if (saveResult != 0) { SAPbobsCOM.CompanyService oCompanyService = oCompany.GetCompanyService(); SAPbobsCOM.IErrorInfo errorInfo = (SAPbobsCOM.IErrorInfo)oCompanyService.GetLastError(); throw new Exception($"保存草稿失败:{errorInfo.Message}"); } int draftDocEntry = oCompany.GetNewObjectKey(); // 获取刚创建的草稿DocEntry // 2. 提交审批申请 SAPbobsCOM.WorkflowService oWorkflowService = (SAPbobsCOM.WorkflowService)oCompany.GetCompanyService().GetBusinessService(SAPbobsCOM.ServiceTypes.WorkflowService); SAPbobsCOM.WFSubmitRequestParams submitParams = (SAPbobsCOM.WFSubmitRequestParams)oWorkflowService.GetDataInterface(SAPbobsCOM.WorkflowServiceDataInterfaces.wsdiWFSubmitRequestParams); submitParams.DocEntry = draftDocEntry; submitParams.ObjectType = (int)SAPbobsCOM.BoObjectTypes.oDrafts; submitParams.Comments = "通过SDK提交审批申请"; oWorkflowService.SubmitRequest(submitParams); // 3. 模拟审批人完成审批操作(需当前用户拥有审批权限) SAPbobsCOM.WFActionRequestParams actionParams = (SAPbobsCOM.WFActionRequestParams)oWorkflowService.GetDataInterface(SAPbobsCOM.WorkflowServiceDataInterfaces.wsdiWFActionRequestParams); // 查询对应工作流实例ID SAPbobsCOM.Recordset oRs = (SAPbobsCOM.Recordset)oCompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.BoRecordset); oRs.DoQuery($"SELECT InstanceID FROM OWDD WHERE DocEntry = {draftDocEntry} AND ObjType = {(int)SAPbobsCOM.BoObjectTypes.oDrafts}"); if (oRs.RecordCount == 0) { throw new Exception("未找到对应的工作流实例"); } int instanceId = int.Parse(oRs.Fields.Item("InstanceID").Value.ToString()); actionParams.InstanceID = instanceId; actionParams.Action = SAPbobsCOM.WFApprovalAction.wfa_Approve; // 执行同意审批动作 actionParams.Comments = "通过SDK完成审批"; oWorkflowService.PerformAction(actionParams); // 4. 将已审批草稿转为正式文档 SAPbobsCOM.Documents oApprovedDraft = (SAPbobsCOM.Documents)oCompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.oDrafts); oApprovedDraft.GetByKey(draftDocEntry); int convertResult = oApprovedDraft.SaveDraftToDocument(); if (convertResult != 0) { SAPbobsCOM.CompanyService oCompanyService = oCompany.GetCompanyService(); SAPbobsCOM.IErrorInfo errorInfo = (SAPbobsCOM.IErrorInfo)oCompanyService.GetLastError(); throw new Exception($"转换为正式文档失败:{errorInfo.Message}"); } Console.WriteLine("已成功创建带审批历史的已审批文档"); } catch (Exception ex) { Console.WriteLine($"执行错误:{ex.Message}"); } finally { // 释放COM资源 if (oCompany != null && oCompany.Connected) { oCompany.Disconnect(); } System.Runtime.InteropServices.Marshal.ReleaseComObject(oCompany); }
关键注意事项:
- 审批模板ID获取:可通过查询SAP B1的
OWTG表获取预先配置的审批模板ID,SQL示例:SELECT Code FROM OWTG WHERE Name = '你的审批模板名称'。 - 权限配置:执行代码的SAP B1用户必须拥有「创建草稿」「提交审批」「审批文档」的对应权限,否则会触发权限错误。
- 流程历史生成:执行上述流程后,
OWDD(工作流实例表)和WDD1(工作流步骤历史表)会自动生成对应记录,正式文档(如ORDR表)的ApprovalStatus字段会被标记为已审批状态。
内容的提问来源于stack exchange,提问作者Leotardo
相关产品推荐
相关产品推荐

