3

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 は、RFC 呼び出しに WHERE 句を OPTION として渡す必要があると述べています。PyRFC でこれを行うにはどうすればよいですか? (OPTIONS は、SAP 側の RFC_READ_TABLE の汎用モジュール宣言に含まれるテーブル型のエクスポート変数です)。

編集: OK http://scn.sap.com/community/scripting-languages/blog/2014/05/05/python-for-basisには、OPTIONS で WHERE 句を送信する例があります。

OPTIONS = [{'TEXT':source_where}])

したがって、構文は、キーが SAP データ型で値が WHERE 句である単一要素辞書の配列 (SAP テーブル型をマップする) のように見えます。

次の質問は、RFC_READ_TABLE に送信される PACKAGE SIZE を指定して、内部テーブル制限に達することなく大きなテーブルを抽出できるようにするにはどうすればよいですか?

4

1 に答える 1

7

RFC_READ_TABLE には、1 回の呼び出しで返される行の最大数を指定するパラメーター '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()
于 2014-07-31T09:30:05.277 に答える