Python 通过PyRFC在RFC_READ_表调用中打开SQL条件

Python 通过PyRFC在RFC_READ_表调用中打开SQL条件,python,sap,where-clause,opensql,pyrfc,Python,Sap,Where Clause,Opensql,Pyrfc,如何使用PyRFC在RFC_READ_表查询中指定opensqlwhere子句 我正在尝试从PyRFC开始,从SAP提取pythondo表(在缺乏支持/合作的basis团队的情况下)。在本例中,他们使用: pyrfc.Connector.call("RFC_READ_TABLE", QUERY_TABLE=table, DELIMITER='|') 表示需要将WHERE子句作为选项传递给RFC调用。在PyRFC中如何执行此操作?(OPTIONS是SAP端RFC_READ_表的功能模块声明中ta

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

我正在尝试从PyRFC开始,从SAP提取pythondo表(在缺乏支持/合作的basis团队的情况下)。在本例中,他们使用:

pyrfc.Connector.call("RFC_READ_TABLE", QUERY_TABLE=table, DELIMITER='|')
表示需要将WHERE子句作为选项传递给RFC调用。在PyRFC中如何执行此操作?(OPTIONS是SAP端RFC_READ_表的功能模块声明中table类型的导出变量)

EDIT:OK有一个发送选项中WHERE子句的示例:

OPTIONS = [{'TEXT':source_where}])
因此,语法似乎是一个单元素字典数组(映射SAP表类型),其中键是SAP数据类型,值是where子句


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

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

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

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

那么,第一个电话 行数=1000 ROWSKIPS=0

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

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

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

定义了ROWCOUNT和RowSkip的PyRFC调用示例,该调用以10为一批从TCURR中读取(其中FCURR设置为“USD”):

#/usr/bin/env python
来自pyrfc导入连接、ABAPApplicationError、ABAPRUNTIMERROR、LogonError、CommunicationOnError
从ConfigParser导入ConfigParser
从pprint导入预打印机
def main():
尝试:
config=ConfigParser()
config.read('sapnwrfc.cfg')
params_connection=config._节['connection']
连接=连接(**参数连接)
选项=[{'TEXT':“FCURR='USD'”}]
pp=预印机(缩进=4)
每次行数=10
rowskips=0
尽管如此:
打印u“----批次开始---”
结果=conn.call('RFC\u READ\u TABLE'\
查询_表='TCURR'\
选项=选项\
行跳过=行跳过,行计数=每次行)
pp.pprint(结果['DATA'])
rowskips+=每次行数
如果len(结果['DATA'])在某个时间小于行数:
打破
除通信错误外:
“打印u”无法连接到服务器
提升
除登录错误外:
打印u“无法登录。凭据错误?”
提升
除了(ABAPApplicationError,ABAPrumTimeError):
“打印u”发生错误
提升
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
#!/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()