3.安装、部署与运行
 | 问1.在Win7 / Win8 / Win8.1下,我明明把报表另存到文件了,但是为什么在资源管理器中却找不到这个文件? |
答复:
1.Vista / Win7 操作系统:
是 IE 的“保护模式”起作用的结果,在“保护模式”下,IE8中看到的文件目录其实都是虚拟目录,你可能根本就找不到它们。
建议将访问的网站加入受信任网站,这样“保护模式”能自动关闭:
另外还有一种办法:降低 UAC (在控制面板-系统和安全-更改用户帐户控制设置) 的等级, 但降低后整机的安全会受影响。注:如果降低UAC,需要重启电脑才生效.
2.Win8 / Win8.1 操作系统:
“保护模式”大致同上,但是操作系统的给浏览器和控件的权限比 Vista/Win7 更少,首先,您必须要把网站加入受信任站点; 其次,只能存取当前用户目录下的文件,比如存取“我的文档”中文件。
降低 UAC 等级这种方法似乎也不管用了,这一点和 Vista / Win7 不同.
 | 问2.客户端如何卸载Supcan套件? |
答复: 非常抱歉,客户端没有现成的卸载方法,不过按如下步骤,可以清除Supcan程序:
Step1: 如果是 WIn7/Win8 系统,请删除 \用户\用户名\下的 BC 子目录(或 BC64、BC_Mozilla目录);
Step2: 如果是XP/2003系统,请删除\Documents and Settings\用户名\下的 BC 子目录(或 BC64、BC_Mozilla目录),个别安全设置比较严格的机器,BC目录有可能在D:\BC;
Step3: 如果是使用FireFox浏览器的,在FireFox菜单“工具 \ 附加组件”中找到硕正插件,将其卸载;如果是Chrome浏览器,则应在“工具\扩展程序”中去删除它;
Step4: 如果是使用IE浏览器,找到Windows\Downloaded Program Files子目录,展开,删除“Supcan2 Control”程序;
至此,应该是清除干净了。
备注:硕正套件决不写注册表(Regedit)、也不往诸如System32等目录拷贝任何文件。
 | 问3.客户端能保持多版本共存吗? |
答复: 在浏览器进程(Process)中不能同时加载多个版本,否则会报错。
多个版本的程序文件是能够共存的,程序文件都在\Documents and Settings\用户名\BC\下各自的版本子目录中,页面加载哪个版本完全取决于dynaload.js中的版本号。
为了避免版本升级后无用老版本的积聚,Supcan采用如下策略:每次浏览器进程首次加载控件时都将自动检查配置文件,如果新版本程序访问过的URL覆盖了老版本访问过的URL,才会自动删除老版本程序.
 | 问4.我在服务器中升级了Supcan的新版本包,为什么有的电脑能自动升级、而有的电脑老是报错要求关闭浏览器重新启动?
|
答复: 它同时加载了2个不同的版本,所以会报错. 导致这个问题的可能原因如下:
1.浏览器加载过老版本,在没有关闭过浏览器的情况下又加载了新版本。所以我们建议在深夜、尤其是在周末的深夜升级服务器;
2.页面未能及时更新dynaload.js所致,象页面中类似如下的脚本:
<script type='text/javascript' src='dynaload.js' />
当该js被修改后,浏览器不一定会马上刷新,它可能会从本地cache中读取,所以它以为版本没变,就加载了本地的老版本。当然解决办法也非常简单:在src后加一个特定的文字戳即可,例如改成:
<script type='text/javascript' src='dynaload.js?123' />
这样这段js就肯定能刷新,以后只要js改动过,文字戳也必须更改。
其实,不只是js,象常用的<a href='abc.htm'>超链接偶尔也会发生这种情况,其解决方法同上。这个问题本身和硕正套件是没有关系的,其实,有很多Web开发者在平时开发时都碰到过js未及时刷新的现象。
本demo演示页基本上都采用了这种书写格式,避免了静态文件未能及时刷新现象。
 | 问5.我给我的用户升级后,为什么有的电脑会出现如下错误:
 |
答复: 原因和上一个问题完全一样。
如果在重启浏览器后仍然出现,那么恐怕需要手动去删除 "\Documents and Settings\用户名\BC" 目录了(windows7下是 "用户\用户名\BC" 目录)。
 | 问6.在版本升级时,有几台电脑死活升不上去,手工删除BC目录了还不行,怎么办? |
答复: 很有可能是缓存在作怪,缓存包括服务器端缓存、浏览器缓存。
重启Web服务、清理浏览器的Cache,一般就能解决。
 | 问7.我们每次版本升级都很费劲,硕正套件升级难道都这样的吗? 有没有什么彻底的解决办法? |
答复: 不会,只要你理解“问4”、“问6”,并严格按照要求做了,基本应该是很顺利的。可以归纳为如下3点,希望您严格执行:
1.在夜间升级
原因:保证用户下次打开IE,IE进程是干净的,不会出现一个进程同时加载2个版本的情况。
2.象“dynaload.js?123”这个数字,每次版本升级都应该变化
原因:保证IE能下载这个文件,而不是从IE Cache 中读取。
3.升级后,后端服务建议重启
原因:Web服务器也有Cache,重启服务以清空这个Cache。
有一种情况,我们恐怕没有好办法:某些用户不喜欢关机(比如喜欢用睡眠)、IE进程又不关闭。
 | 问9.我在自己的电脑上搭了个应用,用IE没问题,用FireFox时插件下载不了,提示Http 404 文件未找到的错误 |
答复: 请按照“开发者指南”上的使用说明为你的服务器增加一个MIME。
 | 问10.我的应用复用了dynaload.js,发现在FireFox下首次下载插件时和硕正提供的安装包中的demo页不一样,会出现如下不友好的对话框 |
答复: 请参考安装包中的首页(index.htm),修改您的首页面,增加如下js:
function go(url)
{
var agent = navigator.userAgent.toLowerCase();
if(agent.indexOf("msie")>0) {
location.href=url + '?81';
return;
}
if(navigator.mimeTypes["application/supcan-plugin"]) {
location.href=url + '?81';
return;
}
if(agent.indexOf("chrome")>0)
window.open("install_chrome.htm");
else
window.open("binary/supcan.xpi");
}
将href指向'javascript:go(".....")',这样就不会出现这个对话框了.
注意,这个"binary/supcan.xpi"是相对URL。
 | 问11.使用Supcan套件过程中,发现\Documents and Settings\用户名\BC\Temp 目录下临时文件会越积越多,这正常吗? |
答复: 不必理会,Supcan自有一套垃圾清理机制.
 | 问12.我单位是不允许连外网的,我发现首次安装硕正套件速度很慢甚至安装不成功,是不是需要连外网的原因? |
答复: 是的,因为 IE 会在线检查加载项的数字签名证书是否以被加入了黑名单。
如果您希望跳过在线检查,只能手工打开IE浏览器菜单“工具”下的“Internet选项”,切换到“高级”选项卡,在“安全”树杈中,把 “检查发行商的证书是否吊销” 勾选除去。
 | 问13.发现电脑安装不上硕正套件,是什么原因? |
答复: 如果是首次安装, 请检查:
1.请把IE浏览器的安全等级设成默认的,大部分问题都能解决;
2.检查是否能连外网,如果不能连外网,请看上面的“问13”;
3.如果是Win7, 请看上面的“问1”,尽管看似不是同一个问题,但本质是一样的;
4.如果还不行,请直接访问硕正官网上的在线演示,如果在线演示没问题,那说明是你后端部署有问题,比如少部署了文件、或URL写得有问题;
5.如果大部分电脑没问题,有个别电脑死活装不上,这种情况也确实存在。我们发现,确实有大约 2% 左右的电脑无法自动安装,原因不明,主要是XP系统,遇到这种情况,请联系硕正客服,申请要一个本地安装包的制作工具,借助该工具,肯定能安装成功。
如果不是首次安装,而是升级不成功,其原因请参考上述的“问7”,只要你后端部署肯定没问题,一般手工删除BC目录、清理IE的Cache后,肯定能成功。
4.Treelist组件
 | 问1.demo页中,有的数据用XML格式、有的用JSON、有的是TXT,有规定吗? |
答复: 没规定。
硕正套件是自适应的,即能够自动识别数据的格式。
 | 问2.我明明删除了1行数据,调用GetChangedXML()却返回空串(即内容未被修改过),这是为什么? |
答复: 您必须在 <Properties> 中定义Key属性,指定主键。
 | 问3.Treelist的XML规范有点复杂,我需要去啃它吗? |
答复: 是的,这是必需的,因为Treelist目前还没有象Supcan Report那样的所见所得设计工具。该XML规范其实也并不复杂,您可以随时查阅帮助文档,常用的元素不会超过20个。
 | 问4.某列采用了下拉Treelist,下拉选择后,如何取得选中内容、和下拉Treelist中选中行各列的内容? |
答复: 如果仅仅是取单元格的显示内容,调用GetCellText( )函数就行,该函数取得的是显示内容,而非数据。
如果需要取下拉当前行其它列的内容,那么首先调用GetHandle( )函数取得下拉Treelist的句柄,然后调用扩展函数的GetCurrentRow( )取得下拉Treelist的当前行,最后调用扩展函数GetCellData()即可。
请参见演示页 “28.下拉的其它功能” 中的演示。
 | 问5.我采用Freeform、Treelist分别作为表单的表头、表体,但打印时只能打出表体部分,如何才能按照我自己的格式打印完整的表单呢? |
答复: 使用Report组件,并且应预先准备好一张使用了临时数据源的报表。
关于数据的传递,可以先通过GetChangedXML( )取得XML串,然后通过Report的SetSource( )函数,将这XML大串传入。
 | 问6.调用GetChangedXML( "level=0" )取得XML串,发现如果内容未改则返回空串,有没有简单的方法取得完整串而不管内容是否有改动? |
答复: GetChangedXML( "level=0; isIgnoreChange=true" )。
 | 问7.XML模板或API中,有很多处的URL(例如 dataURL)属性,如果采用相对URL,到底相对谁? |
答复: 遵循这2个规则: 1.谁定义,就相对谁; 2.斜杠("/")开头表示相对根目录。
 | 问8.Treelist的表达式、函数、宏不能完全解决我的客户端逻辑,怎么办? |
答复: 注意到函数js()了吗?它能反向调用当前页面的js,你可以把复杂的客户端逻辑写到页面Js中。
 | 问9.在Windows7下,为什么有的Treelist的输入处光标不会闪烁? |
答复: 是因为行高不够,适当调高即可。
 | 问9.设为主键(Key)的字段,如果我没输入或输入重复,用GetChangedXML函数提交时会提示错误。怎样才能不提示? 因为我的主键是后端生成的,客户端根本不需要校验 |
答复: 请参考GetChangedXML( )函数中的 isValidateKey 参数。
 | 问10.可编辑的下拉的列,我能任意输入吗(即内容不在下拉列表中的)? |
答复: 可以,需要定义 freeInputAble="true"。
 | 问11.最简单的下拉(Droplist),我看到例子中的数据都是静态的:
<DropList id="country">
<item key="1">France</item>
<item key="2">Germany</item>
<item key="3">Brazil</item>
<item key="4">Belgium</item>
</DropList>
能否动态从数据库取?
|
答复: 可以,写成例如这样:
<DropList id="country" dataURL="../service/getcountry.aspx" />
这个aspx返回的数据格式比较自由,也可以和静态数据的一样。
 | 问12.我的计算表达式是这样写的,为什么结果不正确?
<express> price=if(amount >= 1000, 2.3, 3.0) </express> |
答复: 在元素 <name> ... </name> 之间的串中,大于、小于符号请务必将写成 >、 <, 或者用 <![CData[ ]]>包绕。
 | 问13.Treelist中某一列是图片,发现图片是平铺显示,怎样让它自动缩放全部显示? |
答复: 将列设成右、下对齐即可。即<col Align="right" vAlign="bottom" ... >。
 | 问14. 怎样导出分页显示中的全部数据? |
答复: 有如下2种方案:
1.常规方案
执行 EnableMenu 函数,注意函数文档中的“exportAll”参数,使得右键菜单中能弹出“转换输出全部页”;
该菜单项会触发 RequestAllPages 事件,请在该事件中加载全部数据即可。
2.外部菜单方案
在外部菜单中通过调用Treelist的函数实现,调用的函数无非就是 Load、OpenExportDialog.
为了不影响原Treelist的显示,您也可以在页面的可视区域安置一个2px X 2px的Treelist,用这个Treelist来加载数据、转换输出。
如果数据行数很多,为了及时释放客户端内存,可以在导出后将数据行删除,或执行一遍Build也能起到清理内存的作用。
5.Report组件
 | 问1.如何学习和数据源相关的报表开发? |
答复: 1.请参考“开发者指南”中“Supcan Report组件”的“附录:数据源实例”,完全按照其步骤实战一遍;
2.如果您是asp.net开发者,请参考我们主页上“后端开发案例”中的第一个案例,完成数据源的数据提供服务编程,将其结合到上例的实战中;
3.如果您是JavaEE开发者,请参考我们主页上“后端开发案例”中的第二个案例,完成数据源的数据提供服务编程,将其结合到上例的实战中;
4.仔细学习Report的各个在线演示页,请关注其“技术分析区”,它包含了很多很重要的帮助、技巧;
 | 问2.点了工具条上的“保存”按钮,报表怎么没保存到服务器端啊? |
答复: Report本身并不具备上传文件的能力,该“保存”功能必须要和页面js、服务器端程序结合才能生效。具体做法如下:
方案一:
在页面中增加一个“上传”的按钮,在按钮的onClick事件中调用GetFileXML( )函数,以取得当前报表的XML串,然后通过Ajax POST到服务器;
方案二:
直接使用工具条上的“保存”按钮,但需要在OnEvent()事件中处理“Saved”事件:执行GetFileXML( )函数,取得当前报表的XML串,然后通过Ajax POST到服务器.
 | 问3.报表的工具条、编辑设计功能都很丰富,这到底是为开发设计人员用还是为最终用户使用? |
答复: Demo页只是全方位展示Report丰富的功能,最终部署到应用程序时,可以根据需要裁剪掉一些功能。
最简单的功能裁剪方法就是重新定义创建参数,屏蔽掉一些工具条或工具条上的按钮,具体可参考demo中的“几种展现方式”。
如果不怕麻烦的话,可完全抛弃Report自带的工具条:采用自定义工具条,具体可参考Report开发指南及相关demo页。
 | 问4.Treelist、Freeform都有XML文档规范可参考,为什么Report的XML文档规范没有公布? |
答复: 因为Report本身就是一个设计器,你设计好后“另存”到本地文件即可。此外,Report的XML格式远比Treelist、Freeform复杂,手写XML很难设计出复杂的报表。
 | 问5.采用Supcan Report设计好报表后,如何保证让最终用户既能编辑格式、但又不改坏已定义好的临时数据源? |
答复: 建议您采用包含如下功能的方案:
1.为每种报表设计一张原始的“模板”报表,内含完整的数据源定义,报表外观编排可以不完全按照用户的需求,粗糙一点也没关系;
2.提供自定义报表功能,用户新建的报表只能从“模板”复制,而不能让其直接修改“模板”;
3.需要为用户实现报表的保存功能,保存到服务器,下次默认打开的是用户自己新建的报表;
这样就能很好地实现不同的登录用户打开不同外观的报表、一个用户拥有多张报表的功能----其实都是从同一张模板中复制的。
中心数据源不存在这样的问题。
 | 问6.如何实现报表仅用于被查询而不被修改?或报表中部分内容不被修改? |
答复: 请调用Swkrntpomzqa( )函数。如果要让某些内容不被修改,请结合“保护”属性、和Swkrntpomzqa()函数。
也可以参考开发文档中的其它权限类函数,比如addEditAbleOnly( )、addUnEditAbleOnly( )函数,功能比较强大。
 | 问7.我设计好报表、填入数据源的数据,然后将报表另存,当我再次打开这个报表(XML文件)后,发现填入的数据不见了,这是怎么会事? |
答复: 在默认情况下,报表永远是以“模板”的形式保存的,模板是不包含从数据源中取到的数据的,也就是说在保存时,临时剔除了填入的数据。当报表再一次在页面中展示时,需要在OnReady( )事件中书写代码以取数、填充、展现。您明白这个机理了吗?
如果您非要连同数据一起保存,那么可以在工具条菜单 数据源管理 - 高级 中将选项“数据源填充的数据连同报表一起保存”勾上即可。
 | 问8.我更改了打印的设置(如页边界、分页参数),如何保持住这些参数? |
答复: 打印的所有参数,都是保存在XML模板文件中的。你修改了打印设置,需要保存一下模板(或上传到服务器).
 | 问9.我在学习带参数的数据源,是不是URL中的变量如 "test.aspx?y=2011&mon=23&dept=A1" 都必须当作参数? |
答复: 不是的,报表中的“参数”是指内容取自单元格的参数,像固定的、或由js控制的变量就不能算是“参数”.
 | 问10.中心数据源或临时数据源,有很多处的URL(例如 dataURL)属性,如果采用相对URL,到底相对谁? |
答复: 遵循这2个规则: 1.谁定义,就相对谁; 2.斜杠("/")开头表示相对根目录。
 | 问11.如何实现同类单证的连续打印? |
答复: 在js中编写一段循环,反复调用SetSource( )、Calc( )、Print( )函数就行.
须注意第一遍循环中Print( )的参数应该是1,其余的应该为0,这样打印对话框就只弹出一次。
 | 问12.电子表单通常分二部分:表头(master)和表体(detail),硕正Report能实现吗? |
答复: 请参考demo页“报表 - 精确打印 - 套打(一)”,这应该就是您所要的。 或者,也可以参考下Freeform的demo页“10.有表头表体的表单(2)”
 | 问13.我们的数据服务都设计成 rest 方式调用的WebService,请问应该怎样和硕正的数据源配套使用? |
答复: 选择普通的XML数据源(包括临时数据源或中心数据源)就行,而不是硕正Web Service数据源,因为硕正WebService数据源仅用于POST的、非rest方式的.
此外,你后端需要配置为: 1.请求方式必须是Get; 2.MediaType.TEXT_PLAIN.
 | 问14.怎样控制按数据类型输入,比如数值型只能输入数字、日期型只能输入日期? |
答复: 打开工具条左侧的“属性”对话框,选中“启用单元格的数据类型校验(在输入时)”:
但是请注意,该选项在设计时(DesignTime)是不起作用的.
 | 问15.我用 NotePad 打开一张使用了中心数据源的报表XML文件,发现其中有中心数据源的列结构的详细信息(即所谓“数据源模版”),这些列结构有什么用呢? |
答复: 在大多数情况下,这些列结构信息确实没啥用处,因为报表在展现时,列结构将强行和后端的中心数据源同步. 但是如果你修改了列的显示名(标题)、列的显示顺序、是否隐藏等等,那么这些信息就有用了。
当然如果使用的是临时数据源,那么列结构信息是绝对有用的。
 | 问16.我不想在页面中出现报表控件,只是想调用CallFunc函数直接打印,所以我把 div 的高、宽设为1px,为什么经常会不稳定,似乎控件没有创建? |
答复: 你把高、宽各设成 2px 就很稳定了,估计和浏览器对div的渲染有关.
 | 问17.继续上一个问题,我把 div 的高、宽设为2px,但还是有个白色(或黑色)的小点,能去掉它吗? |
答复: 在它的 OnReady 事件中,将它的div容器隐藏即可。隐藏div 可设置 visibility 为 hidden, 不建议用display="none" 。
 | 问18. SetSource( ) 函数到底应该在 Build( ) 函数前执行还是后执行? |
答复: 如果是临时数据源,必须先执行Build( ),再执行 SetSource( ); 如果是中心数据源,则没有这个要求,一般建议先执行 SetSource( ),因为它是全局有效的, 对今后的新增报表都能生效.
 | 问19. 报表中使用了超链接,有时候是直接打开了链接页面,有时候没反应,这有什么规律吗? |
答复: 如果你预订(SubscribeEvent) 了Clicked事件,那么只抛出Clicked事件,不会打开超链接页面的;否则则相反,只打开链接页面、不抛出事件.
 | 问20. 我想在页面 js 脚本中直接调用数据源中的数据,可以吗? |
答复: 可以,请参考“全局函数”文档中的“6.对 计算函数 的封装”。但你只能调用 data、head这些单个数据,无法调用 datarow、headrow这些块状的数据.
 | 问21. 我想对报表中数据源填充区域做一个合计,例如在 =datarow( )函数的下一行写 =sum(D4:D20),但无法预计数据有多少行,不知道D20这样写对不对? |
答复: 报表在线演示中有很多这方面的演示页的,例如:
关键就是需要“@单元名”宏,详细请参考"公共内容"中的"3.宏".
 | 问22. 报表中的单元格怎样让它使用下拉? |
答复: 首先,您必须在报表中先设定“字典”,字典功能在“工具箱”上方第四个小按钮中;
“新建”字典,字典中有2列:key 和 text,这里看似需要逐条输入,其实也可以直接从数据源加载的(在对话框右上方的“数据源”按钮);
建好字典后,设置单元格的选项,在工具箱、单元格选项的 " 下拉框选择录入"选项卡中.
6.服务器专版
 | 问1.我配置好了服务器专版,用花生壳作为临时域名测试,发现本机访问服务没问题,但从外网访问域名就是不成功,会是什么原因? |
答复: 我们发现过几起,都是和Windows防火墙有关, 你应该在防火墙的“高级设置”中分别增加一个入站规则和出站规则,开放80端口.