整個報表由三部分組成
xxxx.asp //用來接收函數及從數據庫中取值,基本上每個報表都有一個該文件,其中調用cyheader.asp及cyfooter.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,強制變量聲明
做以下工作:
1.cyheader.asp在server端腳本增加以下部分:
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.asp的table之外(最上面),增加以下內容
?????? 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
%>
3.cyfooter.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 'sf在sortfields中的位置,如果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 'sf在sortfields中的位置,如果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
?
?