TCMB Döviz kurlarının Sap Sistemine Transferi programı
SAP Sistemine TCMB sitesinden kurları transfer edebileceğiniz aşağıdaki programı önce test sisteminizde deneyip kullanabilirsiniz. Programda ilk ekranında TCMB Kur Kontrol Tarihi olarak istenilen tarih Merkez bankasında yayınlandığı tarihtir. Diğeri ise Sisteme kaydedilen tarihtir. Bunun anlamı şudur. TCMB de bugünün kuru hep bir gün önce yayınlanır. Dolayısıyla 02 şubat kurunu sisteme aktaracaksanız kur kontrol tarihi 01 şubat olmalıdır. Cuma günü açıklanan kur ise C.tesi, Pazar ve P.tesi günlerine ait bir kur olduğu için 3 gün için aynı tarihi kullanmalısınız. Örneğin 08.02.2019 Cuma günü açıklanan kuru, 09 C.tesi, 10 Pazar ve 11 P.tesi günleri için de sisteme aktarmalısınız.
Karşınıza gelen aşağıdaki ekranda " MB Kur Bilgilerinin Sap’a Transferi " butonuna bastığınızda Sisteminize aktarılacaktır.
" Aşağıdaki sap programı kaynak kodlarını sisteminizde oluşturarak kullanabilirsiniz. "
SAP Sistemine TCMB sitesinden kurları transfer edebileceğiniz aşağıdaki programı önce test sisteminizde deneyip kullanabilirsiniz. Programda ilk ekranında TCMB Kur Kontrol Tarihi olarak istenilen tarih Merkez bankasında yayınlandığı tarihtir. Diğeri ise Sisteme kaydedilen tarihtir. Bunun anlamı şudur. TCMB de bugünün kuru hep bir gün önce yayınlanır. Dolayısıyla 02 şubat kurunu sisteme aktaracaksanız kur kontrol tarihi 01 şubat olmalıdır. Cuma günü açıklanan kur ise C.tesi, Pazar ve P.tesi günlerine ait bir kur olduğu için 3 gün için aynı tarihi kullanmalısınız. Örneğin 08.02.2019 Cuma günü açıklanan kuru, 09 C.tesi, 10 Pazar ve 11 P.tesi günleri için de sisteme aktarmalısınız.
Karşınıza gelen aşağıdaki ekranda " MB Kur Bilgilerinin Sap’a Transferi " butonuna bastığınızda Sisteminize aktarılacaktır.
" Aşağıdaki sap programı kaynak kodlarını sisteminizde oluşturarak kullanabilirsiniz. "
Kod:
&---------------------------------------------------------------------
*& Report Z_TCMB_KUR_TRANSFER
*&
&---------------------------------------------------------------------
*&
*&
&---------------------------------------------------------------------
REPORT Z_TCMB_KUR_TRANSFER .
TABLES: TCURR.
PARAMETERS:
p_kurdat like SY-DATUM , "TCMB Kur Tarihi" “01.02.2019”
p_update like SY-DATUM . "Transfer(Kayıt) Tarihi" “02.02.2019”
DATA:
TABCURR LIKE TCURR OCCURS 10 WITH HEADER LINE,
TABCURR1 LIKE TCURR OCCURS 10 WITH HEADER LINE.
DATA:
TAB_CURR TYPE STANDARD TABLE OF TCURR,
TAB_CURR_WA LIKE LINE OF TAB_CURR.
DATA : XML_TABLE TYPE STRING,
l_filename_string type string , "new
l_t_data(200) OCCURS 0 WITH HEADER LINE , "new
* XSTRING formatındaki XML verisi..
XML_DATA TYPE XSTRING,
* XML dosyasının boyutu..
XML_SIZE TYPE I,
* PARSE edilmiş XML verisi...
XML_RESULT LIKE TABLE OF SMUM_XMLTB WITH HEADER LINE,
* HTTP Client..
HTTP_CLIENT TYPE REF TO IF_HTTP_CLIENT,
* RETURN
RETURN LIKE TABLE OF BAPIRET2.
DATA LINE LIKE SY-TABIX.
DATA:
LV_URL TYPE STRING,
LV_XML TYPE STRING.
DATA: BEGIN OF GT_DATA OCCURS 0,
CURRENCYCODE(3) ,
CURRENCYNAME(25) ,
FOREXBUYING(25) ,
END OF GT_DATA .
DATA: BEGIN OF KUR_DATA OCCURS 0,
CURR_KUR_TIPI LIKE TCURR-KURST , "Kur Tipi
CURR_KAYNAK_PB LIKE TCURR-FCURR , "Kaynak PB
CURR_HEDEF_PB LIKE TCURR-TCURR , "Hedef PB
CURR_DATE LIKE TCURR-GDATU , "Kur Geç.Baş.Tarih
CURR_VALUE LIKE TCURR-UKURS , "Kur Değeri
FFACT LIKE TCURR-FFACT , "Kaynak PB faktörü
TFACT LIKE TCURR-FFACT , "Hedef PB faktörü
END OF KUR_DATA .
*Define parametrik web adres değişkeni...
DATA: BEGIN OF WEB_ADRES,
PATH_1(30) VALUE 'http://www.tcmb.gov.tr/kurlar/' ,
PATH_2(06) , "yyyymm
ARA VALUE '/' ,
KURDOSYA_DATE(08) , "ddmmyyyy'
KURDOSYA_FORMAT(04) VALUE '.xml' ,
END OF WEB_ADRES .
DATA W_URL TYPE STRING.
DATA: BEGIN OF W_TAR_1,
GUN(02) ,
AY(02) ,
YIL(04) ,
END OF W_TAR_1 .
DATA: KUR_VALUE LIKE TCURR-UKURS,
KUR_TRDATE LIKE TCURR-GDATU . "Kur Geç.Baş.Tarih
*TCURR tablo update öncesi kullanılacak ara değişkenler...
DATA:
XFCODE LIKE SY-UCOMM OCCURS 10 WITH HEADER LINE,
FIRST_SCREEN,
LISTE,
LINES LIKE SY-TFILL,
ANSWER.
DATA : KAYIT_YAZILAN LIKE SY-TABIX.
*Structure for error message..
TYPES : BEGIN OF ty_s_error,
msg_err(60) TYPE c,
END OF ty_s_error.
DATA:
wa_error TYPE string,
it_output type table of ty_s_error,
wa_output like line of it_output.
DATA : BEGIN OF BDCTABLE OCCURS 1 .
INCLUDE STRUCTURE BDCDATA .
DATA : END OF BDCTABLE .
AT USER-COMMAND.
PERFORM PROCESS_USER_COMMAND.
START-OF-SELECTION.
*Parametrik Tarih değişkenlerinin doldurulması...
W_TAR_1-GUN = p_kurdat+6(2).
W_TAR_1-AY = p_kurdat+4(2).
W_TAR_1-YIL = p_kurdat(4).
CONCATENATE W_TAR_1-YIL W_TAR_1-AY INTO WEB_ADRES-PATH_2.
WEB_ADRES-KURDOSYA_DATE = W_TAR_1.
CONCATENATE WEB_ADRES-PATH_1 WEB_ADRES-PATH_2 WEB_ADRES-ARA WEB_ADRES-KURDOSYA_DATE WEB_ADRES-KURDOSYA_FORMAT INTO W_URL.
LV_URL = W_URL .
* Downloading XML from TCMB web site..
CALL METHOD CL_HTTP_CLIENT=>CREATE_BY_URL
EXPORTING
URL = LV_URL
IMPORTING
CLIENT = HTTP_CLIENT
EXCEPTIONS
ARGUMENT_NOT_FOUND = 1
PLUGIN_NOT_ACTIVE = 2
INTERNAL_ERROR = 3
OTHERS = 4 .
CHECK SY-SUBRC EQ 0.
*Get request..
CALL METHOD HTTP_CLIENT->send
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3
http_invalid_timeout = 4
OTHERS = 5.
IF sy-subrc <> 0.
*? RAISE connection_error.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
* Receive response..Prepare Client-Receive..
CALL METHOD HTTP_CLIENT->receive
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3
OTHERS = 4.
IF sy-subrc NE 0.
DATA subrc TYPE sysubrc.
DATA errortext TYPE string.
CALL METHOD HTTP_CLIENT->get_last_error
IMPORTING
code = subrc
MESSAGE = errortext.
WRITE: / 'communication_error( receive )',
/ 'code: ', subrc, 'message: ', errortext.
EXIT.
ELSE.
*Get HTML:
*Alınan veriyi daha sonra çeşitli amaçlar için kullanabilmemiz için
*tanımladığımız değişkene atıyoruz(Get the response content in Character format).
CLEAR XML_TABLE.
XML_TABLE = HTTP_CLIENT->RESPONSE->GET_CDATA( ).
HTTP_CLIENT->CLOSE( ).
ENDIF.
* STRING verinin XSTRING formatına çevrilmesi..
CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
EXPORTING
TEXT = XML_TABLE
IMPORTING
BUFFER = XML_DATA
EXCEPTIONS
FAILED = 1
OTHERS = 2 .
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
* XSTRING verinin tabloya dönüştürülmesi..
CALL FUNCTION 'SMUM_XML_PARSE'
EXPORTING
XML_INPUT = XML_DATA
TABLES
XML_TABLE = XML_RESULT
RETURN = RETURN .
DESCRIBE TABLE XML_RESULT LINES LINE .
DELETE XML_RESULT WHERE CNAME NE 'CurrencyCode' AND
CNAME NE 'CurrencyName' AND
CNAME NE 'ForexBuying' .
DESCRIBE TABLE XML_RESULT LINES LINE .
* XML Veri Tablosundan Kur Bilgileri Tablosunu Oluşturma İşlemleri...
PERFORM PROCESS_XML_DATA.
Kur Bilgilerini Sisteme UPLOAD öncesi verilerin kontrolü ve
Kur değerini nümerik değere dönüştürme işlemleri...
PERFORM WRITE_DATA.
END-OF-SELECTION.
&---------------------------------------------------------------------
*& Form PROCESS_XML_DATA
&---------------------------------------------------------------------
* text
----------------------------------------------------------------------
--> p1 text
<-- p2 text
----------------------------------------------------------------------
FORM PROCESS_XML_DATA .
DATA : READ_TABIX TYPE I,
FIELDNAME(50) .
FIELD-SYMBOLS <FS>.
LOOP AT XML_RESULT WHERE TYPE EQ 'A'.
IF XML_RESULT-CVALUE EQ 'XDR' .
*Kurların sonu. Çapraz kur değerleri başlangıcında işlem sonlanıyor.
EXIT.
ENDIF.
*Okunan PB değeri dinamik olarak tablo yapısına alınıyor...
CONCATENATE 'GT_DATA-' XML_RESULT-CNAME INTO FIELDNAME.
ASSIGN (FIELDNAME) TO <FS> .
IF <FS> IS ASSIGNED AND SY-SUBRC EQ 0.
<FS> = XML_RESULT-CVALUE.
UNASSIGN <FS> .
ENDIF.
DO.
READ_TABIX = SY-TABIX + 1.
READ TABLE XML_RESULT INDEX READ_TABIX.
IF SY-SUBRC EQ 0 AND XML_RESULT-TYPE EQ 'V' .
*Okunan değer dinamik olarak tablo yapısına alınıyor...
CONCATENATE 'GT_DATA-' XML_RESULT-CNAME INTO FIELDNAME.
ASSIGN (FIELDNAME) TO <FS> .
IF <FS> IS ASSIGNED AND SY-SUBRC EQ 0.
<FS> = XML_RESULT-CVALUE.
UNASSIGN <FS> .
ENDIF.
ELSE.
EXIT.
ENDIF.
ENDDO.
*Tabloya ekleme..
APPEND GT_DATA.
CLEAR GT_DATA.
ENDLOOP.
DESCRIBE TABLE GT_DATA LINES LINE.
LISTE = 1.
ENDFORM. " PROCESS_XML_DATA
&---------------------------------------------------------------------
*& Form WRITE_DATA
&---------------------------------------------------------------------
* text
----------------------------------------------------------------------
--> p1 text
<-- p2 text
----------------------------------------------------------------------
FORM WRITE_DATA.
REFRESH XFCODE. CLEAR XFCODE.
APPEND 'RECS' TO XFCODE.
IF LINE = 0.
IF NOT FIRST_SCREEN IS INITIAL.
EXIT.
ELSE.
APPEND 'EXEC' TO XFCODE.
WRITE: SPACE.
ENDIF.
ENDIF.
IF LISTE = 1.
APPEND 'LIS1' TO XFCODE.
ENDIF.
SET PF-STATUS 'ZMRKGUI01' EXCLUDING XFCODE.
FORMAT COLOR COL_HEADING.
WRITE : /(20) 'Kur Bilg.Tarihi :', (65) p_kurdat .
WRITE : /(20) 'Kayıt Tarihi :', (65) p_update.
WRITE : /(03) 'PB ', (25) 'Tanımı', (50) 'Döviz Alış Değeri' .
WRITE:/01(80) SY-ULINE .
FORMAT COLOR COL_NORMAL.
LOOP AT GT_DATA.
WRITE AT : /(03) GT_DATA-CurrencyCode, (25) GT_DATA-CurrencyName, (50) GT_DATA-ForexBuying.
ENDLOOP.
WRITE:/01(80) SY-ULINE .
ENDFORM. " WRITE_DATA
&---------------------------------------------------------------------
*& Form PROCESS_KUR_BEFORE_TRANSFER
&---------------------------------------------------------------------
* text
----------------------------------------------------------------------
--> p1 text
<-- p2 text
----------------------------------------------------------------------
FORM PROCESS_KUR_BEFORE_TRANSFER .
LOOP AT GT_DATA .
IF SY-TABIX EQ 1.
REFRESH KUR_DATA. CLEAR KUR_DATA.
CLEAR KUR_VALUE.
*? CONVERT DATE p_kurdat INTO INVERTED-DATE kur_trdate .
CONVERT DATE p_update INTO INVERTED-DATE kur_trdate .
ENDIF.
MOVE 'M' TO KUR_DATA-CURR_KUR_TIPI.
MOVE GT_DATA-CURRENCYCODE TO KUR_DATA-CURR_KAYNAK_PB.
*GG/AA/YYYY olarak girilen Tarih TCURR tablosunda saklanma formatına dönüştürülüyor..
CONVERT DATE p_update INTO INVERTED-DATE kur_data-curr_date .
*String olarak alınan Kur değerinin numeric kur değerine(xx,yyyyy şeklinde) dönüşümü..
PERFORM KUR_VALUE_PROCESS.
MOVE KUR_VALUE TO KUR_DATA-CURR_VALUE.
MOVE GT_DATA-CURRENCYCODE TO KUR_DATA-CURR_KAYNAK_PB.
MOVE 'TRY' TO KUR_DATA-CURR_HEDEF_PB.
APPEND KUR_DATA.
CLEAR: KUR_DATA.
***
ENDLOOP.
ENDFORM. " PROCESS_KUR_BEFORE_TRANSFER
&---------------------------------------------------------------------
*& Form UPDATE_PROCESS
&---------------------------------------------------------------------
* text
----------------------------------------------------------------------
--> p1 text
<-- p2 text
----------------------------------------------------------------------
FORM UPDATE_PROCESS .
REFRESH TABCURR. CLEAR TABCURR.
LOOP AT KUR_DATA.
IF SY-TABIX EQ 1.
REFRESH TABCURR1. CLEAR TABCURR1.
ENDIF.
TABCURR1-MANDT = SY-MANDT.
TABCURR1-KURST = KUR_DATA-CURR_KUR_TIPI .
TABCURR1-FCURR = KUR_DATA-CURR_KAYNAK_PB .
TABCURR1-TCURR = KUR_DATA-CURR_HEDEF_PB .
TABCURR1-GDATU = KUR_DATA-CURR_DATE .
TABCURR1-UKURS = KUR_DATA-CURR_VALUE .
*--
MOVE-CORRESPONDING TABCURR1 TO TAB_CURR_WA . "NEW
APPEND TAB_CURR_WA TO TAB_CURR. "NEW
ENDLOOP.
MODIFY TCURR FROM TABLE TAB_CURR.
KAYIT_YAZILAN = SY-DBCNT .
IF SY-SUBRC EQ 0 .
MESSAGE S615(ZM) WITH 'SAP Kur Bilgileri' KAYIT_YAZILAN .
ENDIF.
ENDFORM. " UPDATE_PROCESS
&---------------------------------------------------------------------
*& Form KUR_VALUE_PROCESS
&---------------------------------------------------------------------
* text
----------------------------------------------------------------------
--> p1 text
<-- p2 text
----------------------------------------------------------------------
FORM KUR_VALUE_PROCESS .
CALL FUNCTION 'HRCM_STRING_TO_AMOUNT_CONVERT'
EXPORTING
STRING = GT_DATA-FOREXBUYING
DECIMAL_SEPARATOR = ','
IMPORTING
BETRG = KUR_VALUE
EXCEPTIONS
CONVERT_ERROR = 1 .
ENDFORM. " KUR_VALUE_PROCESS
&---------------------------------------------------------------------
*& Form PROCESS_USER_COMMAND
&---------------------------------------------------------------------
* text
----------------------------------------------------------------------
--> p1 text
<-- p2 text
----------------------------------------------------------------------
FORM PROCESS_USER_COMMAND .
IF SY-UCOMM EQ 'EXEC' .
PERFORM CONFIRM_TRANSFER.
CHECK ANSWER = 'J' .
*TCMB Kur bilgilerinin SAP Sistemine Transfer İşlemleri...
PERFORM PROCESS_KUR_BEFORE_TRANSFER.
PERFORM UPDATE_PROCESS.
ENDIF.
ENDFORM. " PROCESS_USER_COMMAND
&---------------------------------------------------------------------
*& Form CONFIRM_TRANSFER
&---------------------------------------------------------------------
* text
----------------------------------------------------------------------
--> p1 text
<-- p2 text
----------------------------------------------------------------------
FORM CONFIRM_TRANSFER .
CLEAR ANSWER.
CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
EXPORTING
DEFAULTOPTION = 'N'
TEXTLINE1 = 'MB Döviz Bilgileri SAP a Transfer Edilsin mi?'
TITEL = 'Hatırlatma'
IMPORTING
ANSWER = ANSWER.
ENDFORM. " CONFIRM_TRANSFER