1 1 1 1 1 Rating 0% (0 Votes)

Following the example of downloading exchange rates from Central Bank Of Turkey using transformations, please find bellow the same way for National Bank of Poland.

Again, lets create an RFC destination (lets call it here Z_DESTINATION_TO_NBP) tha will point to https://www.nbp.pl/kursy/xml/lasta.xml, where the last exchange rates are posted.

 

The XML behind has following structure:

<?xml version="1.0" encoding="ISO-8859-2"?>
<tabela_kursow typ="A" uid="20a067">
   <numer_tabeli>067/A/NBP/2020</numer_tabeli>
   <data_publikacji>2020-04-06</data_publikacji>
   <pozycja>
      <nazwa_waluty>bat (Tajlandia)</nazwa_waluty>
      <przelicznik>1</przelicznik>
      <kod_waluty>THB</kod_waluty>
      <kurs_sredni>0,1285</kurs_sredni>
   </pozycja>
   <pozycja>
      <nazwa_waluty>dolar amerykański</nazwa_waluty>
      <przelicznik>1</przelicznik>
      <kod_waluty>USD</kod_waluty>
      <kurs_sredni>4,2257</kurs_sredni>
   </pozycja>
   <pozycja>
      <nazwa_waluty>dolar australijski</nazwa_waluty>
      <przelicznik>1</przelicznik>
      <kod_waluty>AUD</kod_waluty>
      <kurs_sredni>2,5614</kurs_sredni>
   </pozycja>
   <pozycja>
      <nazwa_waluty>dolar Hongkongu</nazwa_waluty>
      <przelicznik>1</przelicznik>
      <kod_waluty>HKD</kod_waluty>
      <kurs_sredni>0,5451</kurs_sredni>
   </pozycja>
   <pozycja>
      <nazwa_waluty>dolar kanadyjski</nazwa_waluty>
      <przelicznik>1</przelicznik>
      <kod_waluty>CAD</kod_waluty>
      <kurs_sredni>2,9916</kurs_sredni>
   </pozycja>
   <pozycja>
      <nazwa_waluty>dolar nowozelandzki</nazwa_waluty>
      <przelicznik>1</przelicznik>
      <kod_waluty>NZD</kod_waluty>
      <kurs_sredni>2,5005</kurs_sredni>
   </pozycja>
   <pozycja>
      <nazwa_waluty>dolar singapurski</nazwa_waluty>
      <przelicznik>1</przelicznik>
      <kod_waluty>SGD</kod_waluty>
      <kurs_sredni>2,9451</kurs_sredni>
   </pozycja>
   <pozycja>
      <nazwa_waluty>euro</nazwa_waluty>
      <przelicznik>1</przelicznik>
      <kod_waluty>EUR</kod_waluty>
      <kurs_sredni>4,5612</kurs_sredni>
   </pozycja>
   <pozycja>
      <nazwa_waluty>forint (Węgry)</nazwa_waluty>
      <przelicznik>100</przelicznik>
      <kod_waluty>HUF</kod_waluty>
      <kurs_sredni>1,2554</kurs_sredni>
   </pozycja>
   <pozycja>
      <nazwa_waluty>frank szwajcarski</nazwa_waluty>
      <przelicznik>1</przelicznik>
      <kod_waluty>CHF</kod_waluty>
      <kurs_sredni>4,3199</kurs_sredni>
   </pozycja>
   <pozycja>
      <nazwa_waluty>funt szterling</nazwa_waluty>
      <przelicznik>1</przelicznik>
      <kod_waluty>GBP</kod_waluty>
      <kurs_sredni>5,2030</kurs_sredni>
   </pozycja>
   <pozycja>
      <nazwa_waluty>hrywna (Ukraina)</nazwa_waluty>
      <przelicznik>1</przelicznik>
      <kod_waluty>UAH</kod_waluty>
      <kurs_sredni>0,1551</kurs_sredni>
   </pozycja>
   <pozycja>
      <nazwa_waluty>jen (Japonia)</nazwa_waluty>
      <przelicznik>100</przelicznik>
      <kod_waluty>JPY</kod_waluty>
      <kurs_sredni>3,8703</kurs_sredni>
   </pozycja>
   <pozycja>
      <nazwa_waluty>korona czeska</nazwa_waluty>
      <przelicznik>1</przelicznik>
      <kod_waluty>CZK</kod_waluty>
      <kurs_sredni>0,1648</kurs_sredni>
   </pozycja>
   <pozycja>
      <nazwa_waluty>korona duńska</nazwa_waluty>
      <przelicznik>1</przelicznik>
      <kod_waluty>DKK</kod_waluty>
      <kurs_sredni>0,6107</kurs_sredni>
   </pozycja>
   <pozycja>
      <nazwa_waluty>korona islandzka</nazwa_waluty>
      <przelicznik>100</przelicznik>
      <kod_waluty>ISK</kod_waluty>
      <kurs_sredni>2,9332</kurs_sredni>
   </pozycja>
   <pozycja>
      <nazwa_waluty>korona norweska</nazwa_waluty>
      <przelicznik>1</przelicznik>
      <kod_waluty>NOK</kod_waluty>
      <kurs_sredni>0,4026</kurs_sredni>
   </pozycja>
   <pozycja>
      <nazwa_waluty>korona szwedzka</nazwa_waluty>
      <przelicznik>1</przelicznik>
      <kod_waluty>SEK</kod_waluty>
      <kurs_sredni>0,4153</kurs_sredni>
   </pozycja>
   <pozycja>
      <nazwa_waluty>kuna (Chorwacja)</nazwa_waluty>
      <przelicznik>1</przelicznik>
      <kod_waluty>HRK</kod_waluty>
      <kurs_sredni>0,5982</kurs_sredni>
   </pozycja>
   <pozycja>
      <nazwa_waluty>lej rumuński</nazwa_waluty>
      <przelicznik>1</przelicznik>
      <kod_waluty>RON</kod_waluty>
      <kurs_sredni>0,9443</kurs_sredni>
   </pozycja>
   <pozycja>
      <nazwa_waluty>lew (Bułgaria)</nazwa_waluty>
      <przelicznik>1</przelicznik>
      <kod_waluty>BGN</kod_waluty>
      <kurs_sredni>2,3321</kurs_sredni>
   </pozycja>
   <pozycja>
      <nazwa_waluty>lira turecka</nazwa_waluty>
      <przelicznik>1</przelicznik>
      <kod_waluty>TRY</kod_waluty>
      <kurs_sredni>0,6232</kurs_sredni>
   </pozycja>
   <pozycja>
      <nazwa_waluty>nowy izraelski szekel</nazwa_waluty>
      <przelicznik>1</przelicznik>
      <kod_waluty>ILS</kod_waluty>
      <kurs_sredni>1,1652</kurs_sredni>
   </pozycja>
   <pozycja>
      <nazwa_waluty>peso chilijskie</nazwa_waluty>
      <przelicznik>100</przelicznik>
      <kod_waluty>CLP</kod_waluty>
      <kurs_sredni>0,4882</kurs_sredni>
   </pozycja>
   <pozycja>
      <nazwa_waluty>peso filipińskie</nazwa_waluty>
      <przelicznik>1</przelicznik>
      <kod_waluty>PHP</kod_waluty>
      <kurs_sredni>0,0833</kurs_sredni>
   </pozycja>
   <pozycja>
      <nazwa_waluty>peso meksykańskie</nazwa_waluty>
      <przelicznik>1</przelicznik>
      <kod_waluty>MXN</kod_waluty>
      <kurs_sredni>0,1673</kurs_sredni>
   </pozycja>
   <pozycja>
      <nazwa_waluty>rand (Republika Południowej Afryki)</nazwa_waluty>
      <przelicznik>1</przelicznik>
      <kod_waluty>ZAR</kod_waluty>
      <kurs_sredni>0,2223</kurs_sredni>
   </pozycja>
   <pozycja>
      <nazwa_waluty>real (Brazylia)</nazwa_waluty>
      <przelicznik>1</przelicznik>
      <kod_waluty>BRL</kod_waluty>
      <kurs_sredni>0,7898</kurs_sredni>
   </pozycja>
   <pozycja>
      <nazwa_waluty>ringgit (Malezja)</nazwa_waluty>
      <przelicznik>1</przelicznik>
      <kod_waluty>MYR</kod_waluty>
      <kurs_sredni>0,9673</kurs_sredni>
   </pozycja>
   <pozycja>
      <nazwa_waluty>rubel rosyjski</nazwa_waluty>
      <przelicznik>1</przelicznik>
      <kod_waluty>RUB</kod_waluty>
      <kurs_sredni>0,0553</kurs_sredni>
   </pozycja>
   <pozycja>
      <nazwa_waluty>rupia indonezyjska</nazwa_waluty>
      <przelicznik>10000</przelicznik>
      <kod_waluty>IDR</kod_waluty>
      <kurs_sredni>2,5747</kurs_sredni>
   </pozycja>
   <pozycja>
      <nazwa_waluty>rupia indyjska</nazwa_waluty>
      <przelicznik>100</przelicznik>
      <kod_waluty>INR</kod_waluty>
      <kurs_sredni>5,5550</kurs_sredni>
   </pozycja>
   <pozycja>
      <nazwa_waluty>won południowokoreański</nazwa_waluty>
      <przelicznik>100</przelicznik>
      <kod_waluty>KRW</kod_waluty>
      <kurs_sredni>0,3437</kurs_sredni>
   </pozycja>
   <pozycja>
      <nazwa_waluty>yuan renminbi (Chiny)</nazwa_waluty>
      <przelicznik>1</przelicznik>
      <kod_waluty>CNY</kod_waluty>
      <kurs_sredni>0,5956</kurs_sredni>
   </pozycja>
   <pozycja>
      <nazwa_waluty>SDR (MFW)</nazwa_waluty>
      <przelicznik>1</przelicznik>
      <kod_waluty>XDR</kod_waluty>
      <kurs_sredni>5,7448</kurs_sredni>
   </pozycja>
</tabela_kursow>

 

Again I've choosen the XSLT transformation, the code of it (Z_NBP_TRANSFORMATION) you can find bellow. 

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sap="http://www.sap.com/sapxsl" version="1.0">
  <xsl:strip-space elements="*"/>
  <xsl:template match="/">
    <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
      <asx:values>
        <EXCHANGE_RATES>
          <IMPORT_FILE>
            <xsl:for-each select="/tabela_kursow">
              <TYPE>
                <xsl:value-of select="@typ"/>
              </TYPE>
              <UID>
                <xsl:value-of select="@uid"/>
              </UID>
              <TABLE_NUMBER>
                <xsl:value-of select="numer_tabeli"/>
              </TABLE_NUMBER>
              <DATE_OF_PUBLISHING>
                <xsl:value-of select="data_publikacji"/>
              </DATE_OF_PUBLISHING>
              <CURRENCIES>
                <xsl:for-each select="/tabela_kursow/pozycja">
                  <CURRENCY>
                    <CURRENCY_NAME>
                      <xsl:value-of select="nazwa_waluty"/>
                    </CURRENCY_NAME>
                    <UNIT>
                      <xsl:value-of select="przelicznik"/>
                    </UNIT>
                    <CURRENCY_CODE>
                      <xsl:value-of select="kod_waluty"/>
                    </CURRENCY_CODE>
                    <EXCHANGE_RATE>
                      <xsl:value-of select="kurs_sredni"/>
                    </EXCHANGE_RATE>
                  </CURRENCY>
                </xsl:for-each>
              </CURRENCIES>
            </xsl:for-each>
          </IMPORT_FILE>
        </EXCHANGE_RATES>
      </asx:values>
    </asx:abap>
  </xsl:template>
</xsl:transform>

 

To download the XML file and to call transformation, you can use following dirty ABAP code. The structure of the XML will be transformed into internal table of a type EXCHANGE_RATES.

 

CLASS lcl_exchange_rates DEFINITION.
  PUBLIC SECTION.
    TYPESBEGIN OF currency,
             currency_name TYPE string,
             unit          TYPE string,
             currency_code TYPE string,
             exchange_rate TYPE string,
           END OF currency,
           BEGIN OF exchange_rate,
             type               TYPE string,
             uid                TYPE string,
             table_number       TYPE string,
             date_of_publishing TYPE string,
             currencies         TYPE STANDARD TABLE OF currency WITH DEFAULT KEY,
           END OF exchange_rate,
           exchange_rates TYPE STANDARD TABLE OF exchange_rate WITH DEFAULT KEY.
    METHODSget_exchange_rates RETURNING VALUE(exchange_ratesTYPE exchange_rates.
  PRIVATE SECTION.
    DATAxml TYPE string.
    METHODSget_xml_from_bank.
    METHODStransform_xml_to_table RETURNING VALUE(exchange_ratesTYPE exchange_rates.

ENDCLASS.

CLASS lcl_exchange_rates IMPLEMENTATION.

  METHOD get_xml_from_bank.
    cl_http_client=>create_by_destination(
        EXPORTING
          destination              'Z_DESTINATION_TO_NBP'
        IMPORTING
          client                   DATA(client)
        EXCEPTIONS
          argument_not_found       1
          destination_not_found    2
          destination_no_authority 3
          plugin_not_active        4
          internal_error           5
          OTHERS                   6
      ).
    IF sy-subrc EQ 0.
      client->request->set_methodif_http_request=>co_request_method_get ).
      client->sendEXCEPTIONS
                     http_communication_failure 1
                     http_invalid_state         2
                     http_processing_failed     3
                     http_invalid_timeout       4
                     OTHERS                     5
                    ).
      IF sy-subrc EQ 0.

        client->receive(
        EXCEPTIONS
          http_communication_failure 1
          http_invalid_state         2
          http_processing_failed     3
          OTHERS                     ).
        IF sy-subrc EQ 0.
          xml =  client->response->get_cdata).
        ENDIF.
      ENDIF.
    ENDIF.
  ENDMETHOD.

  METHOD transform_xml_to_table.
    CALL TRANSFORMATION z_nbp_transformation
      SOURCE XML xml
      RESULT exchange_rates exchange_rates.
  ENDMETHOD.

  METHOD get_exchange_rates.
    get_xml_from_bank).
    exchange_rates transform_xml_to_table(  ).
  ENDMETHOD.

ENDCLASS.

 

Now again you can use BAPI_EXCHANGERATE_CREATE to store the exchange rates in your system.