以前做的二维码要么是在SMARTFORM里面打印,要SE73设置条码格式;要么是调用第三方生成二维码字符串(比如微信收款二维码),今天接到需求是在SAP屏幕上显示二维码供通银联POS机扫码收款。
通过http+js实现
主要代码是:
显示二维码的屏幕:
CALL SCREEN 9001 STARTING AT 20 5 ENDING AT 50 15.
在屏幕PBO:
PERFORM frm_genearte_html.
PERFORM frm_html_container.
*&---------------------------------------------------------------------*
*& Form FRM_GENEARTE_HTML
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_genearte_html .
CLEAR:e_data.
FREE ts_data.
gv_qrcode = '{\"BUSINESS_ID\":\"100100003\",\"AMOUNT\": \"000000000001\",\"ORDER_NO\": \"23456783456\"}'.
"CONCATENATE '<html><head> Dear:' sy-uname INTO e_data-dataset SEPARATED BY space.
* e_data-dataset = '<html><head>'.
* APPEND e_data TO ts_data.
*
* e_data-dataset = '</head><body><meta http-equiv="Content-Type" content="text/html; charset=gb2312" />'.
e_data-dataset = '<html><body><meta http-equiv="Content-Type" content="text/html; charset=gb2312" />'.
APPEND e_data TO ts_data.
e_data-dataset = '<style type="text/css">'.
APPEND e_data TO ts_data.
e_data-dataset = '.div-c{ width:200px; margin:0px;line-hight:10px;}'.
APPEND e_data TO ts_data.
e_data-dataset = '.div-a{ float:left; width:50px; border:1px solid #999; height:60px;margin:20px;line-hight:10px;}'.
APPEND e_data TO ts_data.
e_data-dataset = '.div-b{ float:right; width:120px; border:1px solid #999; height:60px;margin:20px;line-hight:10px;}'.
APPEND e_data TO ts_data.
e_data-dataset = '</style>'.
APPEND e_data TO ts_data.
"e_data-dataset = '<br><span style="font-size:500px">字体</span></br>'. append e_data to ts_data.
e_data-dataset = '<br><h3>收款金额:' && gv_amount && '元'.
APPEND e_data TO ts_data.
e_data-dataset = '<script type="text/javascript" src="http://static.hdslb.com/js/jquery.min.js""></script>'.
APPEND e_data TO ts_data.
e_data-dataset = '<script type="text/javascript" src="http://static.hdslb.com/js/jquery.qrcode.min.js"></script>'.
APPEND e_data TO ts_data.
e_data-dataset = '<div id="code"></div>'.
APPEND e_data TO ts_data.
"unicode中文 由UTF-16转换为UTF-8
e_data-dataset = '<script type="text/javascript">'.
APPEND e_data TO ts_data.
e_data-dataset = 'function utf16to8(str) {'.
APPEND e_data TO ts_data.
e_data-dataset = 'var out, i, len, c;'.
APPEND e_data TO ts_data.
e_data-dataset = 'out = "";'.
APPEND e_data TO ts_data.
e_data-dataset = 'len = str.length;'.
APPEND e_data TO ts_data.
e_data-dataset = 'for(i = 0; i < len; i++) {'.
APPEND e_data TO ts_data.
e_data-dataset = 'c = str.charCodeAt(i);'.
APPEND e_data TO ts_data.
e_data-dataset = 'if ((c >= 0x0001) && (c <= 0x007F)) {'.
APPEND e_data TO ts_data.
e_data-dataset = 'out += str.charAt(i);'.
APPEND e_data TO ts_data.
e_data-dataset = '} else if (c > 0x07FF) {'.
APPEND e_data TO ts_data.
e_data-dataset = 'out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));'.
APPEND e_data TO ts_data.
e_data-dataset = 'out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F));'.
APPEND e_data TO ts_data.
e_data-dataset = 'out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));'.
APPEND e_data TO ts_data.
e_data-dataset = '} else {'.
APPEND e_data TO ts_data.
e_data-dataset = 'out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F));'.
APPEND e_data TO ts_data.
e_data-dataset = 'out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));'.
APPEND e_data TO ts_data.
e_data-dataset = '}'.
APPEND e_data TO ts_data.
e_data-dataset = '}'.
APPEND e_data TO ts_data.
e_data-dataset = 'return out;'.
APPEND e_data TO ts_data.
e_data-dataset = '}'.
APPEND e_data TO ts_data.
e_data-dataset = '</script>'.
APPEND e_data TO ts_data.
e_data-dataset = '<script>$("#code").qrcode({ '.
APPEND e_data TO ts_data.
e_data-dataset = ' render: "table", '.
APPEND e_data TO ts_data.
e_data-dataset = ' width: 150, '.
APPEND e_data TO ts_data.
e_data-dataset = ' height:150, '.
APPEND e_data TO ts_data.
CONCATENATE ' text: utf16to8("' gv_qrcode '") ' INTO e_data-dataset.
APPEND e_data TO ts_data.
e_data-dataset = '}); </script>'.
APPEND e_data TO ts_data.
e_data-dataset = '</h3><br>'.
APPEND e_data TO ts_data.
e_data-dataset = '</body></html>'.
APPEND e_data TO ts_data.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_HTML_CONTAINER
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_html_container .
IF NOT ref_html IS INITIAL.
CLEAR:w_url.
ENDIF.
IF ref_cont IS INITIAL.
CREATE OBJECT ref_cont
EXPORTING
container_name = 'HTMLCONT'
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5
OTHERS = 6.
IF sy-subrc <> 0.
ENDIF.
ENDIF.
IF ref_html IS INITIAL.
ui_flag = cl_gui_html_viewer=>uiflag_no3dborder.
CREATE OBJECT ref_html
EXPORTING
parent = ref_cont
saphtmlp = 'X'
uiflag = ui_flag
lifetime = cl_gui_html_viewer=>lifetime_dynpro
EXCEPTIONS
cntl_error = 1
cntl_install_error = 2
dp_install_error = 3
dp_error = 4
OTHERS = 5.
IF sy-subrc <> 0.
ENDIF.
myevent-eventid = ref_html->m_id_sapevent.
myevent-appl_event = 'X'.
APPEND myevent TO myevent_tab.
CALL METHOD ref_html->set_registered_events
EXPORTING
events = myevent_tab.
"CREATE OBJECT evt_receiver.
"SET HANDLER evt_receiver->on_sapevent FOR ref_html.
ENDIF.
CALL METHOD ref_html->load_data
EXPORTING
type = 'text'
subtype = 'html'
IMPORTING
assigned_url = w_url
CHANGING
data_table = ts_data
EXCEPTIONS
dp_invalid_parameter = 1
dp_error_general = 2
cntl_error = 3
OTHERS = 4.
IF sy-subrc <> 0.
ENDIF.
CALL METHOD ref_html->show_url
EXPORTING
url = w_url
EXCEPTIONS
cntl_error = 1
cnht_error_not_allowed = 2
cnht_error_parameter = 3
dp_error_general = 4
OTHERS = 5.
IF sy-subrc <> 0.
ENDIF.
ENDFORM.