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

2024-05-15 06:17:40 发布

您现在位置:Python中文网/ 问答频道 /正文

如何使用PyRFC在RFC_READ_表查询中指定opensqlwhere子句?在

我试图从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子句作为选项传递给RFC调用。在PyRFC中我该怎么做?(OPTIONS是SAP端RFC_READ_table的函数模块声明中table类型的导出变量)。在

EDIT:OKhttp://scn.sap.com/community/scripting-languages/blog/2014/05/05/python-for-basis有一个在OPTIONS中发送WHERE子句的示例:

^{pr2}$

因此,语法看起来像是一个数组(映射SAP表类型),其中键是SAP数据类型,值是where子句。在

所以下一个问题是:如何指定要发送到RFC_READ_表的包大小,以便在不触及内部表限制的情况下提取大表?在


Tags: communitycomhttpreadrfctable情况blog
1条回答
网友
1楼 · 发布于 2024-05-15 06:17:40

RFC_READ_TABLE有一个参数“ROWCOUNT”,该参数指定在单个调用中返回的最大行数。在

当然,如果您说一次限制为1000行,那么如果表中包含的行数超过1000行,那么您可能永远不会下载其他行。在

要解决这个问题,还有另一个参数“ROWSKIPS”,通过它可以指定要返回的起始行。在

所以,第一个电话 行数=1000 行跳过=0

下一个电话 行数=1000 行跳过=1000

下一个电话 行数=1000 ROWSKIPS=2000

依此类推,每次递增ROWSKIPS如下:ROWSKIPS=ROWSKIPS+ROWCOUNT。在

一个定义了ROWCOUNT和ROWSKIPS的PyRFC调用示例,该调用以10为批从TCURR读取数据(其中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()

相关问题 更多 >

    热门问题