crystal report排序功能的实现

原创 2004年08月13日 09:18:00

整个报表由三部分组成

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

?

?

CrystalReport for vs2010 水晶报表的发布问题以及捆绑发布

一、狀況描述:   在使用VS2010開發的帶CrystalReport 的網站發佈時,開啟帶CrystalReport 功能的畫面會報錯。 二、解決方案:   选择和下载一个安装包:       S...
  • fengxu511
  • fengxu511
  • 2013年09月13日 09:35
  • 1406

Crystal Reports 公式、运行总计字段、自定义函数、对记录进行在筛选

效果:得出 EX2PB07W01 的 20:00 到 07:00 的最小值,最大值
  • tiz198183
  • tiz198183
  • 2017年01月09日 11:17
  • 734

一个crystal report水晶报表无法实现的多数据源计算

项目背景:用户新上线了绩效考核系统,原本的工资算法需要相的调整。以前的工资表主要由员工的基本工资计算得到,基本工资存储在财务管理软件的MSSQL数据库中。新的工资表由基本工资+绩效工资组成。绩效工资由...
  • u012388497
  • u012388497
  • 2014年01月13日 13:54
  • 1605

ReportViewer报表模版中显示图片

在做项目中。我们可能会经常遇到需要在报表中显示图片的需求。如果说这个图片是个固定的,只是作为一个报表的标题或者logo之类的。那么就很简单,可是对于那些保存在数据库中或者通过程序生成的一个内存中的图片...
  • pj386960300
  • pj386960300
  • 2013年09月01日 15:29
  • 923

CrystalReport的分页与打印

水晶报表CrystalReport的分页与打印 (2011-10-13 09:23:33)转载▼标签: 水晶报表crystal打印分页it 分类: 技术   水晶报表是一个方便的报表设计与生成工具,...
  • zhaohongx
  • zhaohongx
  • 2014年12月30日 09:16
  • 827

Crystal Report 分栏功能详解

MultipleColumns 如果有一个报表需求,需要我们做一张类似于下面的报表,我们该怎么在Crystal Reports 里实现呢?首先我们需要分析一下这张报表有什么特别,仔细一看原来是一页上...
  • Samuelxiaopeng
  • Samuelxiaopeng
  • 2013年12月06日 21:22
  • 514

[Crystal]crystal与osilator晶体区别与使用

问题描述:MCU, MPU,CPU的使用都离不开晶振的问题,因为PLL要用到,晶振相当于MCU的心跳吧。之前也遇到过不同的晶振的使用情况,MCU最小系统一般都会要求外接一个晶振,不把晶振直接做到IC内...
  • suxiang198
  • suxiang198
  • 2015年07月09日 08:20
  • 818

Crystal Report水晶报表碰到的一些纠结问题

1.插入PNG文件时,透明的背景会变成黑色.试了矢量图WMF文件,是可以正常显示的,不过毕竟得到矢量图比较困难.   后来找到个方法,就是把JPG图片放在子报表里,调整子报表在父报表的位置并且保持JP...
  • sui84
  • sui84
  • 2014年01月17日 16:51
  • 2249

敏捷开发系列之旅 第四站(透明的Crystal水晶方法)

上一站,我们简单的谈了谈FDD,了解了什么是特征驱动开发,以及它核心的整体模型,在我看来,它是一种有效但有一些复杂的敏捷开发方法,对于小团队来说,实施起来有些困难。然而,今天我们要认识的是一种新的开发...
  • happylee6688
  • happylee6688
  • 2014年03月31日 00:56
  • 7240

Crystal (晶振)参数确定方法

Crystal (晶振) 简介 晶振是一种石英产品,使用晶振的电路可以分为石英晶体谐振器和石英晶体振荡器。 振荡器是由谐振器与IC(也可以是三极管/电阻/电容等)组成,石英晶体振荡器相当于用电阻、...
  • lovebeyond1014
  • lovebeyond1014
  • 2014年08月26日 13:25
  • 1773
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:crystal report排序功能的实现
举报原因:
原因补充:

(最多只允许输入30个字)