Python-win32com和SAP中的RFC_READ_TABLE表设置值

时间:2018-09-03 15:57:59

标签: python sap win32com saprfc

我正在尝试将已在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版本。

感谢任何能提供提示的人

1 个答案:

答案 0 :(得分:0)

经过反复试验,我找到了解决方案。 无需将行逐行添加到“ OPTIONS”或“ FIELDS”表中,您只需提交预填充的表即可。 这应该起作用:

tblFields.Data = (('VBELN', '000000', '000000', '', ''),
                  ('POSNR', '000000', '000000', '', ''))

与此处相同:

tblOptions.Data = (("VBELN EQ '2557788'",),)