润乾集算报表多样性数据源之动态SQL传递
大多數(shù)情況下報(bào)表的數(shù)據(jù)源SQL都是固定的,但有時(shí)也需要?jiǎng)討B(tài)變動(dòng)其中某些部分實(shí)現(xiàn)動(dòng)態(tài)拼出,比如在報(bào)表應(yīng)用中允許用戶通過選擇表和字段查詢自己關(guān)心的報(bào)表數(shù)據(jù),報(bào)表開發(fā)時(shí)則希望對(duì)同類報(bào)表(明細(xì)或匯總)使用同一模板。這時(shí)就需要在報(bào)表中接收相應(yīng)參數(shù)拼接出動(dòng)態(tài)SQL進(jìn)行查詢后制作動(dòng)態(tài)報(bào)表。
潤(rùn)乾集算報(bào)表提供了兩種處理動(dòng)態(tài)SQL的方法,使用宏和集算腳本,可以快速完成這類報(bào)表,下面舉例說(shuō)明。
使用宏
????集算報(bào)表提供了宏機(jī)制,通過在動(dòng)態(tài)宏中拼接SQL后交由數(shù)據(jù)集查詢結(jié)果,最后在報(bào)表中使用動(dòng)態(tài)表達(dá)式獲得字段名和字段值完成報(bào)表制作。步驟如下:
設(shè)置報(bào)表參數(shù)
? ? 應(yīng)用中已經(jīng)按照指定的參數(shù)格式將表名、字段名和查詢條件傳遞給報(bào)表,因而報(bào)表參數(shù)設(shè)置如下:
? ??其中cols值:訂單ID,客戶ID,訂購(gòu)日期,發(fā)貨日期,到貨日期,運(yùn)貨費(fèi);
? ??where值:where 貨主地區(qū)='華北' and 貨主城市 in ('北京','天津','張家口','秦皇島') 。
?
設(shè)置宏
? ? 其中值為:"select "+cols+" from 訂單"+where,宏類型為動(dòng)態(tài)宏。
?
設(shè)置數(shù)據(jù)集
在數(shù)據(jù)集中引用上述定義好的動(dòng)態(tài)宏。
?
編輯報(bào)表表達(dá)式
? ? ?由于報(bào)表列都是動(dòng)態(tài)的,無(wú)法事先制作固定列的報(bào)表,需要使用動(dòng)態(tài)列函數(shù)。
這里使用了ds.fname()和ds.field()函數(shù)實(shí)現(xiàn)動(dòng)態(tài)列報(bào)表,具體用法可參考集算報(bào)表相關(guān)文檔。最后將輔助的A列和第一行隱藏即可完成報(bào)表制作。
????通過使用宏和報(bào)表的動(dòng)態(tài)函數(shù)可以快速拼接出動(dòng)態(tài)查詢SQL完成動(dòng)態(tài)報(bào)表的制作,宏比較適合邏輯簡(jiǎn)單的情況,如果拼接的SQL比較復(fù)雜,需要進(jìn)行一定的計(jì)算,那么使用宏就比較困難了,這時(shí)候就需要使用集算腳本來(lái)完成。
使用集算腳本
? ? 在集算報(bào)表中,可以通過“集算器”數(shù)據(jù)集和“腳本數(shù)據(jù)集”來(lái)引入集算腳本實(shí)現(xiàn)動(dòng)態(tài)SQL傳遞的目標(biāo),由于不涉及重用和過多的調(diào)試,這里直接使用腳本數(shù)據(jù)集完成。
集算腳本使得簡(jiǎn)單拼接代碼就可以實(shí)現(xiàn)宏在數(shù)據(jù)源方面的作用。除此之外,腳本還能完成更復(fù)雜一些的運(yùn)算,比如用戶在指定表和列時(shí),有一些列是必選列,即使用戶沒有選擇,在查詢后仍然顯示,這就需要在拼接SQL的時(shí)候事先判斷必選列是否在用戶的選出列中,如果不在,則在后面添加,同時(shí)要保證用戶選出列的次序。
? ? 這里仍然查詢訂單表的數(shù)據(jù),其中訂單ID、雇員ID和訂購(gòu)日期為必選字段,使用腳本數(shù)據(jù)集完成可參考如下步驟:
?
設(shè)置報(bào)表參數(shù)
????與上面的例子類似,報(bào)表中仍然接收選擇列和條件參數(shù)。
? ? 其中cols值:訂單ID,客戶ID,訂購(gòu)日期,發(fā)貨日期,到貨日期,運(yùn)貨費(fèi) ;
? ? where值:where 貨主地區(qū)='華北' and 貨主城市 in ('北京','天津','張家口','秦皇島') 。
?
設(shè)置數(shù)據(jù)集
????使用腳本數(shù)據(jù)集編寫腳本進(jìn)行SQL拼接和取數(shù)工作,并返回結(jié)果集。
? ? 使用集算腳本可以分步編寫計(jì)算邏輯,而且由于其對(duì)集合運(yùn)算的良好支持使得在A2中將所選字段集合與必選字段集合做并集即可獲得所有查詢字段,非常簡(jiǎn)單。其中:
? ? A1:所有必選字段的集合
? ??A2:將用戶選擇的字段集合與必選字段集合求并集,以保證保證所有必選字段都能選出
? ??A3-A4:執(zhí)行拼接好的SQL取數(shù)
? ??A5:為報(bào)表返回結(jié)果集
?
設(shè)置報(bào)表表達(dá)式
報(bào)表表達(dá)式設(shè)置與前面使用宏中的設(shè)置一致,這里不再重復(fù)。
?
????在集算報(bào)表中提供的兩種處理動(dòng)態(tài)SQL的方式可以很方便地完成類似的任務(wù),宏適合只進(jìn)行簡(jiǎn)單替換的場(chǎng)景,而復(fù)雜的情況,需要一定計(jì)算才能得到最終的SQL語(yǔ)句的場(chǎng)景則需要使用集算腳本(腳本數(shù)據(jù)集),在實(shí)際業(yè)務(wù)中用戶可以根據(jù)情況進(jìn)行選擇。
轉(zhuǎn)載于:https://blog.51cto.com/report5/1590714
總結(jié)
以上是生活随笔為你收集整理的润乾集算报表多样性数据源之动态SQL传递的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php二进制安全的含义
- 下一篇: SQL Server 中关于 @@err