先下载资料包。文后有资源包下载!!!
- 在配置系统环境之前先建一张表。用来存资料:tc_txt_file,压缩包里面有sch文件。
先将tc_txt_file.sch表在数据库中建好。比如用p_zta或者打开数据库复制粘贴来建立。
- 将ldap.jar 、qrcode-zxing-jdk1.6.jar、dmcode.jar上传到tiptop/ds4gl2/bin/javaad/jar
(这个适用于jkd1.6的zxing包来之不易,我的大洋啊!!另外ldap.jar包在本例中是无用的)
- 修改环境变量CLASSPATH 位置是/u1/topprod/tiptop/bin/tiptop_env
运行:vi /u1/topprod/tiptop/bin/tiptop_env进行编辑,随便找位置加入下面语句。如果已经存在CLASSPATH语句,即按”:加路径”的格式拼到后面就行。
CLASSPATH=$TOP/ds4gl2/bin/javaad/jar/ldap.jar:$TOP/ds4gl2/bin/javaad/jar/qrcode-zxing-jdk1.6.jar:$TOP/ds4gl2/bin/javaad/jar/dmcode.jar;export CLASSPATH
这个环境配置类似于咱们WINDOWS系统弄配置JAVA环境Path一般组合环境变量
- 刷新环境变量 #source /u1/topprod/tiptop/bin/tiptop_env
- 将ccl_get_encode.4gl上传至 /u1/topprod/topcust/clib/4gl
此处如果编辑不成功。那么退出ERP重新进来再尝试。如果还不行或者出现什么奇怪的闪退现象,可以考虑重启ERP服务器!!!
- 编译ccl_get_encode.4gl之后在需要生成二维码图片的程序中p_link中链接ccl_get_encode调用生成图片的函数,比如本例子中是csfr103
程序中调用:
- 在水晶报表的xml文件中加入大数据对象(l_qrcode为4GL传的图片变量名称)
<xs:element name=”l_qrcode” type=”xs:base64Binary” minOccurs=”0″ />
报表中当正常字段拖出来用就行
显示:
为方便复制代码,下面是代码举例,其中标黄的是重点代码:
FUNCTION encode_print()
DEFINE l_sql STRING
DEFINE l_format STRING
DEFINE l_format_i LIKE type_file.num15_3
DEFINE l_i LIKE type_file.num5
DEFINE l_k LIKE type_file.num5
DEFINE l_j LIKE type_file.num5
DEFINE l_m LIKE type_file.num5
DEFINE l_sfc02 LIKE sfc_file.sfc02
DEFINE l_str LIKE type_file.chr200
DEFINE l_qrcodeid LIKE type_file.chr20
DEFINE l_qrcode LIKE type_file.blob
DEFINE l_day LIKE type_file.chr6
IF cl_null(tm.inp) THEN
CALL cl_err("不可为空!","",1)
RETURN
END IF
CALL cl_del_data(l_table)
LET g_sql = "INSERT INTO ",g_cr_db_str CLIPPED,l_table CLIPPED," VALUES(?,?,?,?,?, ?,?,?)"
PREPARE insert_prep FROM g_sql
IF STATUS THEN
CALL cl_err('insert_prep:',status,1) EXIT PROGRAM
END IF
LET l_j = 0
LET l_k = 0
IF g_inf.sfb08 > g_inf.tc_obe03 OR g_inf.sfb08 = g_inf.tc_obe03 THEN
LET l_format_i = g_inf.sfb08 / g_inf.tc_obe03
LET l_format = l_format_i
LET l_i = l_format.subString(1,l_format.getIndexof('.',1))
LET l_j = l_i
LET l_m = g_inf.sfb08 MOD g_inf.tc_obe03
ELSE
LET l_m = g_inf.sfb08
LET l_j = 1
END IF
LET l_sfc02 = g_inf.sfc02[2,9]
SELECT to_char(g_today,'YYMMDD') INTO l_day FROM dual
LET l_str = g_inf.ima133,'620083',l_day,l_sfc02
CALL ccl_get_dmcode(70,70,l_str,'N') RETURNING l_qrcodeid
LOCATE l_qrcode IN MEMORY
SELECT tc_txt04 INTO l_qrcode FROM tc_txt_file WHERE tc_txt01 = l_qrcodeid
FOR l_k = 1 TO l_j
EXECUTE insert_prep USING g_inf.ima133,tm.inp,g_inf.tc_obe17,l_sfc02,g_inf.day,g_inf.tc_obe03, l_qrcode,l_str
END FOR
IF l_m > 0 THEN
EXECUTE insert_prep USING g_inf.ima133,tm.inp,g_inf.tc_obe17,l_sfc02,g_inf.day,l_m, l_qrcode,l_str
END IF
FREE l_qrcode
LET g_sql = "SELECT * FROM ",g_cr_db_str CLIPPED,l_table CLIPPED
CALL cl_prt_cs3('csft005','csft005',g_sql,"")
END FUNCTION
后续补充,在代码里面,有几个地方要注意的:
1、l_qrcode 也是要插入到报表字段里面去的。所以假如你是要显示一个 物料编号 的二维码,那么你需要一个存在 物料编码 的字段,同时也需要一个l_qrcode的字段。l_qrcode 格式如下:
#ima01t 就是存入l_qrcode 值的。
【但是,但是,但是,ima01t.type_file.blob 这类型字段不能放在第一位,如下程序就会说转换不了】
LET g_sql =" ima01t.type_file.blob,rvv31.rvv_file.rvv31,rvv031.rvv_file.rvv031,",
" ima021.ima_file.ima021,tc_aab03.tc_aab_file.tc_aab03, ",
" faf02.faf_file.faf02"
正确的:
LET g_sql =" rvv31.rvv_file.rvv31,ima01t.type_file.blob,rvv031.rvv_file.rvv031,",
" ima021.ima_file.ima021,tc_aab03.tc_aab_file.tc_aab03, ",
" faf02.faf_file.faf02"
#ima01t 就是存入l_qrcode 值的。
sr字段却是不用填的,不能定义一个 sr RECORD ima01t like type_file.blob 做了就报错,不知道为啥。
只能直接在insert into的时候用l_qrcode 字段就行,本来还想着用sr.ima01t的
2、注意 LOCATE l_qrcode IN MEMORY 和 FREE l_qrcode 不能漏
资源包下载<TIPTOP_TOPGP生成二维码(支持DM码).rar>
链接:https://pan.baidu.com/s/1h0eqvsGDK1oEuDi5JMlQjA
提取码:3b4m
结尾语:感谢方案提供者:我是TT-风