首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在RFC_READ_TABLE调用中通过PyRFC打开SQL条件

在RFC_READ_TABLE调用中通过PyRFC打开SQL条件
EN

Stack Overflow用户
提问于 2014-06-11 20:36:48
回答 1查看 6K关注 0票数 3

如何使用RFC_READ_TABLE在PyRFC查询中指定Open子句?

我正在尝试从PyRFC开始使用python表提取(在没有支持/合作的基础团队的情况下)。在http://scn.sap.com/community/scripting-languages/blog/2012/11/04/revisiting-python-and-sap-with-pyrfc的这个例子中,他们使用:

代码语言:javascript
复制
pyrfc.Connector.call("RFC_READ_TABLE", QUERY_TABLE=table, DELIMITER='|')

http://saplsmw.com/node/101说,需要传递WHERE子句作为RFC调用的一个选项。我如何在PyRFC中做到这一点?(OPTIONS是RFC_READ_ table在SAP端的函数模块声明中表类型的导出变量)。

编辑: OK http://scn.sap.com/community/scripting-languages/blog/2014/05/05/python-for-basis有一个在选项中发送WHERE子句的示例:

代码语言:javascript
复制
OPTIONS = [{'TEXT':source_where}])

因此,语法看起来像是单个元素字典的数组(映射SAP表类型),其中键是SAP数据类型,值是where子句。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-31 09:30:05

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设置为‘美元’):

代码语言:javascript
复制
#!/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()
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24172130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档