1.请点击任意一行 "科目代码" 的超链接;
2.发现工作表被自动切换到了"明细账", 再请点击任意一行的“凭证号”超链接;
3.这个案例,实现了从总账到明细账、从明细账到凭证的穿透式查询;



1.报表有3个数据源: ds1, ds2, ds3, 分别用于3个工作表. 您可以在此看一下数据源的数据:
用于科目表的ds1数据源数据:http://www.supcan.cn/dotnet/account.aspx?func=1;
用于明细表的ds2数据源数据, 数据源动态参数是kmdm:http://www.supcan.cn/dotnet/account.aspx?func=2&kmdm=101;
用于记账凭证的ds3数据源数据, 数据源动态参数是pzh:http://www.supcan.cn/dotnet/account.aspx?func=3&pzh=313;
这是后端的C#源码、以及后端的access数据库文件(access.mdb)

2.源码分析:
function OnReady(id)
{
 AF.func("Build", "report/xmlsheet10.xml");
 AF.func("SubscribeEvent", "Clicked");  //预订鼠标点击事件
 //计算当前 (第一个) 工作表
 AF.func("calc", "range=current");
}
 
function OnEvent(id, Event, p1, p2, p3, p4)
{
 //过滤Clicked以外的事件
 if(Event != "Clicked") return;

 var sheetIndex = AF.func("GetCurrentWorksheet", "");
 //处理第一个工作表的事件==========
 if(sheetIndex == 0) {
   //滤除 "科目代码" 超链接以外的事件
   if(p4 != "kmdm") return;

   //取得序号 (对应到数据源的行号)
   var dsRow = AF.func("GetCellData", p1 + "\r\n 0");
   //直接读取数据源,取得该科目的科目名称、期初余额
   var kmmc = AF.func("data", "ds1 \r\n" +dsRow+ "\r\n kmmc");
   var qcye = AF.func("data", "ds1 \r\n" +dsRow+ "\r\n qcye");

   //切换到第二个工作表 (明细表)
   AF.func("SetCurrentWorkSheet", "1");

   //修改标题 (别名是 "title" 的单元格), 以及期初余额 (别名是 "qcye" 的单元格)
   AF.func("SetCellData", "title \r\n" + p3 + "-" + kmmc + "明细账");
   AF.func("SetCellData", "qcye \r\n" + qcye);
   //动态设置参数:科目代码
   AF.func("SetParas", "ds2 \r\n" + p3);
   //仅计算本工作表
   AF.func("calc", "range=current");
 }
 //处理第二个工作表的事件===========
 else if(sheetIndex == 1) {
   //滤除 "凭证号" 超链接以外的事件
   if(p4 != "pzh") return;

   //切换到第三个工作表 (凭证)
   AF.func("SetCurrentWorkSheet", "2");

   //为别名为 "pzh" 的单元格 (B2) 赋值
   AF.func("SetCellData", "pzh \r\n" + p3);
   //仅计算本工作表
   AF.func("calc", "range=current");
 }
}

3.工作表2、3的动态参数处理,故意采用了2种不同的技巧.
工作表2(明细表)的参数是科目代码,是通过调用 SetParas 函数设置的, 即上面源码的第33行;
工作表3(凭证)的参数是通过引用 B2 单元格设置的,只要改动 B2 单元格内容即可 (源码第46行), 凭证工作表的 B2 引用请见:


4.工作表2(明细表)中的“余额”列不是数据源填充的,它是计算列,其计算的逻辑是: 本余额 = 上一行的余额 + 借方 - 贷方,涉及到跨越行的计算关系. 为了实现该自动计算,F5单元格的公式被设成:
=@F4+@D5-@E5
请注意 F4 单元格所在行不是数据源填入行,F4的单元格别名是 "qcye", 在源码的第31行,动态设置了它的初始值. 当数据源填入数据后,该列的公式被自动生成:
从而就实现了行的交错的计算.

5.记账凭证工作表,为了尽可能模拟真实凭证纸,我们将 B4 单元格的显示格式的一个属性 "数据源至少填入行数" 设成了 5 行。