1. 取数设置
要想顺利使用QS函数,必须先在服务器端定义好取数设置。取数设置支持JDBC取数和BI取数。取数设置可用于插件取数公式QS和变长表初始化数据。
1.1. JDBC取数设置
取数名称:用于指定插件中QS函数取数公式的第一个参数,建议取简短易记的英文字母作为名字.
数据源名称:用于指定取数的数据库连接对象,可以在"服务器管理"的"数据源管理"中设置.
SQL语句:用于指定取数的SQL语句,SQL语句必须是一个select语句或者存储过程.
SQL语句可以包含如下自定义宏参数
宏名称 类型 含义
<id> 字符串 报表户代码
<lid> 字符串 登录用户代码
<bbq> 字符串 登录用户填报任务的报表期
<option> 字符串 代表由QS函数传递过来的扩展参数
<rs> 游标,存储过程的返回类型。 采用存储过程时使用到此宏参数,用来表示存储过程将返回结果集,例如:
字符串 用于扩展,由QS函数传递
关键字列:用于指定返回语句中唯一性关键字的字段名,可以有多个.
示例:
1.2. BI取数设置
取数名称:用于指定插件中QS函数取数公式的第一个参数,建议取简短易记的英文字母作为名字.
数据源名称:用于指定取数的BI数据源名称,可以在"服务器管理"的"数据源管理"中设置.
BI报表:用于取数用的BI报表。
取数区域、行列定义:要从BI报表取数的表元范围。其中列名相当于jdbc取数中查询结果的字段名,将作为QS函数中用的指标名来使用。
参数列表:查询BI报表用的参数
2. 取数函数说明
QS("取数名称","报表期","报表户","指标名","扩展参数选项")
QS函数返回一个字符串型,它只接收五个字符串型的参数:
取数名称:第一个参数表示要取哪个取数设置的数据,此参数必须指定。
报表期:第二个参数是取哪个期的数据,此函数可以为空表示取当前期,为@1表示前一期,为200212-表示取2002年12月的数据。
报表户:第三个参数是取那户的数据,为空表示取当前户的数据,为001表示是取报表户代码为001的单位的数据。
指标名:第四个参数是表示取哪个指标。
扩展参数选项:第五个参数是自定义选项以备扩充,对于通过SQL定义的取数设置,你可以在你的SQL中用<option>标签来接收此参数值,运行时,SQL语句中的<option>字串会自动替换为QS函数传过来的值。你也可能通过此参数传递一个特殊格式的值,相应的,在服务器端,需要针对这个特殊格式开发相应的接口对此参数进行解析。
此函数主要用在插件上在线填报时从数据源中取数。
3. 应用举例
3.1. 简单SQL取数
某取数设置名为"GETDATA1",
其语句为:
相应QS公式写法为:
QS("GETDATE1","","","name","")
3.2. 从多行多列SQL结果中取数
某取数设置名为"GETDATA2",
其SQL为,
关键字列为 PID
SQL查询结果如下:
PID | Price | Qty | ProductName |
A101 | 100.2 | 14 | CD-ROM |
A102 | 200.5 | 26 | TV-CARD |
C110 | 300.4 | 17 | LCD |
则公式用法如下示例:
QS("GETDATA2","","","A101@Price","") 返回"100.2"QS("GETDATA2","","","A102@ProductName","") 返回" TV-CARD "QS("GETDATA2","","","C110@ProductName ","") 返回" LCD "QS("GETDATA2","","","A101@Qty","") 返回"14"
3.3. SQL取数中使用宏参数
某取数设置名为"GETDATA3",我们要取某表中当前报表户、当前报表期、且A2的值等于上期A2值的当前期H4的数据
其SQL为:
其中<option>的值要想办法变成上期A2的值。则我们的QS函数可以这么写(在QS的第5个参数中传入上期的A2值):
QS("GETDATA3","","","H4",@-1A2)
3.4. 从存储过程中取数
例如,在Oracle中定义如下储存过程:
存储过程书写请注意:必须要有一个返回值,对于oracle就是OUT参数,此OUT参数必须是结果集!
取数设置中,取数名称为"GETDATA4",
其SQL语句定义为:
其中<rs>参数位置对应存储过程OUT参数位置(for Oracle),必须有。(上述sql写法,不同数据库格式不一样,<rs>位置也不一样,请参考前文说明)
相应的取数函数写法:
QS("GETDATE4","","","HYDM","")
3.5. 从BI取数
假设有如下BI取数设置,

在QS函数中,取返回结果集中的D列的值,
QS("QS2","","","D","")
4. 取数函数扩展
前面列举了扩展参数<option>的简单应用。对于需要满足特殊查询取数的情况,也可以通过QS函数传递扩展参数来实现,参数格式可以自行约定,相应的,服务器端要实现一个ReportDataSetFactory接口来解析并处理此扩展参数。
ReportDataSetFactory接口定义如下:
/** * 此接口是一个参数取数接口的类工厂接口,共第三方开发者实现。 */public interface ReportDataSetFactory extends ObjectFactory { public static final String PARAM_TASK = "taskObj"; /** * 根据所指定的参数,返回一个实现接口ReportDataSet的类。 * @param cls 参数cls表示返回的实现的类的类别 * @param 参数bbq表示要取哪期的数,如200201--表示2002年1月 * @param 参数bbhid表示要取哪个单位的数据 * @param 参数option用于扩充,由QS函数扩展参数提供,其格式任意,由ReportDataSetFactory实现类负责解析。 * @param 参数zbs表示将要取的那些指标的名称,对于变长表的取数,此参数为null * @return 返回ReportDataSet对象实例 */ public ReportDataSet createReportDataSet(Login login, String cls, String bbq, String bbhid, String btype,String option, String[] zbs); /** * 取得服务器上所支持的所有取数设置的名字 * @return */ public String[] getClsNames();}
要使用此扩展实现,还要在server.property里增加如下参数,例如:
ReportDataSetFactory=com.sanlink.oem.nfh.ReportDataSetFactoryNfhImpl
如果你有多个实现类,则用逗号分隔。
请先登录