Create QR Code with ABAP and Smartform

To create a QR code with ABAP and print in a smartforms its very ease, only need to do follow steps:
To do this wi will create 3 methods:
download_qrcode( ). convert_image( ). save_image( ).
Method download QR code:
This method consume a REST API to create QR code, the API recive the string to convert to a QR code image, The API that we use will be google API Rest:
https://chart.apis.google.com/chart?cht=qr&chs=140x140&chl=HELLO
Please note that the parameters are dimension (chs) and the string to convert (chl) as you can see I will get an image with a QR code with 140x140 pixels, and the string that I will convert will be "HELLO".
To see result please click here
Consuming Rest API google
Mehod Downlod_qrcode:
METHOD download_qrcode.
DATA : http_client TYPE REF TO if_http_client.
DATA: content TYPE xstring.
DATA : mime TYPE w3mimetabtype.
DATA : l_str_length TYPE i.
DATA: url TYPE string.
url = 'http://chart.apis.google.com/chart?cht=qr&chs=140x140&chl=HOLA'.
* url = 'http://chart.googleapis.com/chart?chs=150x150&cht=qr&chl=https://verificacfdi.facturaelectronica.sat.gob.mx/default.aspx?id=6ebd1eca-871f-4df0-b475-b8016a98c5df&re=LMC741212JN6&rr=IMS421231I45&tt=15428.00&fe=suFGzg=='.
CALL METHOD cl_http_client=>create_by_url
EXPORTING
url = url
IMPORTING
client = http_client
EXCEPTIONS
argument_not_found = 1
plugin_not_active = 2
internal_error = 3
OTHERS = 4.
IF sy-subrc = 0.
http_client->send( ).
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 the response content in Character format
* content = client->response->get_cdata( ).
ENDIF.
content = http_client->response->get_data( ).
http_client->close( ).
l_str_length = xstrlen( content ).
CALL FUNCTION 'RSFO_XSTRING_TO_MIME'
EXPORTING
c_xstring = content
i_length = l_str_length
TABLES
c_t_mime = mime.
ENDIF.
ENDMETHOD.
Convert image obtained to SAP image
METHOD convert_image.
CREATE OBJECT i_igs_image_converter .
i_igs_image_converter->input = 'image/png'.
i_igs_image_converter->output = 'image/bmp'.
i_igs_image_converter->width = '140'. "width.
i_igs_image_converter->height = '140'. "height.
CALL METHOD i_igs_image_converter->set_image
EXPORTING
blob = mime
blob_size = l_content_length.
CALL METHOD i_igs_image_converter->execute
EXCEPTIONS
communication_error = 1
internal_error = 2
external_error = 3
OTHERS = 4.
IF sy-subrc = 0.
CALL METHOD i_igs_image_converter->get_image
IMPORTING
blob = blob
blob_size = blob_size
blob_type = blob_type.
ENDIF.
IF sy-subrc = 0.
* PERFORM show_smart_form. "calling the smartform for qrcode display
ENDIF.
ENDMETHOD.
Here we save image with name: ZQRCODE10
METHOD save_image. gi_name = 'ZQRCODE10'. "name of the qrcode will be in se78 after one time running this program gi_object = 'GRAPHICS'. gi_id = 'BMAP'. gi_btype = 'BCOL'. "if u want black and white pass bmon gi_resident = ''. gi_autoheight = 'X'. gi_bmcomp = 'X'. l_extension = 'BMP'. import_bitmap_bds( ). ENDMETHOD.
METHOD import_bitmap_bds.
DATA: l_object_key TYPE sbdst_object_key.
DATA: l_tab TYPE ddobjname.
*DATA: BEGIN OF l_bitmap OCCURS 0,
* l(64) TYPE x,
* END OF l_bitmap.
DATA: l_filename TYPE string,
l_bytecount TYPE i,
l_bds_bytecount TYPE i.
DATA: l_color(1) TYPE c,
l_width_tw TYPE stxbitmaps-widthtw,
l_height_tw TYPE stxbitmaps-heighttw,
l_width_pix TYPE stxbitmaps-widthpix,
l_height_pix TYPE stxbitmaps-heightpix.
DATA: l_bds_object TYPE REF TO cl_bds_document_set,
l_bds_content TYPE sbdst_content,
l_bds_components TYPE sbdst_components,
wa_bds_components TYPE LINE OF sbdst_components,
l_bds_signature TYPE sbdst_signature,
wa_bds_signature TYPE LINE OF sbdst_signature,
l_bds_properties TYPE sbdst_properties,
wa_bds_properties TYPE LINE OF sbdst_properties.
DATA wa_stxbitmaps TYPE stxbitmaps.
* Enqueue
enqueue_graphic( ).
* Bitmap conversion
DATA: oref TYPE REF TO cx_root.
CALL FUNCTION 'SAPSCRIPT_CONVERT_BITMAP_BDS'
EXPORTING
color = 'X'
format = l_extension
resident = gi_resident
bitmap_bytecount = l_bytecount
compress_bitmap = gi_bmcomp
IMPORTING
width_tw = l_width_tw
height_tw = l_height_tw
width_pix = l_width_pix
height_pix = l_height_pix
dpi = gi_resolution
bds_bytecount = l_bds_bytecount
TABLES
bitmap_file = blob
bitmap_file_bds = l_bds_content
EXCEPTIONS
format_not_supported = 1
no_bmp_file = 2
bmperr_invalid_format = 3
bmperr_no_colortable = 4
bmperr_unsup_compression = 5
bmperr_corrupt_rle_data = 6
OTHERS = 7.
IF sy-subrc <> 0.
dequeue_graphic( ).
* MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
* WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
* RAISING conversion_failed.
ENDIF.
* Save bitmap in BDS
CREATE OBJECT l_bds_object.
wa_bds_components-doc_count = '1'.
wa_bds_components-comp_count = '1'.
wa_bds_components-mimetype = c_bds_mimetype.
wa_bds_components-comp_size = l_bds_bytecount.
APPEND wa_bds_components TO l_bds_components.
IF l_docid IS INITIAL.
" graphic is new
wa_bds_signature-doc_count = '1'.
APPEND wa_bds_signature TO l_bds_signature.
CALL METHOD l_bds_object->create_with_table
EXPORTING
classname = c_bds_classname
classtype = c_bds_classtype
components = l_bds_components
content = l_bds_content
CHANGING
signature = l_bds_signature
object_key = l_object_key
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
dequeue_graphic( ).
* message e285 with p_name ‘BDS’.
ENDIF.
READ TABLE l_bds_signature INDEX 1 INTO wa_bds_signature
TRANSPORTING doc_id.
IF sy-subrc = 0.
l_docid = wa_bds_signature-doc_id.
ELSE.
dequeue_graphic( ).
* message e285 with p_name ‘BDS’.
ENDIF.
ELSE. " graphic already exists
********* read object_key for faster access *****
CLEAR l_object_key.
SELECT SINGLE * FROM stxbitmaps INTO wa_stxbitmaps
WHERE tdobject = gi_object
AND tdid = gi_id
AND tdname = gi_name
AND tdbtype = gi_btype.
SELECT SINGLE tabname FROM bds_locl INTO l_tab
WHERE classname = c_bds_classname
AND classtype = c_bds_classtype.
IF sy-subrc = 0.
SELECT SINGLE object_key FROM (l_tab) INTO l_object_key
WHERE loio_id = wa_stxbitmaps-docid+10(32)
AND classname = c_bds_classname
AND classtype = c_bds_classtype.
ENDIF.
******** read object_key end ********************
CALL METHOD l_bds_object->update_with_table
EXPORTING
classname = c_bds_classname
classtype = c_bds_classtype
object_key = l_object_key
doc_id = l_docid
doc_ver_no = '1'
doc_var_id = '1'
CHANGING
components = l_bds_components
content = l_bds_content
EXCEPTIONS
nothing_found = 1
OTHERS = 2.
IF sy-subrc = 1.
" inconsistency stxbitmaps – bds; repeat check in
wa_bds_signature-doc_count = '1'.
APPEND wa_bds_signature TO l_bds_signature.
CALL METHOD l_bds_object->create_with_table
EXPORTING
classname = c_bds_classname
classtype = c_bds_classtype
components = l_bds_components
content = l_bds_content
CHANGING
signature = l_bds_signature
object_key = l_object_key
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
dequeue_graphic( ).
* message e285 with p_name ‘BDS’.
ENDIF.
READ TABLE l_bds_signature INDEX 1 INTO wa_bds_signature
TRANSPORTING doc_id.
IF sy-subrc = 0.
l_docid = wa_bds_signature-doc_id.
ELSE.
dequeue_graphic( ).
* message e285 with p_name ‘BDS’.
ENDIF.
ELSEIF sy-subrc = 2.
dequeue_graphic( ).
* message e285 with p_name ‘BDS’.
ENDIF.
ENDIF.
* Save bitmap header in STXBITPMAPS
wa_stxbitmaps-tdname = gi_name.
wa_stxbitmaps-tdobject = gi_object.
wa_stxbitmaps-tdid = gi_id.
wa_stxbitmaps-tdbtype = gi_btype.
wa_stxbitmaps-docid = l_docid.
wa_stxbitmaps-widthpix = l_width_pix.
wa_stxbitmaps-heightpix = l_height_pix.
wa_stxbitmaps-widthtw = l_width_tw.
wa_stxbitmaps-heighttw = l_height_tw.
wa_stxbitmaps-resolution = gi_resolution.
wa_stxbitmaps-resident = gi_resident.
wa_stxbitmaps-autoheight = gi_autoheight.
wa_stxbitmaps-bmcomp = gi_bmcomp.
INSERT INTO stxbitmaps VALUES wa_stxbitmaps.
IF sy-subrc <> 0.
UPDATE stxbitmaps FROM wa_stxbitmaps.
IF sy-subrc <> 0.
* message e285 with p_name ‘STXBITMAPS’.
ENDIF.
ENDIF.
* Set description in BDS attributes
wa_bds_properties-prop_name = 'DESCRIPTION'.
wa_bds_properties-prop_value = ''.
APPEND wa_bds_properties TO l_bds_properties.
CALL METHOD l_bds_object->change_properties
EXPORTING
classname = c_bds_classname
classtype = c_bds_classtype
object_key = l_object_key
doc_id = l_docid
doc_ver_no = '1'
doc_var_id = '1'
CHANGING
properties = l_bds_properties
EXCEPTIONS
OTHERS = 1.
dequeue_graphic( ).
ENDMETHOD.
METHOD dequeue_graphic.
CALL FUNCTION 'DEQUEUE_ESSGRABDS'
EXPORTING
tdobject = gi_object
tdname = gi_name
tdid = gi_id
tdbtype = gi_btype.
ENDMETHOD.
Finally we pass image like parameter to our smartform:
r_options-tddest = 'LOCL'. "Spool: Output device
* r_options-tdimmed = 'X'. "Print Immediately
r_options-tddelete = space. "Delete After Printing
r_options-tdnewid = 'X'. "New Spool Request
r_control-device = 'PRINTER'.
r_control-no_dialog = 'X'.
r_control-getotf = 'X'.
r_control-langu = sy-langu.
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
formname = 'ZSDSF_FACTURA_CLIENTE'
IMPORTING
fm_name = w_function
EXCEPTIONS
no_form = 1
no_function_module = 2
OTHERS = 3.
IF sy-subrc EQ 0.
CALL FUNCTION w_function
EXPORTING
control_parameters = r_control
output_options = r_options
user_settings = ' '
p_data = o_output
p_footer = wa_footer
p_qr = 'ZQRCODE10'
IMPORTING
job_output_info = w_return
EXCEPTIONS
formatting_error = 1
internal_error = 2
send_error = 3
user_canceled = 4
OTHERS = 5.
i_otf[] = w_return-otfdata[].
ENDIF.
Complet code:
METHOD build_smartform.
DATA: w_function TYPE rs38l_fnam,
r_options TYPE ssfcompop,
r_control TYPE ssfctrlop. "Print control
download_qrcode( ).
convert_image( ).
save_image( ).
r_options-tddest = 'LOCL'. "Spool: Output device
* r_options-tdimmed = 'X'. "Print Immediately
r_options-tddelete = space. "Delete After Printing
r_options-tdnewid = 'X'. "New Spool Request
r_control-device = 'PRINTER'.
r_control-no_dialog = 'X'.
r_control-getotf = 'X'.
r_control-langu = sy-langu.
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
formname = 'ZSDSF_FACTURA_CLIENTE'
IMPORTING
fm_name = w_function
EXCEPTIONS
no_form = 1
no_function_module = 2
OTHERS = 3.
IF sy-subrc EQ 0.
CALL FUNCTION w_function
EXPORTING
control_parameters = r_control
output_options = r_options
user_settings = ' '
p_data = o_output
p_footer = wa_footer
p_qr = 'ZQRCODE10'
IMPORTING
job_output_info = w_return
EXCEPTIONS
formatting_error = 1
internal_error = 2
send_error = 3
user_canceled = 4
OTHERS = 5.
i_otf[] = w_return-otfdata[].
ENDIF.
ENDMETHOD.
FM to add days to current date

Leave a Reply