打印时实现特殊分页功能

/*
有表数据如下(数据不包含中文说明部分)。
要求:
打印时候特殊分页,分页的结构是按原来的表编号次序,编号1对应打印第1页第1行,编号2对应打印第2页第1行
编号3对应打印第3页第1行...打完最后一页,再从第1页第2行开始打印。。。效果如下:


已知表的列数据为:表ID,编号, OdID,
未知表的列数据为:序号

怎么样写个存储过程,实现这样的分页。
(提示:以下是61条数据,已经知道一页纸张可以打印6行数据,可以不用考虑列OdID,只要能算出如下的序号数据即可实现。)


第1行:
表ID 编号 OdID 序号
--------------------------
16070 1 1 1 ---第1页第1行
16071 2 2 7 ---第2页第1行
16072 3 3 13 ---第3页第1行
16073 4 4 19 ---第4页第1行
16074 5 5 25 ---....
16075 6 6 31
16076 7 1 37
16077 8 2 43
16078 9 3 49
16079 10 4 55
16080 11 5 61 ---第11页第1行
第2行:
16081 12 6 2 ---第1页第2行
16082 13 1 8 ---第2页第2行
16083 14 2 14 ---第3页第2行
16084 15 3 20
16085 16 4 26
16086 17 5 32
16087 18 6 38
16088 19 1 44
16089 20 2 50
16090 21 3 56 ---第10页第2行
第3行:
16091 22 4 3
16092 23 5 9
16093 24 6 15
16094 25 1 21
16095 26 2 27
16096 27 3 33
16097 28 4 39
16098 29 5 45
16099 30 6 51
16100 31 1 57
第4行:
16101 32 2 4
16102 33 3 10
16103 34 4 16
16104 35 5 22
16105 36 6 28
16106 37 1 34
16107 38 2 40
16108 39 3 46
16109 40 4 52
16110 41 5 58
第5行:
16111 42 6 5
16112 43 1 11
16113 44 2 17
16114 45 3 23
16115 46 4 29
16116 47 5 35
16117 48 6 41
16118 49 1 47
16119 50 2 53
16120 51 3 59
第6行:
16121 52 4 6 ---第1页第6行
16122 53 5 12 ---第2页第6行
16123 54 6 18 ---第3页第6行
16124 55 1 24
16125 56 2 30
16126 57 3 36
16127 58 4 42
16128 59 5 48
16129 60 6 54
16130 61 1 60 ---第10页第6行

存储过程:

/*=============特殊的工资条打印分页功能======================
设计:wgh
时间:2007-01
.*/
CREATE PROCEDURE Proc_PrintPageView
@EXEC_Sql nvarchar(4000) --@EXEC_Sql 为查询语句
AS
DECLARE @Sql nvarchar(4000)
DECLARE @PagesSUM int --打印页数
DECLARE @Remainder int --余数
DECLARE @RecordCount int --总记录数
DECLARE @PageRows int --每页打印的记录数
DECLARE @PageNo int --编号
DECLARE @PageCount int --第n页
DECLARE @For int
DECLARE @ForN int
DECLARE @PatternIndex int
--初始化各个变量
SET @PageRows=6
SET @Remainder=0
SET @RecordCount=0
SET @PageNo=0
SET @PageCount=0
SET @For=0
SET @ForN=0
--INSERT INTO 临时表#Temp
CREATE TABLE #Temp(SalaryID int,N int null)
SET @Sql=REPLACE(@EXEC_Sql,'*','SalaryID,null')
SET @Sql='INSERT INTO #Temp '+@Sql
EXECUTE(@Sql)
--计算总记录数、余数、打印页数
SELECT @RecordCount=COUNT(1) FROM #Temp
SET @Remainder=@RecordCount%@PageRows
IF(@Remainder>0)SET @PagesSUM=1
SET @PagesSUM=@PagesSUM+@RecordCount/@PageRows
/*
--调式:
PRINT '@RecordCount='+CAST(@RecordCount AS nvarchar(10))
PRINT '@Remainder='+CAST(@Remainder AS nvarchar(10))
PRINT '@PagesSUM='+CAST(@PagesSUM AS nvarchar(10))
PRINT '@PageRow='+CAST(@PageRow AS nvarchar(10))
PRINT '@PageCount='+CAST(@PageCount AS nvarchar(10))
PRINT '@PageRows='+CAST(@PageRows AS nvarchar(10))
*/
UPDATE #Temp SET
@ForN=CASE WHEN @For=0 THEN @ForN+1 ELSE @ForN END
,@For=CASE WHEN @ForN<=@Remainder AND @For=@PagesSUM-1 THEN 0
WHEN @ForN>@Remainder AND @For=@PagesSUM-2 THEN 0
ELSE @For+1
END
,@PageNo=CASE WHEN @For=1 OR @For=1 THEN @ForN ELSE @PageNo+@PageRows END
,N=@PageNo
--根据实际的情况修改C14,程序也要修改。在程序端打印时调用是这样的,SELECT * FROM EmployeeSalary
-- WHERE ... ORDER BY C14即可实现。
UPDATE A SET A.C14=B.N FROM EmployeeSalary AS A INNER JOIN #Temp AS B ON A.SalaryID=B.SalaryID
DROP TABLE #Temp
GO

打印效果:

将要打印的数据:

attachment.php?aid=35724&noupdate=yes

第1页:

attachment.php?aid=35725&noupdate=yes

第2页:

attachment.php?aid=35726&noupdate=yes

第3页:

attachment.php?aid=35727&noupdate=yes

最后一页:

attachment.php?aid=35728&noupdate=yes

[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7764484/viewspace-895677/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/7764484/viewspace-895677/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值