点击此处---> 群内免费提供SAP练习系统(在群公告中)
加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)
你好大师,
我一直在广泛研究如何动态传递参数以运行Data Manager Package。 但是,即使按照我在本文档上明确解释的所有说明进行操作,也 http://scn.sap。 com/docs/DOC-32636 我的VBA代码不断抛出错误"运行时错误52:文件名或数字错误",它指出了这行代码;
设置objStream = objFile.OpenTextFile(strFilename(strPackageName),_ ForWriting,正确)
您中有人遇到过这样的错误吗?如果是,您如何调试它?
这是完整的VBA代码,以备不时之需;
公共子executeDmPackageWithParameters() '在该位置创建答案提示文件 '在名称范围" PACKAGE"中指定 createAnswerPromptFile" PACKAGE"," PARAMETERS" '获取DM Automation类实例 昏暗的objDMautomation作为EPMAddInDMAutomation 设置objDMautomation = New EPMAddInDMAutomation '运行在Excel名称范围" PACKAGE"中指定的包, '使用名称范围" PACKAGE"中指定的promtp文件 objDMautomation.RunPackage objPackageFromSheet(" PACKAGE"),_ strFilename(" PACKAGE") 结束子 私有函数strFilename(strRange As String)As String '获取设置DM包参数的范围 Dim rngPackageRange作为范围 设置rngPackageRange = Application.Names(strRange).RefersToRange '遍历行 对于i = 1到rngPackageRange.Rows.Count 如果rngPackageRange(i,1).Value =" PromptFile"然后 strFilename = rngPackageRange(i,2).Value 退出功能 万一 下一个 结束功能 私有函数strPackageDescription(strRange As String)As String '获取设置DM包参数的范围 Dim rngPackageRange作为范围 设置rngPackageRange = Application.Names(strRange).RefersToRange '遍历行 对于i = 1到rngPackageRange.Rows.Count 如果rngPackageRange(i,1).Value =" PackageId",则 strPackageDescription = rngPackageRange(i,2).Value 退出功能 万一 下一个 结束功能 私有函数objPackageFromSheet(strRange As String)作为ADMPackage '获取设置DM包参数的范围 Dim rngPackageRange作为范围 设置rngPackageRange = Application.Names(strRange).RefersToRange '创建ADM包对象 设置objPackageFromSheet =新的ADMPackage '遍历行 对于i = 1到rngPackageRange.Rows.Count 选择Case rngPackageRange(i,1).Value 案例"文件名" objPackageFromSheet.Filename = rngPackageRange(i,2).Value 案例" GroupId" objPackageFromSheet.groupId = rngPackageRange(i,2).Value 案例" PackageDesc" objPackageFromSheet.packageDesc = rngPackageRange(i,2).Value 案例" PackageId" objPackageFromSheet.packageId = rngPackageRange(i,2).Value 案例" PackageType" objPackageFromSheet.packageType = rngPackageRange(i,2).Value 案例" TeamId" objPackageFromSheet.teamId = rngPackageRange(i,2).Value 案例"用户组" objPackageFromSheet.UserGroup = rngPackageRange(i,2).Value 结束选择 下一个 结束功能 私人子createAnswerPromptFile(strPackageName作为字符串,_ strParametersName作为字符串) '创建一个新的XML文档 昏暗的objDOM作为DOMDocument 设置objDOM = New DOMDocument '设置XML文档的处理指令 昏暗的objProcessingInstruction作为IXMLDOMProcessingInstruction 设置objProcessingInstruction = _ objDOM.createProcessingInstruction(" xml",_ "版本='1.0'编码='utf-16'") objDOM.appendChild objProcessingInstruction '创建根元素 昏暗的objRootElem作为IXMLDOMElement 设置objRootElem = objDOM.createElement(" ArrayOfAnswerPromptPersistingFormat") objDOM.appendChild objRootElem XSI属性 昏暗的objMemberRel作为IXMLDOMAttribute 设置objMemberRel = objDOM.createAttribute(" xmlns:xsi") objMemberRel.NodeValue =" http://www.w3.org/2001/XMLSchema-instance" objRootElem.setAttributeNode objMemberRel XSD属性 设置objMemberRel = objDOM.createAttribute(" xmlns:xsd") objMemberRel.NodeValue =" http://www.w3.org/2001/XMLSchema" objRootElem.setAttributeNode objMemberRel '获取包含参数的单元格范围 调光参数作为范围 设置rngParameters = ThisWorkbook.Names(strParametersName).RefersToRange 'Excel.Names(strParametersName).RefersToRange ' 昏暗的objCurrentStringPairParent为IXMLDOMElement '遍历每一行 对于i = 1到rngParameters.Rows.Count '查看正在传递的参数类型 选择大小写rngParameters(i,2).Value '如果它是单个参数,则将参数节点添加到根节点 情况"参数" addSingleSelectionParameterToXML rngParameters(i,1).Value,_ rngParameters(i,4).Value,_ objRootElem,_ objDOM '如果是值列表 案例" StringListPairs" '如果是一组新的字符串列表对,则创建一个新的父级 如果rngParameters(i,1).Value <> strCurrentStringPair然后 strCurrentStringPair = rngParameters(i,1)。值 设置objCurrentStringPairParent = _ getStringListPairParent(rngParameters(i,1).Value,_ objRootElem,_ objDOM) 万一 '将尺寸名称和值添加到父级 addStringListPair rngParameters(i,3).Value,_ rngParameters(i,4).Value,_ objCurrentStringPairParent,_ objDOM 结束选择 下一个 '创建文件对象 昏暗的objFile作为FileSystemObject 设置objFile = New FileSystemObject '创建一个流以创建并写入文件 昏暗的objStream作为TextStream 设置objStream = objFile.OpenTextFile(strFilename(strPackageName),_ ForWriting,正确) '先写DM包的名称,然后写XML输出 objStream.WriteLine strPackageDescription(strPackageName)和_ " {param_separator}"和_ objDOM.XML '关闭文件 objStream.Close 结束子 私有函数addStringListPair(strVariableName As String,_ strValue作为字符串,_ objParent作为IXMLDOMElement,_ objDOM As DOMDocument) '创建" StringListPair"节点 昏暗的objStringListPairElement作为IXMLDOMElement 设置objStringListPairElement = _ objDOM.createElement(" StringListPair") objParent.appendChild objStringListPairElement '创建包含变量名称的" Str"元素 昏暗的objStrElement作为IXMLDOMElement 设置objStrElement = objDOM.createElement(" str") objStringListPairElement.appendChild objStrElement objStrElement.Text = strVariableName '创建" lst"元素 昏暗的objLstElement作为IXMLDOMElement 设置objLstElement = objDOM.createElement(" lst") objStringListPairElement.appendChild objLstElement '创建包含变量值的"字符串"元素 昏暗的objStringElement作为IXMLDOMElement 设置objStringElement = objDOM.createElement(" string") objLstElement.appendChild objStringElement objStringElement.Text = strValue 结束功能 私有函数getStringListPairParent(strVariableName As String,_ objParent作为IXMLDOMElement,_ objDOM As DOMDocument)As IXMLDOMElement '创建" AnswerPromptPersistingFormat"节点 Dim objAnswerPromptPersistingFormatElement作为IXMLDOMElement 设置objAnswerPromptPersistingFormatElement = _ objDOM.createElement(" AnswerPromptPersistingFormat") objParent.appendChild objAnswerPromptPersistingFormatElement '创建" _ap"节点 将objApElement昏暗为IXMLDOMElement 设置objApElement = objDOM.createElement(" _ ap") objAnswerPromptPersistingFormatElement.appendChild objApElement '创建参数名称元素 昏暗的objParameterElement作为IXMLDOMElement 设置objParameterElement = objDOM.createElement(" Name") objApElement.appendChild objParameterElement objParameterElement.Text = strVariableName '创建值元素 将objValuesElement昏暗为IXMLDOMElement 设置objValuesElement = objDOM.createElement(" Values") objApElement.appendChild objValuesElement '创建" _apc"节点 设置getStringListPairParent = objDOM.createElement(" _ apc") objAnswerPromptPersistingFormatElement.appendChild getStringListPairParent 结束功能 专用函数addSingleSelectionParameterToXML(strVariableName As String,_ strValue作为字符串,_ objParent作为IXMLDOMElement,_ objDOM As DOMDocument) '创建" AnswerPromptPersistingFormat"节点 Dim objAnswerPromptPersistingFormatElement作为IXMLDOMElement 设置objAnswerPromptPersistingFormatElement = _ objDOM.createElement(" AnswerPromptPersistingFormat") objParent.appendChild objAnswerPromptPersistingFormatElement '创建" _ap"节点 将objApElement昏暗为IXMLDOMElement 设置objApElement = objDOM.createElement(" _ ap") objAnswerPromptPersistingFormatElement.appendChild objApElement '创建参数名称元素 昏暗的objParameterElement作为IXMLDOMElement 设置objParameterElement = objDOM.createElement(" Name") objApElement.appendChild objParameterElement objParameterElement.Text = strVariableName '创建值元素 将objValuesElement昏暗为IXMLDOMElement 设置objValuesElement = objDOM.createElement(" Values") objApElement.appendChild objValuesElement '使用传递给参数的值创建字符串元素 昏暗的objStringElement作为IXMLDOMElement 设置objStringElement = objDOM.createElement(" string") objValuesElement.appendChild objStringElement objStringElement.Text = strValue 结束功能
并且我正在尝试传递参数以运行此DM;
如果您愿意,我还可以提供"参数"和"包装"的提示列表和名称范围。 提前致谢。
(37.1 kB)
使用我的代码: https://blogs.sap.com/2017/06/16/simple-vba-function-to-pass-parameters-to-dm-packages /
它正在工作!
不,不需要命名范围。 您可以从Excel单元格读取值以获取参数值或对代码中的某些参数进行硬核化。
P.S。
VBA代码不断抛出错误"运行时错误52:文件名或数字错误",并指出了这行代码;
您好像忘记了包含本文档第17页开头列出的所有必需参考文献:
http://scn.sap.com/docs/DOC-32636
Microsoft脚本运行时等等...
但是我不建议使用此文档-这是一个过于复杂的示例,在Excel中有很多无用的字段。
一周热门 更多>