ABAPを使用したR / 3システムへの為替レートのアップロード

私は1つの非常に大きな産業企業でABAPプログラマーとして働いています。 私は主にサポートとメンテナンスに従事しているため、私の仕事にはしばしば小康状態があります。 ABAPに関する記事を書くことにしました。



R / 3の仕事に就いたとき、私はすでに何かを見て、それをすることができました。 ABAP / 4私たちは研究所で勉強しました。 それらは基本的な構文を示しましたが、いくつかのプログラムは気取らないで書かれました。



仕事の最初の週に、ABAPの本を読んで、率直に逃しました。 しばらくして、ようやくタスクが与えられました。



歓迎に興味がある人。



結局のところ、タスクはかなり一般的な問題を解決することを目的としていました。 つまり、中央銀行のWebサイトから通貨レートをシステムにダウンロードします。



私たちの会社には、これらの同じコースの導入に携わっている人がいます。



介入前の仕組み。 ユーザーはセントロバンクのサイトにアクセスし、コースラベルをコピーしてから、スクリプトを目的の形式でpythonで作成し、ユーザーはR / 3でトランザクションを開始し、受信したテキストファイルをプログラムにフィードしました。 非常に洗練された操作。



仕事に行きました。



最初に、中央銀行のWebサイトを見て、そのサイトからXMLファイルの形式で為替レートを取得できることがわかりました。 私は脳が自分のために食べてはいけないと判断し、このファイルを食べて内部のタブレットに詰め込むプログラムを開始するために書き始めました。

R / 3はXMLファイルの食べ方を知っていますが、XMLを操作するための機能モジュールを理解できず、自転車を書くことにしました。私は若かったです。 インターネット、ヘルプ、スマートブックを避けない方法で、ファイルを内部タブレットに読み込むFMを見つけました。 結果は次のような形式です。



*    . form get_file tables table_name using file_name like rlgrap-filename. call function 'WS_UPLOAD' exporting CODEPAGE = ' ' FILENAME = FILE_NAME FILETYPE = 'ASC' tables DATA_TAB = TABLE_NAME exceptions CONVERSION_ERROR = 1 FILE_OPEN_ERROR = 2 FILE_READ_ERROR = 3 INVALID_TYPE = 4 NO_BATCH = 5 OTHERS = 6. *   . case sy-subrc. when 1. write '  .'. exit. when 2. write '  .'. exit. when 3. write '  .'. exit. when 4. write '  .'. exit. when 5. write 'Front-End Function Cannot Be Executed in Backgrnd.'. exit. when 6. write ' .'. exit. endcase. endform.
      
      







FMは、各行がダウンロードされたファイルの行であるTABLE_NAMEラベルを発行します。 質問はフォームの行から生じました:

 <Valute ID="R01010"> <NumCode>036</NumCode> <CharCode>AUD</CharCode> <Nominal>1</Nominal> <Name> </Name> <Value>27,0138</Value> </Valute>
      
      







通貨コード、額面、実際のレートを取得します。 Web開発に携わっていた以前の仕事では、この分野であまり成功していませんでしたが、いくつかの有用な知識を得ました。 一般に、次にヘルプに没頭したときに、ABAPが正規表現で機能できることを学びました。 ためらうことなく、次のような構造を構築しました。



 *    . read table valuta into valuta index 2. RE-PLACE REGEX '(\W\w+\W\w+\W+)(\d+)(\D)(\d+)(\D)(\d+)(\W+\w+\W+\w+.\w+)' IN valuta WITH `$2.$4.$6`. if sy-subrc = 0. date = valuta. endif. *     . loop at l_val into l_val. clear val. if l_val-waers <> 'UE'. *       XML   . concatenate '<CharCode>' l_val-waers '</CharCode>' into s_val. find s_val in table valuta match line index. if sy-subrc = 0. val-kodv = l_val-waers. val-datan = date. add 1 to index. read table valuta into valuta index index. *   . REPLACE REGEX '(\W+\w+\W)(\d+)(\W+\w+\W)' IN valuta WITH '$2'. nom = valuta. add 2 to index. read table valuta into valuta index index. *     . RE-PLACE REGEX '(\W+\w+\W)(\d+)(\D)(\d+)(\W+\w+\W)' IN valuta WITH '$2.$4'. if sy-subrc = 0. tmp = valuta / nom. val-kyrsp = tmp. replace all occurrences of '.' in val-kyrsp with ','. *    . append val. endif. else. s_val = text-wv1. replace '&1' in s_val with l_val-waers. message s_val type 'I'. endif. endif. endloop.
      
      







ずさんな、しかしその後、すべてがうまくいったとき、私は自分自身を誇りに思っていました。



この時点で、インターネットにアクセスするためのログインとパスワードが与えられました。 そして上司は、HTTP_GET汎用モジュールの方向を見ることを提案しました。 しかし、残念なことに、このモジュールのドキュメントはシステムにありませんでした。この奇跡をどのように処理するかを触って推測する必要がありました。



URLパスワードとプロキシログインをフィードしようとしましたが、結果はありませんでした。 いくつかの実験を行った結果、プロキシサーバーは外部に移動しないと判断しました。



私は再びGoogleとフォーラムを掘り下げなければなりませんでした。 フォーラムの1つで解決策を見つけました。 HTTP_GETがプロキシと不正に通信しており、解決策が提案されていることがわかりました。



プロキシデータはTHTTPラベルに入力する必要があります。このテーブルのEXITFUNCフィールドには、汎用モジュール「HTTP_PROXY_CONFIG」を入力する必要があります(URLに接続するためにプロキシが必要かどうかを判断します。



さて、汎用モジュールの呼び出し自体は私にとって次のようになります。



 call function 'HTTP_GET' exporting absolute_uri = url blankstocrlf = 'x' timeout = 500 rfc_destination = 'SAPHTTP' tables response_entity_body = file_table response_headers = file_headers exceptions connect_failed = 1 timeout = 2 internal_error = 3 tcpip_error = 4 data_error = 5 system_failure = 6 communication_failure = 7.
      
      







すべての操作とタンバリンでのダンスの後、R / 3はサイトに侵入し始め、必要なデータを内部テーブルに取り込み始めました。 プログラムはサイトからデータを取得し、正規表現を使用して結果のプレートからコードと為替レートを引き出し、これらすべてをバッチ入力でシステムに入力します。



All Articles