一、易拓使用Crystal Report打印出来的报表中的Logo是如何显示出来的?
作业步骤如下:
1.在p_zo中设置需要在报表中显示的图片,截图如下:
2.图片文档的存储位置如下:
存储相关的4gl代码如下:
IF NOT cl_null(g_zo.zo01) THEN
LET ls_file = cl_browse_file()
IF NOT cl_null(ls_file) THEN
LET ls_server_file = "$TOP/doc/pic/pdf_logo_",g_dbs CLIPPED,g_zo.zo01,".jpg"
LET l_cmd = "rm ",ls_server_file CLIPPED
RUN l_cmd
IF NOT cl_upload_file(ls_file, ls_server_file) THEN
CALL cl_err(NULL, "lib-212", 1)
RETURN
ELSE
LET l_cmd = "chmod 777 ",ls_server_file CLIPPED," 2>/dev/null"
RUN l_cmd
CALL p_zo_img()
END IF
END IF
END IF
$TOP实际路径如下:
结论:图片地址:$TOP/doc/pic/pdf_logo_+营运中心+语言别+jpg。实际测试发现:非jpg格式的原始图片也支持,比如网络上比较常用的png格式。
3.Crystal Report中是如何获得这个文件的地址呢?
这个图片对象的图形位置来自于公式字段:location。我们可以猜测:这个location就是指向我们上一步骤储存在服务器上的文件了。那接下来我们就去看看location这个公式字段里面是否赋值的就是我们设定好的文件位置呢?你真的去看了吗?是不是大失所望,里面空空如也。不着急,既然CR模板里面没有给值,那么可能是在Runtime的时候给的值,那给的值是什么呢?CR服务器中使用aspx页面来加载并显示图片的,由于看不到源代码,所以猜测是在Default.aspx页面中给location赋的值。这一点,其实在unix/linux的console中也可以得到验证:
其实就是l_logo的值,一个存储了图片网址的变量。
4.图片的uri地址是如何显示为图片的?上一步骤中,我们仅仅是获得了地址,那么Crystal Report是如何将其显示为图片的呢?在CR服务器的web.config中,我们可以看到下面这一段:
<httpHandlers>
<add verb="GET" path="CrystalImageHandler.aspx" type="CrystalDecisions.Web.CrystalImageHandler, CrystalDecisions.Web, Version=11.5.3700.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/>
</httpHandlers>
到此,你应该明白了吧!
5.言外之意之前常在QQ群中看到有些人做的报表出现错误,很大一部分原因就是在设计新报表的时候,将图片删除了,同时也将location这个公式删除了,报表加载的时候,系统要给location赋值了,可以location却不见了,所以即使location用不到,也要将其保留。其实,鼎新可以考虑修改一下程序,没有发现location这个公式,则不要赋值了。CR模板中的其它对象,比如预留的参数字段,都要保留,不要随便删除。
二、如何举一反三,在CR中显示除logo图片之外的自定义图片呢?
我们可以参考上面的方式,将除了logo之外的图片也通过类似的方式传给报表来显示
1.如何给CR传递图片的uri?
由于TIPTOP主机跟CR主机是分离开的,我们要想在两者之间传递数据,最简单的方法就是把4gl中的地址通过参数的方式给CR主机。CR模板里面预留了20个参数字段。
2.如何将图片上传到TIPTOP主机?
参考p_zo即可。文件的位置也可以自己定。
3.设计CR模板
在模板文件中放置图片,且设置图片为某个参数字段。
4. 4gl中给参数赋值,参考代码如下:
5.大功告成!
好了,现在把CR模板传上去,4gl编译、链接。成功!
三、后记
1.对于一些没有分组的报表,IE在显示报表的时候,仍在左边预留了menutree的东东,对于一个痛苦的完美主义者来说,鼎新应该预留个借口,让我们告诉CR,我这个报表没有分组,不要给我显示menutree,这样子出来的预览画面也美观的多。(也许是CR本身的限制,未考证)
2.也许有人会说,利用上面的传参数的方法,毕竟传递的数据有限,如果是要将图片放在明细段中,又该如何呢?哈哈,这个其实也简单,我都举一反三了,你也来一下呗!
3.另一种方法是将图片储存在table中,然后在CR中显示。这个大家期待下一篇博客吧。