如何/在何处指定PyRFC中的Open SQL调用SAP RFC_READ_TABLE

时间:2014-06-11 20:36:49

标签: python sql sap where-clause

如何使用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,以便我可以提取大型表而不会达到内部表限制?

1 个答案:

答案 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()