HTTP_GET

Jeśli programujesz, administrujesz, integrujesz i masz wątpliwość lub obawę, to właśnie najlepsze miejsce dla Ciebie. Pisz śmiało...
Lukasz
Posty: 16
Rejestracja: czw maja 31, 2007 5:24 pm
Kontakt:

HTTP_GET

Post autor: Lukasz »

Witam.
Mam problem z funkcją HTTP_GET.
Mianowicie zwraca wartość tabeli RESPONSE_ENTITY_BODY po chińsku czy też japońsku.
Jak to rozwiązać?
Dzięki, Pozdrawiam, Łukasz.
kierownik1
Posty: 117
Rejestracja: śr kwie 04, 2007 2:17 pm
Lokalizacja: Poznań
Been thanked: 1 time
Kontakt:

Post autor: kierownik1 »

Hej Łukasz :)

jak rozumiem ciągniesz dane z strony www
1. W jakiej stronie kodowej jest ustawiona
2. Czy na systemie SAP jest Unicode ?

Pozdrawiam Yarek
Lukasz
Posty: 16
Rejestracja: czw maja 31, 2007 5:24 pm
Kontakt:

Post autor: Lukasz »

Hej.

Też myślałem, że chodzi o unicode, ale przyczyna była prostsza.
nie podałem RFC_DESTINATION = SAPHTTP. :roll:

DZIĘKI, POZDR. ŁUKASZ
sajmon
Posty: 299
Rejestracja: pt lut 01, 2008 8:51 pm
Has thanked: 24 times
Been thanked: 28 times

HTTP_GET

Post autor: sajmon »

a mozecie mi powiedziec jak dzięki temu http_get moge pobierać kurs waluty z estrony nbp? mam raport RFTBFF00 i wywołuje go sobie w SE38 i potem mam kod źródłowy, czy to tam mam coś wpisac?

bardzo prosze o pomoc

Pozdrawiam
yacol
Posty: 561
Rejestracja: śr kwie 04, 2007 4:32 pm
Lokalizacja: Poznań
Has thanked: 9 times
Been thanked: 165 times
Kontakt:

Post autor: yacol »

HTTP_GET to moduł funkcyjny, który programista w języku ABAP może wywołać z poziomu swojego programu korzystając z instrukcji CALL FUNCTION. Taki moduł funkcyjny można też wykonać z poziomu transkacji SE37. Problem w tym, że w Twoim przypadku chcesz używać standardowego raportu RFTBFF00, który wywołania HTTP_GET nie zawiera (czyli inaczej - nie wykorzystuje funkcjonalności pobierania danych z wykorzystaniem protokołu HTTP/RFC). Z tego co widzę, to raport RFTBFF00 opiera się o dane pobierane ze wskazanego pliku. Czyli trzeba napisać programik w ABAPie, który poprzez HTTP_GET pobierze kursy ze strony NBP a następnie przerzuci je do pliku w formacie rozumianym przez raport RFTBFF00. Można też zrobić inaczej - od razu napisać program, który przez HTTP_GET pobierze kursy walut a następnie od razu zapisze te kursy w stosownych tabelach w systemie SAP. Tak czy inaczej - pozostaje napisanie programu.

Pozdrawiam,

Jacek Witczak
Lukasz
Posty: 16
Rejestracja: czw maja 31, 2007 5:24 pm
Kontakt:

zaciąganie kursów NBP

Post autor: Lukasz »

zamieszczam program, który działa. trzeba tylko zrobić tabelkę zplnbp, która przechowuje stare kursy:

MANDT MANDT
TABLE_NO CHAR30
CODE WAERS
PUBLISH_DATE DATS
NAME LTEXT
COUNTER NUMC3
RATE KURSF

w razie szczegółów prosze pytać.
Pozdrawiamy, SLAVIACONSULTING.

*&---------------------------------------------------------------------*
*& Report ZTR_IMP_KURS_WAL
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT ZTR_IMP_KURS_WAL.

TYPE-POOLS: ixml.

tables: ZPLNBP.

CONSTANTS: cc_polish(3) TYPE c VALUE 'PLN'.

TYPES: BEGIN OF xml_line,
data(256) TYPE x,
END OF xml_line.

TYPES: BEGIN OF ls_exchange_rates,
table_no(30) TYPE c,
code(20) TYPE c,
publish_date(10) TYPE c,
name(40) TYPE c,
counter TYPE i,
rate(20) TYPE c,
END OF ls_exchange_rates.

DATA: lt_exchange_rates TYPE TABLE OF ls_exchange_rates
WITH HEADER LINE,
lc_xml_address(256) TYPE c,
lt_response_entity_body TYPE TABLE OF xml_line,
li_response_entity_body_length TYPE i,
gc_sy_subrc LIKE sy-subrc,
gc_error(100) TYPE c,
lc_tag(40) TYPE c,
lc_val(40) TYPE c,

* Data for Exchange Rates Download
lt_xrates TYPE TABLE OF bapi1093_0 WITH HEADER LINE,
lt_return TYPE TABLE OF bapiret2 WITH HEADER LINE,
lt_exchange_rates2 TYPE TABLE OF zplnbp WITH HEADER LINE.


*SELECTION-SCREEN BEGIN OF BLOCK block_1 WITH FRAME TITLE text-012.
*PARAMETERS p_kurst TYPE kurst OBLIGATORY DEFAULT 'YPL1'.
*SELECTION-SCREEN END OF BLOCK block_1.

INITIALIZATION.

AT SELECTION-SCREEN.

START-OF-SELECTION.

* Try to download currencies 5 times
DO 5 TIMES.

CLEAR gc_sy_subrc.

* Get XML File name from NBP site
PERFORM retrieve_xml_file_name
CHANGING
lc_xml_address.

IF gc_sy_subrc IS INITIAL.
* Get XML Content from NBP site
PERFORM retrieve_xml_content
TABLES
lt_response_entity_body
CHANGING
li_response_entity_body_length.
ENDIF.

IF gc_sy_subrc IS INITIAL.
* Process XML with Exchange Rates
PERFORM process_xml_file.
ENDIF.

IF gc_sy_subrc IS INITIAL.
* Process data for SAP
PERFORM process_sap_data.

* Send downloaded currencies to SAP
PERFORM send_to_sap.

* Send confirmation e-mail
*PERFORM send_confirmation_email.

ENDIF.

IF gc_sy_subrc IS INITIAL.
* Exit
EXIT.
ENDIF.

ENDDO.

IF NOT gc_sy_subrc IS INITIAL.
* Failure in updating currencies - EMERGENCY!
*PERFORM send_mail.
ENDIF.

END-OF-SELECTION.

*&--------------------------------------------------------------------*
*& Form process_xml_file
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
FORM process_xml_file.

DATA: pixml TYPE REF TO if_ixml,
pdocument TYPE REF TO if_ixml_document,
pstreamfactory TYPE REF TO if_ixml_stream_factory,
pistream TYPE REF TO if_ixml_istream,
pparser TYPE REF TO if_ixml_parser,
pnode TYPE REF TO if_ixml_node,
ptext TYPE REF TO if_ixml_text,
string TYPE string,
count TYPE i,
index TYPE i,
dsn(40) TYPE c,
xstr TYPE xstring.


*-- create the main factory
pixml = cl_ixml=>create( ).

*-- create the initial document
pdocument = pixml->create_document( ).

*-- create the stream factory
pstreamfactory = pixml->create_stream_factory( ).

*-- create an input stream for the table
pistream = pstreamfactory->create_istream_itable(
table = lt_response_entity_body
size = li_response_entity_body_length ).

*-- create the parser
pparser = pixml->create_parser( stream_factory = pstreamfactory
istream = pistream
document = pdocument ).

*-- parse the stream
IF pparser->parse( ) NE 0.
IF pparser->num_errors( ) NE 0.
count = pparser->num_errors( ).
* WRITE: count, ' parse errors have occured:'. "#EC NOTEXT
gc_sy_subrc = 4.
DATA: pparseerror TYPE REF TO if_ixml_parse_error,
i TYPE i.
index = 0.
WHILE index < count.
pparseerror = pparser->get_error( index = index ).
i = pparseerror->get_line( ).
* WRITE: 'line: ', i. "#EC NOTEXT
i = pparseerror->get_column( ).
* WRITE: 'column: ', i. "#EC NOTEXT
string = pparseerror->get_reason( ).
* WRITE: string.
index = index + 1.
ENDWHILE.
ENDIF.
ENDIF.

*-- we don't need the stream any more, so let's close it...
CALL METHOD pistream->close( ).
CLEAR pistream.

CLEAR: lc_tag,
lc_val.

*Process XML document
pnode = pdocument.
PERFORM print_node USING pnode lc_tag lc_val.

ENDFORM. "process_xml_file


*---------------------------------------------------------------------*
* FORM print_node *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM print_node USING value(pnode) TYPE REF TO if_ixml_node
lc_tag
lc_val.
DATA: indent TYPE i.
DATA: ptext TYPE REF TO if_ixml_text.
DATA: string TYPE string.

indent = pnode->get_height( ) * 2.

CASE pnode->get_type( ).
WHEN if_ixml_node=>co_node_element.
string = pnode->get_name( ).
lc_tag = string.
* WRITE: AT /indent '<', string, '> '. "#EC NOTEXT
WHEN if_ixml_node=>co_node_text.
ptext ?= pnode->query_interface( ixml_iid_text ).
IF ptext->ws_only( ) IS INITIAL.
string = pnode->get_value( ).
lc_val = string.

* Retrieve content of current node we are interested in
IF lc_tag EQ 'numer_tabeli'.
lt_exchange_rates-table_no = lc_val.
ENDIF.

IF lc_tag EQ 'data_publikacji'.
lt_exchange_rates-publish_date = lc_val.
ENDIF.

IF lc_tag EQ 'nazwa_waluty'.
lt_exchange_rates-name = lc_val.
ENDIF.

IF lc_tag EQ 'przelicznik'.
lt_exchange_rates-counter = lc_val.
ENDIF.

IF lc_tag EQ 'kod_waluty'.
lt_exchange_rates-code = lc_val.
ENDIF.

IF lc_tag EQ 'kurs_sredni'.
lt_exchange_rates-rate = lc_val.
APPEND lt_exchange_rates.
ENDIF.


* WRITE: AT /indent string.
ENDIF.
ENDCASE.

pnode = pnode->get_first_child( ).
WHILE NOT pnode IS INITIAL.

PERFORM print_node USING pnode lc_tag lc_val.
pnode = pnode->get_next( ).

ENDWHILE.

ENDFORM. "print_node


*&--------------------------------------------------------------------*
*& Form retrieve_xml_file_name
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
* -->CC_XML_ADDRtext
*---------------------------------------------------------------------*
FORM retrieve_xml_file_name
CHANGING cc_xml_address.

* Retrieve XML File name from NBP site

DATA: lc_status_code(10) TYPE c,
lc_status_text(10) TYPE c,
li_response_entity_body_length TYPE i,
lt_response_entity_body(60000) TYPE c OCCURS 0 WITH HEADER LINE,
lt_response_headers(256) TYPE c OCCURS 0 WITH HEADER LINE.

DATA: li_position TYPE i.


CALL FUNCTION 'HTTP_GET'
EXPORTING
* absolute_uri = 'http://www.nbp.pl/Kursy/KursyA.html'
absolute_uri = 'http://195.136.199.105/Kursy/KursyA.html'
proxy = ''
BLANKSTOCRLF = 'Y'
IMPORTING
status_code = lc_status_code
status_text = lc_status_text
response_entity_body_length = li_response_entity_body_length
TABLES
response_entity_body = lt_response_entity_body
response_headers = lt_response_headers
EXCEPTIONS
connect_failed = 1
timeout = 2
internal_error = 3
tcpip_error = 4
data_error = 5
system_failure = 6
communication_failure = 7
OTHERS = 8.

gc_sy_subrc = sy-subrc.

CASE gc_sy_subrc.
WHEN 1.
gc_error = 'connect_failed'.
WHEN 2.
gc_error = 'timeout'.
WHEN 3.
gc_error = 'internal_error'.
WHEN 4.
gc_error = 'tcpip_error'.
WHEN 5.
gc_error = 'data_error'.
WHEN 6.
gc_error = 'system_failure'.
WHEN 7.
gc_error = 'communication_failure'.
WHEN 8.
gc_error = 'others'.
ENDCASE.

IF gc_sy_subrc IS INITIAL.

READ TABLE lt_response_entity_body INDEX 1.
SEARCH lt_response_entity_body FOR 'tabela w formacie .XML'.
************************************************************************
* pp begin of insertion 14.11.2007 *
* *
************************************************************************
READ TABLE lt_response_entity_body INDEX sy-tabix.
************************************************************************
* pp end of insertion 14.11.2007 *
* *
************************************************************************
li_position = sy-fdpos - 26.

IF li_position GT 2.
CONCATENATE 'http://195.136.199.105/Kursy/xml/'
lt_response_entity_body+li_position(15) INTO cc_xml_address.
ELSE.
gc_sy_subrc = 4.
gc_error = 'Connect error'.
ENDIF.

ENDIF.

ENDFORM. "retrieve_xml_file_name


*&--------------------------------------------------------------------*
*& Form retrieve_xml_content
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
FORM retrieve_xml_content
TABLES
tt_response_entity_body
CHANGING
ci_response_entity_body_length.


DATA: lc_status_code(10) TYPE c,
lc_status_text(10) TYPE c,
lt_response_entity_body(60000) TYPE c OCCURS 0 WITH HEADER LINE,
lt_response_headers(256) TYPE c OCCURS 0 WITH HEADER LINE.



CALL FUNCTION 'HTTP_GET'
EXPORTING
absolute_uri = lc_xml_address
proxy = ''
BLANKSTOCRLF = 'Y'
IMPORTING
status_code = lc_status_code
status_text = lc_status_text
response_entity_body_length = ci_response_entity_body_length
TABLES
response_entity_body = tt_response_entity_body
response_headers = lt_response_headers
EXCEPTIONS
connect_failed = 1
timeout = 2
internal_error = 3
tcpip_error = 4
data_error = 5
system_failure = 6
communication_failure = 7
OTHERS = 8.

gc_sy_subrc = sy-subrc.

CASE gc_sy_subrc.
WHEN 1.
gc_error = 'connect_failed'.
WHEN 2.
gc_error = 'timeout'.
WHEN 3.
gc_error = 'internal_error'.
WHEN 4.
gc_error = 'tcpip_error'.
WHEN 5.
gc_error = 'data_error'.
WHEN 6.
gc_error = 'system_failure'.
WHEN 7.
gc_error = 'communication_failure'.
WHEN 8.
gc_error = 'others'.
ENDCASE.


ENDFORM. "retrieve_xml_content


*&--------------------------------------------------------------------*
*& Form send_to_sap
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
FORM send_to_sap.
data f_subrc like sy-subrc value 0.
* delete lt_xrates where FROM_CURR EQ 'RON'.
delete lt_xrates where FROM_CURR EQ 'XDR'.

CALL FUNCTION 'BAPI_EXCHANGERATE_SAVEREPLICA'
EXPORTING
log_system = 'EXT_XXX'
*Dummy - must not be same as own logical system
upd_allow = 'X'
chg_fixed = 'X'
TABLES
exchrate_list = lt_xrates
return = lt_return.

read table lt_return with key type = 'A'.
if sy-subrc NE 0.
read table lt_return with key type = 'E'.
f_subrc = sy-subrc.
endif.

if f_subrc NE 0.
write: 'Log procesu ładowania tabeli z kursami walut:'.
uline.
skip.

loop at lt_return where type EQ 'I'.
condense lt_return-message.
write: / lt_return-message
.
endloop.

skip 5.
uline.
write: / 'Jeżeli liczba rekordów do aktualizacji jest równa 0 to jest to spowodowane brakiem połączenia ze strona NBP',
/ 'lub zmienionym formatem danych z NBP'.


COMMIT WORK.
else.
write: 'Wystąpiły błędy w BAPI. Poniżej log błędów:'.
uline.
skip.

loop at lt_return where type EQ 'A' or type EQ 'E'.
condense lt_return-message.
write: / lt_return-message
.
endloop.
endif.

ENDFORM. "send_to_sap

*&--------------------------------------------------------------------*
*& Form send_mail
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
FORM send_mail.



ENDFORM. "send_mail

*&--------------------------------------------------------------------*
*& Form send_confirmation_email
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
FORM send_confirmation_email.




ENDFORM. "send_confirmation_email

*&--------------------------------------------------------------------*
*& Form process_sap_data
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
FORM process_sap_data.

clear lt_exchange_rates2.
refresh lt_exchange_rates2.



LOOP AT lt_exchange_rates.

* We do not want to use 'XDR' currency

REPLACE ',' WITH '.' INTO lt_exchange_rates-rate.
REPLACE '-' WITH ' ' INTO lt_exchange_rates-PUBLISH_DATE.
REPLACE '-' WITH ' ' INTO lt_exchange_rates-PUBLISH_DATE.
condense lt_exchange_rates-PUBLISH_DATE no-gaps.
lt_xrates-from_curr = lt_exchange_rates-code.
lt_xrates-to_currncy = cc_polish.
* lt_xrates-rate_type = p_kurst.
lt_xrates-valid_from = sy-datum.
lt_xrates-exch_rate = lt_exchange_rates-rate.
lt_xrates-from_factor = lt_exchange_rates-counter.
lt_xrates-to_factor = '1'.
*PP insertion
lt_xrates-RATE_TYPE = 'M'.

APPEND lt_xrates.
** napelnianie tabeli z danymi historycznymi kursow NBP

move-corresponding lt_exchange_rates to lt_exchange_rates2.
lt_exchange_rates2-mandt = sy-mandt.
append lt_exchange_rates2.

ENDLOOP.
select * from zplnbp. endselect.
if sy-subrc = 0.
select * from zplnbp where TABLE_NO = lt_exchange_rates2-TABLE_NO.
if not sy-subrc = 0.
insert zplnbp from table lt_exchange_rates2.
endif.
endselect.
else.
insert zplnbp from table lt_exchange_rates2.
endif.


ENDFORM. "process_sap_data
wojtas7
Posty: 1058
Rejestracja: pt mar 14, 2008 12:51 pm
Has thanked: 71 times
Been thanked: 313 times

Post autor: wojtas7 »

Witam

tak sie sklada ze to moj kod :-) Skad go masz?

Pozdr
Lukasz
Posty: 16
Rejestracja: czw maja 31, 2007 5:24 pm
Kontakt:

nbp

Post autor: Lukasz »

Dostałem ten kod od Lecha :) . zgadza się , to Twój kod po pewnych przeróbkach.

pozdrawiam , LUKI.
wojtas7
Posty: 1058
Rejestracja: pt mar 14, 2008 12:51 pm
Has thanked: 71 times
Been thanked: 313 times

Post autor: wojtas7 »

pozdrawiam ;-)
bogmic
Posty: 1
Rejestracja: pt lip 25, 2008 1:36 pm
Lokalizacja: Warszawa
Kontakt:

Prosba o definicje ZPLNBP

Post autor: bogmic »

Witam,

mam prosbe, czy moglyby ktos opisac strukture tabeli ZPLNBP.

Z gory dziekuje.

Pozdrawiam
Michal
Lukasz
Posty: 16
Rejestracja: czw maja 31, 2007 5:24 pm
Kontakt:

Post autor: Lukasz »

MANDT MANDT
TABLE_NO CHAR30
CODE WAERS
PUBLISH_DATE DATS
NAME LTEXT
COUNTER NUMC3
RATE KURSF
Marcin Kwiatkowski
Posty: 9
Rejestracja: sob lut 27, 2010 6:12 pm
Lokalizacja: Brzeg Dolny / Wrocław

Post autor: Marcin Kwiatkowski »

Witam,

Na wstępie przepraszam, że odgrzewam stary temat, ale potrzebny jest mi ten program. Przy wykonywaniu nie wyskakuje żaden błąd, natomiast tabela pozostaje pusta, tzn. nic się nie zapisuje do tabeli.

Przy wpisaniu jakiegoś bzdurnego adresu np wp.pl, też nie wyrzuca błędu czyli w ogóle nie łączy się z żadnym serwerem.

Pozdrawiam,
MK
dominik.tylczynski
Posty: 8326
Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1915 times
Been thanked: 1474 times
Kontakt:

Post autor: dominik.tylczynski »

Marcin Kwiatkowski pisze:Przy wpisaniu jakiegoś bzdurnego adresu np wp.pl, też nie wyrzuca błędu czyli w ogóle nie łączy się z żadnym serwerem.
Przetestuj najpierw w transakcji SE37 funkcję HTTP_GET. Najpewniej twój SAP nie jest otwarty na połączenia HTTP.
Marcin Kwiatkowski
Posty: 9
Rejestracja: sob lut 27, 2010 6:12 pm
Lokalizacja: Brzeg Dolny / Wrocław

Post autor: Marcin Kwiatkowski »

Przy adresie 195.136.199.105 program chwilę"myśli" a w se37 wyskakuje brak połączenia i oczywiście brak wpisów.

Kiedy sprawdziłem cmd>ping nbp.pl wyskoczył adres 195.149.95.21.

Po sprawdzeniu HTTP_GET pod 37 z tym adresem (195.149.95.21) błędy połączenia nie było, więc zastosowałem ten adres w programie. Tym razem wyskoczył log stworzony w programie z informacją:

"Log procesu ładowania tabeli z kursami walut:

Nie znaleziono wpisu w tabeli dla kursu do utworzenia

Jeżeli liczba rekordów do aktualizacji jest równa 0 (a taka właśnie jest) to jest to spowodowane brakiem połączenia ze stroną NBP lub zmienionym formatem danych z NBP"

Wydaje mi się, że raczej to 2 (patrz początek postu) więc jeżeli ktoś mógłby podać prawidłowa konfigurację tego raportu lub przynajmniej uświadomić mnie jak wcześniej format danych z NBP...

Edit:
Czy potrzebne są dane początkowe w tabeli (jakieś archiwalne) do prawidłowego funkcjonowania tego raportu?
dominik.tylczynski
Posty: 8326
Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1915 times
Been thanked: 1474 times
Kontakt:

Post autor: dominik.tylczynski »

Adres 195.149.95.21 prowadzi do głównej strony NBP. Na niej jest link do tabeli kursów średnich: http://195.149.95.21/home.aspx?f=/kursy/kursya.html Tę samą tabelę znajdziesz na stronie: http://www.nbp.pl/kursy/kursya.html U dołu tabeli masz link do kursów w formie XML: http://www.nbp.pl/kursy/xml/a111z100610.xml Problem z NBP polega na tym, że adres do strony z XML się zmienia. Zatem przez HTTP_GET musisz pobrać dane poprzednich URL, przeanalizować je, znaleźć aktualny adres do strony z XML i ściągnąć ją ponownie przez HTTP_GET.
Nie wiem jaką masz wersję systemu, jeśli w miarę nową to do wyszukania adresu do strony z XML możesz skorzystać z wyrażeń regularnych.
Kiedy już ściągniesz kursy w XML to najprościej jest przepisać je do struktury ABAP przy pomocy prostej transformaty XSLT.
ODPOWIEDZ