如果需要用自定义函数返回游标,那么需要返回的类要实现接口com.raqsoft.dm.IlineInput。如下面的test.RandDataCursor:
package test;
public class RandDataCursor implements com.raqsoft.dm.ILineInput {
private int rowno = 0;
private int range = 1000;
public RandDataCursor(Integer rg) {
this.range = rg;
}
public Object[] readLine() throws java.io.IOException {
rowno++;
Object[] result = new Object[2];
result[0] = Integer.valueOf(rowno);
result[1] = Integer.valueOf((int) (Math.random() * range ));
return result;
}
public boolean skipLine() throws java.io.IOException {
rowno++;
if (rowno <= 10000) return true;
return false;
}
public void close() throws IOException {
rowno = 10001;
}
}
IlineInput类中需要实现readLine,skipLine和close这3个方法。上面的RandDataCursor比较简单,用来生成由随机整数构成的序列,其中随机数的范围可以用参数指定。readLine返回的每条记录,都由顺次增加的行号和随机数构成,类似于报表的两个字段。在skipLine方法中,可以跳过1条记录,并返回游标中是否仍有剩余数据,上面例子中设定这个游标最多返回10000条数据。close方法则用来关闭游标,释放不需要的资源,如数据库连接等。
这样,返回游标的自定义函数即可将RandDataCursor作为返回类,如:
package test;
public class Calc02 {
public static test.RandDataCursor getCursor(Integer range) {
RandDataCursor rdc = new RandDataCursor(range);
return rdc;
}
}
这个自定义函数只需定义一个参数,即随机数的范围,返回的结果就是RandDataCursor,用来生成随机记录的游标。在调用时,返回的IlineInput类并不能直接作为游标使用,还需要调用com.raqsoft.dm.UserUtils类中的newCursor方法,如:
|
A |
1 |
=invoke(test.Calc02.getCursor,1000000) |
2 |
=invoke(com.raqsoft.dm.UserUtils.newCursor,A1,"") |
3 |
>A2.skip(100) |
4 |
=A2.fetch@x(100) |
A1中,返回自定义游标类,RandDataCursor。A2中,调用UserUtils中的newCursor方法,将A1中的结果作为参数传入,A2中的数据即为集算器中的游标数据了。A3中跳过前100条记录后,A4中取出100条数据后关闭游标,A4中结果如下:
返回数据时,也可以类似与读取文本数据一样,添加@t选项,将读到的第1行数据作为标题,或者添加@1选项,将数据读为1列。如将A2中的代码改为=invoke(com.raqsoft.dm.UserUtils.newCursor,A1,"t"),即相当于添加了@t选项,A4中结果如下:
当然,这里的RandDataCursor中实际上并未设计类名,执行的结果只是将第1条数据作为列名返回。从结果中可以看到,数据中的第2列和之前的结果不同,是随机整数。