crystal report排序功能的實現

整個報表由三部分組成

xxxx.asp //用來接收函數及從數據庫中取值,基本上每個報表都有一個該文件,其中調用cyheader.aspcyfooter.asp

cyheader.asp

funcsort.inc

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

?

如果要使原有報表支持排序,經初步研究發現,有多種方法,但是理想中雙擊crystal report中列頭實現排序在crystal report8.5 web版中不易實現。

爲了減少實現排序功能時設計人員的工作量,使其工作量最少。

目前的排序不支持group,只支持正常的record

?

?

使用方法,在要實現排序的報表中:

(1)??? 在頭部引入

(2)??? 插入以下程序段:

addSortField "姓名", "{VIW_RECRUIT_SIMPLY.APPNAME}", 0? '注意此時的SortOrder寫該字段的最初排序類型就行了

addSortField "檔案編號", "{VIW_RECRUIT_SIMPLY.RECORDCODE}", 0??????? '

?

'排序操作

processSort

?

?

實現過程描述如下:

爲了便於排錯,在主控文檔中設置optioin explicite,強制變量聲明

做以下工作:

1cyheader.aspserver端腳本增加以下部分:

public sortfieldcount

sortfieldcount = 0

public sortfields(10,3) '定義排序域名,最多十個

?

?

public SortField,SortDesc,SortOrder

public cSortDesc

?

public defaultSortField,defaultSortOrder,defaultSortDesc

defaultSortField = ""

?

defaultSortOrder = ""

?

public rfindSortField

rfindSortField = -1

?

2.在cyfooter.asptable之外(最上面),增加以下內容

?????? document.title = "<%=pagetitle%>";

?

<%

if (sortfieldcount > 0) then

%>

?????? currentSortField = "<%=SortField%>";

?????? currentSortOrder = "<%=SortOrder%>";

?????? currentSortDesc? = "<%=SortDesc%>";

?

?

//設置不同的排序字段並重新提交頁面的方法

function submitSort(sortfield, sortorder, sortdesc){

?????? window.onunload = null;

?????? var para= "SortField=" + encodeURIComponent (sortfield) + "&SortOrder=" + sortorder + "&SortDesc=" + escape(sortdesc);

?????? var url = location.href;

?????? if (url.substring(url.indexOf('?') + 1) != para) {

????????????? document.sortform.action= "<%=aspfilename%>?" + para;

????????????? //alert(document.sortform.action);

????????????? document.sortform.submit();

?????? }

}

?

<%

end if

%>

3cyfooter.asp中增加輸出排序按鈕的程序段。

如果sortfieldcount大於0,則輸出隱藏的域及排序按鈕,如果沒有設置,沒不輸出隱藏域及排序按鈕。

增加程序段如下:

??????

?

<%

if sortfieldcount > 0 then

?????? dim bdesc,i

?

%>

?????? 當前排序:<%=cSortDesc%>

?????? <%

?????? dim fe

?????? For Each fe in Request.Form

?????? %>

??????

?????? <%Next

?????? for i = 1 to sortfieldcount

????????????? bdesc = "" & sortfields(i,1) & SortDir2Desc(sortfields(i, 3))

????????????? %>

?????????????

????????????? <%

?????? next

end if

%>

?????

4.新增function.inc函數庫中增加如下函數

?

/*

1.NULL 關鍵字的支持,用來支持不排序情況

2.對於""無關鍵字的支持,此時分析crystal report中的自帶的sort order

3.支持多字段排序

*/

?

?

/*報表排序系列函數

*/

?

//獲得第ind個排序字段的名稱及方向

function getSortField(rpt, <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />ind){

?????? rsf = "";

?????? rsflen = rpt.RecordSortFields.Count;

?????? //rw("報表的排序字段數爲:" + rsflen);

?????? if ((rsflen > 0) && (ind >= 1) && (ind <= rsflen)) {

????????????? rsf = rpt.RecordSortFields.Item(ind).Field.Name + "," + rpt.RecordSortFields.Item(ind).SortDirection;

?????? }

?????? return rsf;

}

?

//獲得第ind個排序字段的名稱

function getSortFieldName(rpt, ind){

?????? rsf = "";

?????? rsflen = rpt.RecordSortFields.Count;

?????? if ((rsflen > 0) && (ind >= 1) && (ind <= rsflen)) {

????????????? rsf = rpt.RecordSortFields.Item(ind).Field.Name;

?????? }

?????? return rsf;

}

?

//獲得第ind個排序字段的排序方向

function getSortFieldDir(rpt, ind){

?????? rsf = -1;

?????? rsflen = rpt.RecordSortFields.Count;

?????? if ((rsflen > 0) && (ind >= 1) && (ind <= rsflen)) {

????????????? rsf = rpt.RecordSortFields.Item(ind).SortDirection;

?????? }

?????? return rsf;

}

?

//只支持按一列進行排序

//rpt -- 要排序的報表

//fn -- FieldName 排序的列名

function setSortField(rpt,fn,order){

?????? clearSortField(rpt);

?????? addSortField(rpt,fn,order);

}

?

function clearSortField(rpt){

?????? rsflen = rpt.RecordSortFields.Count;

?????? for (i = rsflen; i >= 1; i--){

????????????? rpt.RecordSortFields.Delete(i); //刪除已有排序

?????? }

}

?

//按新的排序方法進行排序,原有的主排序列則變爲次排序列,原次排序列變爲三排序列,依次類推

//rpt -- 要排序的報表

//fn -- FieldName 排序的列名

//CRSortDirection.crAscendingOrder

function addSortField(rpt ,fn ,order){

?????? var f = getField(rpt, fn);

?????? if (f != null){

????????????? rpt.RecordSortFields.Add(f, order); //向排序表中的增加一列

?????? }

}

?

//從報表中查找fn對應的field

//如果不存在,就去

function getField(rpt,fn){

?????? //遍歷到該報表中數據表

?????? var i;

?????? var rf = null;

?????? var tlen = rpt.Database.Tables.Count;

?????? for (i =1; i <= tlen ; i++){

????????????? //遍歷所有字段,找出與fn相同的字段

????????????? flen = rpt.Database.Tables.Item(i).Fields.Count;

????????????? for (j =1; j <= flen ; j++){

???????????????????? //rw(rpt.Database.Tables.Item(i).Fields.Item(j).Name);

???????????????????? if (rpt.Database.Tables.Item(i).Fields.Item(j).Name == fn) {

??????????????????????????? //rw("兩者相等");

??????????????????????????? rf = rpt.Database.Tables.Item(i).Fields.Item(j); //返回該字段

??????????????????????????? return rf;

???????????????????? }

????????????? }

?????? }

?????? return rf; //返回undefined

}

?

//如果sortdir<>"1",返回0

function SortDir2Int(sortdir){

?????? var so = 0;

?????? if (sortdir == 1){

????????????? so = 1;

?????? }

?????? return so;

}

?

function SortDir2Desc(sortdir){

?????? var sod = "正向排序▲";

?????? if (sortdir == 1){

????????????? sod = "逆向排序▼";

?????? }

?????? return sod;

}

?

function contrary(sortdir){

?????? var so = 1;

?????? if (sortdir == 1){

????????????? so = 0;

?????? }

?????? return so;

}

?

function ddfindSortField(sf){

?????? var ind,i;

?????? //dim ind 'sfsortfields中的位置,如果sf不在sortfields中,則返回-1

?????? ind = -1;

?????? for (i = 1; i <= sortfieldcount; i++){

????????????? //rw("sortfields(" & CStr(i) + ",2)=[" & sortfields[i][2] + "]");

????????????? //rw("sf=[" & sf & "]");

????????????? if (sortfields(i, 2) = sf){

???????????????????? ind = i;

???????????????????? return ind;

????????????? }

?????? }

?????? //rfindSortField = ind

?????? return ind;

}

?

sub processSort

?

?????? 'if (sortfieldcount < 1) then

?????? '?? end sub

?????? 'end if

??????

'begin sort

'================================================================================

?????? 'URL的參數中讀取是否設置排序

?????? '如果該參數存在,則按給定的參數進行排序

?????? SortField = Request.QueryString("SortField")

?????? SortOrder = CInt(Request.QueryString("SortOrder"))

?????? SortDesc = Request.QueryString("SortDesc")

?????? '排序的描述

?????? 'rw "Request.QueryString('SortField')" & SortField

?????? if (SortField = "") then '如果沒有值則讀取默認值

????????????? SortField = defaultSortField

????????????? SortOrder = defaultSortOrder

????????????? SortDesc = defaultSortDesc

?????? end if

?????? dim sFD

??????

?????? if (SortField = "") then '如果沒有值,且也無默認值,則對空值進行處理

????????????? '2.對於""無關鍵字的支持,此時分析crystal report中的自帶的sort order

????????????? sFD = getSortFieldName(Session("oRpt"), 1)

?

????????????? if (sFD = "") then

???????????????????? SortDesc = " 不進行排序 "

????????????? else

???????????????????? findSortField sFD

?

???????????????????? if (rfindSortField = -1) then

??????????????????????????? cSortDesc = " crystal report 內置的排序 "

???????????????????? else

??????????????????????????? SortField = sFD

??????????????????????????? SortOrder = getSortFieldDir(Session("oRpt"), 1)

??????????????????????????? SortDesc = sortfields(rfindSortField, 1)

??????????????????????????? cSortDesc = "" & SortDesc & SortDir2Desc(SortOrder)

??????????????????????????? addSortField SortDesc, sFD, contrary(SortOrder)

???????????????????? end if

????????????? end if

?????? else

????????????? '設置當前排序的顯示內容

????????????? cSortDesc = "" & SortDesc & SortDir2Desc(SortOrder)

?

????????????? if (SortField = "{NULL}") then

???????????????????? clearSortField Session("oRpt")

???????????????????? if (SortDesc = "") then

??????????????????????????? SortDesc = " 不進行排序 "

???????????????????? end if

????????????? else

???????????????????? '如果設置了排序按鈕的數量,將要根據當前排序字段調整排序按鈕的類型

???????????????????? 'contrary SortOrder=1,返回0,否則返回1

???????????????????? addSortField SortDesc, SortField, contrary(SortOrder)

?

???????????????????? if (sortfield <> "") then

???????????????????? ? setSortField? Session("oRpt"), sortfield , SortDir2Int(SortOrder)

???????????????????? end if

????????????? end if

?

?????? end if

'================================================================================

'end sort

?

end sub

?

'添加排序列

'sortdesc, 排序的按鈕名稱及描述 sortdesc"身份證",則按鈕顯示“身份證正向排序”或“身份證逆向排序”

'sortfield, 排序的字段全名,參見Crystal Report中的字段名稱,形如{table.field}

'sortorder 排序列方向 0,正向排序? 1,逆向排序

sub addSortField(sd, sf, so)

?????? dim sfc

?????? sfc = sortfieldcount

?????? findSortField? sf

?????? if (rfindSortField = -1) then '如果sf不在sortfields中,則新增排序按鈕

????????????? sortfieldcount = sortfieldcount + 1

????????????? if (sortfieldcount > 9) then

????????????? ?? exit sub

????????????? end if

????????????? sfc = sortfieldcount

????????????? sortfields(sfc, 1) = sd

????????????? sortfields(sfc, 2) = sf

????????????? sortfields(sfc, 3) = so

?????? else '如果已經存在,則用so更新sortfields(i, 3)

????????????? sortfields(rfindSortField, 3) = so

?????? end if

?????? Response.flush

end sub

?

?

sub findSortField(sf)

?????? dim i

?????? dim ind 'sfsortfields中的位置,如果sf不在sortfields中,則返回-1

?????? ind = -1

?????? for i = 1 to sortfieldcount

????????????? if (sortfields(i, 2) = sf) then

???????????????????? ind = i

???????????????????? exit for

????????????? end if

?????? next

?????? rfindSortField = ind

end sub

?

sub printSortFields

?????? dim i

?????? for i = 1 to sortfieldcount

????????????? rw "sortfields(" & CStr(i) & ")=[" & sortfields(i, 1) & "],[" & sortfields(i, 2) & "],[" & sortfields(i, 3) & "]"

?????? next

end sub

?

?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章