众所周知,Smartforms打印QR二维码的大小跟打印内容和Module Size有关,在Module Size固定的前提下,二维码包含的内容越多,二维码尺寸就越大,有时候为了排版美观,想让Smartforms打印的二维码不论内容多少二维码一样大小,应该怎么做呢?
二维码在扫描的时候会忽略前面所有的空格,根据这个特性,我们可以在打印内容前面补充空格,达到有效字符不变而二维码尺寸变大的效果。
又因为Smartforms传递变量的最大长度为255,所以如果打印内容如果超过255,则需要多个变量来传值,使用SO10创建的文本把多个变量合并到一起。SAP内核使用的QR二维码生成器有个BUG,在长度超过1000左右字符的时候,性能会极度变差,基本就打印不出来了,所以打印内容最好是限制在1000以内,这样使用4个变量就可以传递1000长度了。
具体做法如下:
首先SE73定义二维码,Mode设置为U,其他两个可以默认或者根据实际情况更改。
定义Style,利用Left Margin和Space Before来精确定义二维码位置,这个值可能需要多次调试才能做到位置合适。
事务码SO10定义文本
Smartforms定义如下
FORM split_qrstr USING VALUE(pv_qrstr) pv_qrlen
CHANGING qr01 qr02 qr03 qr04.
DATA: lv_xlen TYPE i,
lv_xstr TYPE xstring.
CHECK pv_qrstr NE ''.
CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
EXPORTING
text = pv_qrstr
encoding = '4110'
IMPORTING
buffer = lv_xstr
EXCEPTIONS
failed = 1
OTHERS = 2.
lv_xlen = xstrlen( lv_xstr ).
DO pv_qrlen - lv_xlen TIMES.
pv_qrstr = ` ` && pv_qrstr.
ENDDO.
qr01 = pv_qrstr.
IF qr01 = ''.
qr01+247 = '\BIN:20\'.
SHIFT pv_qrstr BY 248 PLACES.
ELSE.
SHIFT pv_qrstr BY 255 PLACES.
ENDIF.
IF pv_qrstr IS NOT INITIAL.
qr02 = pv_qrstr.
IF qr02 = ''.
qr02+247 = '\BIN:20\'.
SHIFT pv_qrstr BY 248 PLACES.
ELSE.
SHIFT pv_qrstr BY 255 PLACES.
ENDIF.
ENDIF.
IF pv_qrstr IS NOT INITIAL.
qr03 = pv_qrstr.
IF qr03 = ''.
qr03+247 = '\BIN:20\'.
SHIFT pv_qrstr BY 248 PLACES.
ELSE.
SHIFT pv_qrstr BY 255 PLACES.
ENDIF.
ENDIF.
IF pv_qrstr IS NOT INITIAL.
qr04 = pv_qrstr.
IF qr04 = ''.
qr04+247 = '\BIN:20\'.
ENDIF.
ENDIF.
ENDFORM.
打印测试程序:
PARAMETERS p_str TYPE string.
PARAMETERS p_len TYPE i.
AT SELECTION-SCREEN OUTPUT.
%_p_str_%_app_%-text = '打印内容'.
%_p_len_%_app_%-text = '最小长度'.
CALL FUNCTION '/1BCDWB/SF00000012'
EXPORTING
qrstr = p_str
qrlen = p_len.
效果:
打印内容改长:
完美实现!