| 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 行。