我正在尝试将已在Excel VBA上运行的SAP表下载脚本移植到Python,但是我想要一个命令行版本,出于某些超出此目标的原因,我希望避免使用VBScript发布。 我陷入了需要在表格中填写值的那一刻
这是代码
from win32com.client import Dispatch
Functions = Dispatch("SAP.Functions")
Functions.Connection.Client = "400"
Functions.Connection.ApplicationServer = "myserver"
Functions.Connection.Language = "EN"
Functions.Connection.User = "myuser"
Functions.Connection.Password = "mypwd"
Functions.Connection.SystemNumber = "00"
Functions.Connection.UseSAPLogonIni = False
if (Functions.Connection.Logon (0,True) == True):
print("Logon OK")
RFC = Functions.Add("RFC_READ_TABLE")
RFC.exports("QUERY_TABLE").Value = "USR02"
RFC.exports("DELIMITER").Value = "~"
#RFC.exports("ROWSKIPS").Value = 2000
#RFC.exports("ROWCOUNT").Value = 10
tblOptions = RFC.Tables("OPTIONS")
#RETURNED DATA
tblData = RFC.Tables("DATA")
tblFields = RFC.Tables("FIELDS")
tblFields.AppendRow ()
print(tblFields.RowCount)
print(tblFields(1,"FIELDNAME"))
# the 2 lines above print 1 and an empty string, so the row in the table exists
直到此处,它基本上都是从VBA复制以适应语法。 在VBA上,我现在可以做到
tblFields(1,"FIELDNAME") = "BNAME"
如果我做同样的事情,我会得到一个错误,因为左边的部分是一个函数,并且以这种方式编写,它返回一个字符串。在VBA中,它可能是一个二维数组。
我没有尝试过各种方法,例如
tblFields.setValue([{"FIELDNAME":"BNAME"}])
tblFields(1,"FIELDNAME").Value = "BNAME"
tblFields(1,"FIELDNAME").setValue("BNAME")
tblFields.FieldName = "BNAME" ##kinda desperate
该脚本适用于产生少于500个字符的行的输出,而无需设置FIELDS表。这是该功能中的SAP限制。
我知道这不是最好的方法,但是我不能使用SAPNWRFC库,也不能使用librfc32.dll。 我必须能够解决这种问题,或者恢复到VB版本。
感谢任何能提供提示的人
答案 0 :(得分:0)
经过反复试验,我找到了解决方案。 无需将行逐行添加到“ OPTIONS”或“ FIELDS”表中,您只需提交预填充的表即可。 这应该起作用:
tblFields.Data = (('VBELN', '000000', '000000', '', ''),
('POSNR', '000000', '000000', '', ''))
与此处相同:
tblOptions.Data = (("VBELN EQ '2557788'",),)