You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 17:42:36