[讨论散分]打印时实现特殊分页功能

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

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

我想了1天多,已经想到一个的解决方法,但还希望有朋友帮忙找更方便的方法,顺便放分,呵呵。大家一起想办法。星期1后我会贴出自己的写法。

第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行
*/
...全文
266 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
中国风 2007-01-28
  • 打赏
  • 举报
回复
需要通过临时表来实现
Andy-W 2007-01-28
  • 打赏
  • 举报
回复
问题已经拷定了,拿来分享一下:
查看效果见我的博客:http://wghao.itpub.net/post/22404/257920

/*=============特殊的工资条打印分页功能======================
设计: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

abc_sk 2007-01-27
  • 打赏
  • 举报
回复
sql实现困难

34,837

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧