如何使用PyRFC在RFC_READ_TABLE查询中指定Open SQL WHERE子句?
我正在尝试开始使用PyRFC让python从SAP进行表格提取(在没有支持/合作基础团队的情况下)。在这个来自http://scn.sap.com/community/scripting-languages/blog/2012/11/04/revisiting-python-and-sap-with-pyrfc的示例中,他们使用:
pyrfc.Connector.call("RFC_READ_TABLE", QUERY_TABLE=table, DELIMITER='|')
http://saplsmw.com/node/101表示需要将WHERE子句作为OPTION传递给RFC调用。我怎么在PyRFC中这样做? (OPTIONS是SAP端的RFC_READ_TABLE函数模块声明中类型表的导出变量)。
编辑:确定http://scn.sap.com/community/scripting-languages/blog/2014/05/05/python-for-basis有一个在OPTIONS中发送WHERE子句的例子:
OPTIONS = [{'TEXT':source_where}])
所以看起来语法是单个元素字典的数组(映射SAP表类型),其中键是SAP数据类型,值是WHERE子句。
接下来的问题是:如何指定要发送到RFC_READ_TABLE的PACKAGE SIZE,以便我可以提取大型表而不会达到内部表限制?
答案 0 :(得分:5)
RFC_READ_TABLE有一个参数' ROWCOUNT'它指定在单个调用中返回的最大行数。
当然,如果你说一次将它限制为1000行,那么如果表包含超过1000行,你可能会有其他行永远不会下载。
要解决此问题,还有另一个参数,' ROWSKIPS'通过它您可以指定要返回的起始行。
所以,第一次通话 ROWCOUNT = 1000 ROWSKIPS = 0
下一个电话 ROWCOUNT = 1000 ROWSKIPS = 1000
下一个电话 ROWCOUNT = 1000 ROWSKIPS = 2000
等等,每次递增ROWSKIPS如下:ROWSKIPS = ROWSKIPS + ROWCOUNT。
定义了ROWCOUNT和ROWSKIPS的示例PyRFC调用,它从TCURR中以10个批次读取(并且FCURR设置为' USD'):
#!/usr/bin/env python
from pyrfc import Connection, ABAPApplicationError, ABAPRuntimeError, LogonError, CommunicationError
from ConfigParser import ConfigParser
from pprint import PrettyPrinter
def main():
try:
config = ConfigParser()
config.read('sapnwrfc.cfg')
params_connection = config._sections['connection']
conn = Connection(**params_connection)
options = [{ 'TEXT': "FCURR = 'USD'"}]
pp = PrettyPrinter(indent=4)
ROWS_AT_A_TIME = 10
rowskips = 0
while True:
print u"----Begin of Batch---"
result = conn.call('RFC_READ_TABLE', \
QUERY_TABLE = 'TCURR', \
OPTIONS = options, \
ROWSKIPS = rowskips, ROWCOUNT = ROWS_AT_A_TIME)
pp.pprint(result['DATA'])
rowskips += ROWS_AT_A_TIME
if len(result['DATA']) < ROWS_AT_A_TIME:
break
except CommunicationError:
print u"Could not connect to server."
raise
except LogonError:
print u"Could not log in. Wrong credentials?"
raise
except (ABAPApplicationError, ABAPRuntimeError):
print u"An error occurred."
raise
if __name__ == '__main__':
main()