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> 之间的串中，大于、小于符号请务必将写成 &gt;、 &lt;， 或者用 <![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端口.