日志

关于KIS BOS开发的另一种思路 <上一篇 | 下一篇> 

  无论是通过SQL实现还是通过插件实现,KIS BOS的自定义报表的查询条件必须是封闭区间,如下示例:条件1>=值1 并且 条件1<=值2
  那么如果存在这样一个情况,首先要查询条件1<值1的记录,并将结果作为报表的第一行;然后再查询条件1>=值1 并且 条件1<=值2的所有记录,作为报表第一行以后的所有行。这时该怎么用KIS BOS来做这个报表呢?
  我的描述不是很清晰,可以参考商贸版的往来对账单报表,通过SQL事件探查器跟踪出语句,就可以发现上述情况。比如我们查看2009年5月1日-2009年5月31日的对账单,根据语句显示,系统首先查询截止到5月1日前的余额,条件是FDate<'2009-05-01';然后再查询2009年5月1日-2009年5月31日的所有发生额,条件是FDate>='2009-05-01' And FDate<='2009-05-31'。
 
   那么能否通过KIS BOS作出完全和商贸版往来对账单格式一致的报表呢(假定只按日期查询客户)?
   
   【未完待续】
已经公开 2009年6月16日 12:15 作者: 忠厚先生

评论

avatar 

通过插件应该能实现这种情况。

2009-06-16 13:18
 
avatar 

如果设置两个日期条件呢,第一组用于取期初数据,第二组用于取业务数据。

在第一组的后一个条件使用1=1的语句,即:FDate<'2009-05-01' and 1=1。这样一来,即只认前一个条件即可。

2009-06-16 14:30
 
avatar 

lz_xiaohe 这个思路不错,不过我是通过插件来实现的。下面就具体说说实现过程,抛砖引玉。

----------------------------------------------------------------

1、根据KIS BOS提供的示例代码,我们知道有两个工程,一个是KISCondition,这个是设置过滤条件的工程;还有一个是KISBOSExample,这个是具体的报表实现。

2、其实本例关键就两个参数(其它例子可以类推),一个是StartDate,一个是EndDate。

3、通过KISCondition可以设计一个窗口,放置两个DatePicker控件,分别用来记录起止日期。

4、KISCondition将把选择的日期作为参数传递给KISBOSExample,在后者里有一个过程GetReportSql专门用来分析参数和组织报表实现的SQL语句。

5、我们把跟踪得到的语句以资源文件的形式存储,把相关日期替换为如下标志字符{StartDate}和{EndDate}。假设资源ID=105,则以下过程将实现类似商贸版往来对账单格式的报表。

6、'//取得sql语句
Private Function GetReportSql(ByVal strCondition As String) As String
    Dim strSQL      As String
    Dim arrCdn()    As String                       '保存过滤条件
    Dim strCdn      As String
    Dim StartDate As String, EndDate As String '因为SQL语句对于日期是采用文本处理,所以此处定义为文本型
    strSQL = ""
    strCdn = ""
    arrCdn = Split(strCondition, "|")
    mvSerial = Trim(arrCdn(4))
   
    If Trim(arrCdn(0)) <> "" Then               '起始日期
        StartDate = arrCdn(0)
        strCdn = strCdn & " and v1.Fdate>='" & Trim(arrCdn(0)) & "'"
    End If
    If Trim(arrCdn(1)) <> "" Then               '结束日期
        EndDate = arrCdn(1)
        strCdn = strCdn & " and v1.Fdate<='" & Trim(arrCdn(1)) & "'"
    End If
    '----------------------------
    '从资源文件里载入相关SQL语句

            strSQL = strSQL & LoadResString(105)
            strSQL = Replace(strSQL, "{DateStart}", StartDate)
            strSQL = Replace(strSQL, "{DateEnd}", EndDate)
    GetReportSql = strSQL
End Function

7、因为是只截取了参数,而没有截取条件,所以可以实现更多灵活的应用。

2009-06-16 15:46
 
avatar 

在跟踪出来的语句里,把是FDate<'2009-05-01'、FDate>='2009-05-01' And FDate<='2009-05-31'替换为FDate<'{StartDate}'、FDate>='{StartDate}' And FDate<='{EndDate}',切记保留单引号,并且只替换值,而不要替换条件,这样在程序里组织SQL语句时,就可以非常灵活的组合这些值,而不用考虑单引号的问题。

我们只需要在查询分析器里将SQL语句调试通过,达到目的后,把参数值修改成标志字符串,然后存入资源文件。在使用时,从资源文件载入,然后把标志字符串再替换为传过来的参数值即可。

这样也可避免在程序里逐一写SQL语句导致代码太长,工作量太大。

2009-06-16 15:54
 
avatar 

6、'//取得sql语句
Private Function GetReportSql(ByVal strCondition As String) As String
    Dim strSQL      As String
    Dim arrCdn()    As String                       '保存过滤条件
    Dim strCdn      As String
    Dim StartDate As String, EndDate As String '因为SQL语句对于日期是采用文本处理,所以此处定义为文本型
    strSQL = ""
    strCdn = ""
    arrCdn = Split(strCondition, "|")
    
    If Trim(arrCdn(0)) <> "" Then               '起始日期
        StartDate = arrCdn(0)
    End If
    If Trim(arrCdn(1)) <> "" Then               '结束日期
        EndDate = arrCdn(1)
    End If
    '----------------------------
    '从资源文件里载入相关SQL语句

            strSQL = strSQL & LoadResString(105)
            strSQL = Replace(strSQL, "{DateStart}", StartDate)
            strSQL = Replace(strSQL, "{DateEnd}", EndDate)
    GetReportSql = strSQL
End Function

2009-06-18 8:35
 
avatar 

学习!

2009-06-25 8:12
 
avatar 

学习

2009-06-30 15:31
 
请登录后再发表评论以赚取更多积分

About 忠厚先生

长叹息以掩涕兮,哀民生之多坚。