如何用SO_DOCUMENT_READ_API1在SSIS/C#中下载SAP采购订单附件?
用C#/SSIS调用SAP函数下载采购订单附件
前提准备
确保项目已引用SAP .NET Connector 3.0(NCo3),这是C#连接SAP RFC的官方组件。同时确认SAP用户拥有S_SPO_DEV(文档操作权限)、S_DATASET(文件访问权限)及对应采购订单的权限。
步骤1:调用SO_DOCUMENT_READ_API1获取附件数据
你已通过SRGBTBREL拿到INSTID_B(附件密钥),接下来用该函数读取附件的详细信息和内容:
C#代码示例
using SAP.Middleware.Connector; using System.IO; // 1. 初始化SAP连接(需提前在配置文件中定义目标系统别名) var sapDestination = RfcDestinationManager.GetDestination("YourSAPSystemAlias"); var sapRepository = sapDestination.Repository; // 2. 创建函数实例并传入附件密钥 var docReadFunc = sapRepository.CreateFunction("SO_DOCUMENT_READ_API1"); docReadFunc.SetValue("DOCUMENT_ID", myAttachmentKey); // 传入你的INSTID_B // 3. 执行函数 docReadFunc.Invoke(sapDestination); // 4. 解析附件表并保存文件 var attachmentsTable = docReadFunc.GetTable("ATTACHMENTS"); foreach (var attachment in attachmentsTable) { string fileName = attachment.GetString("FILENAME"); byte[] fileContent = attachment.GetBytes("DATA"); // 保存附件到本地指定路径 var savePath = Path.Combine(@"C:\SAP_Attachments", fileName); File.WriteAllBytes(savePath, fileContent); // 处理外部存储链接(若附件未直接存在SAP内部) string docType = attachment.GetString("DOCUMENT_TYPE"); if (docType is "URL" or "LINK") { // 链接通常存储在DESCRIPTION字段,需根据实际场景调整 string fileLink = attachment.GetString("DESCRIPTION"); // 可将链接存入变量或输出到SSIS目标组件 } }
步骤2:处理内容服务器存储的附件
如果附件存储在SAP内容服务器(而非SO文档容器内),SO_DOCUMENT_READ_API1仅返回引用信息,需额外调用SCMS_DOC_READ获取实际文件内容,或用SCMS_URL_GET生成访问链接:
获取内容服务器文件内容示例
var scmsReadFunc = sapRepository.CreateFunction("SCMS_DOC_READ"); scmsReadFunc.SetValue("DOC_ID", attachment.GetString("DOCUMENT_ID")); // 从ATTACHMENTS表提取DOCUMENT_ID scmsReadFunc.Invoke(sapDestination); byte[] contentServerFileData = scmsReadFunc.GetBytes("CONTENT"); // 执行保存文件逻辑(同步骤1)
SSIS集成方法
将上述C#代码封装为Script Task,在SSIS包中配置SAP连接参数,通过变量传递INSTID_B值,执行完成后可将文件路径或链接输出到SSIS变量,供后续流程使用。
内容的提问来源于stack exchange,提问作者Cascador84
相关产品推荐
相关产品推荐

