对于N-Up类型的数据窗口,其序号列的布局一直是大家热衷于讨论的话题。
假设有如下3栏数据
数据 数据 数据
=========================================================================================
A B C
D E F
G H I
J K L
M N O (第一页)
P Q R
S T U
V W X
Y (第二页)
如果需要增加序号列,有如下三种规则。任何一种规则都必须分别添加3个计算列,假设分别为xh1,xh2,xh3
(1)从左到右,由上及下
这种排序规则比较简单,和N-Up默认的数据排序规则是一致的,3个计算列的具体expression写法分别为:
<1> xh1:getrow() + 0
<2> xh2:getrow() + 1
<3> xh3:getrow() + 2
规律就是对应第N栏的序号列的表达式为:getrow() + N - 1
增加序号列后的数据如下:
序号 数据 序号 数据 序号 数据
=========================================================================================
1 A 2 B 3 C
4 D 5 E 6 F
7 G 8 H 9 I
10 J 11 K 12 L
13 M 14 N 15 O (第一页)
16 P 17 Q 18 R
19 S 20 T 21 U
22 V 23 W 24 X
25 Y (第二页)
(2)由上及下,从左到右
这种排序规则是开发人员遇得比较多的需求,这种需求下,3个计算列的具体expression写法分别为:<1> xh1:(getrow() - 1) / long(describe("datawindow.rows_per_detail")) + 1
<2> xh2:1 * ceiling(rowcount() / long(describe("datawindow.rows_per_detail"))) - sign(mod(rowcount(), long(describe("datawindow.rows_per_detail")) )) * (1 - mod(rowcount(), long(describe("datawindow.rows_per_detail")) )) + (getrow() - 1) / long(describe("datawindow.rows_per_detail")) + 1
<3> xh3:2 * ceiling(rowcount() / long(describe("datawindow.rows_per_detail"))) - sign(mod(rowcount(), long(describe("datawindow.rows_per_detail")) )) * (2 - mod(rowcount(), long(describe("datawindow.rows_per_detail")) )) + (getrow() - 1) / long(describe("datawindow.rows_per_detail")) + 1
规律就是对应第N栏的序号列的表达式为:(N - 1) * ceiling(rowcount() / long(describe("datawindow.rows_per_detail"))) - sign(mod(rowcount(), long(describe("datawindow.rows_per_detail")) )) * ((N - 1) - mod(rowcount(), long(describe("datawindow.rows_per_detail")) )) + (getrow() - 1) / long(describe("datawindow.rows_per_detail")) + 1
增加序号列后的数据如下:
序号 数据 序号 数据 序号 数据
=========================================================================================
1 A 10 B 18 C
2 D 11 E 19 F
3 G 12 H 20 I
4 J 13 K 21 L
5 M 14 N 22 O (第一页)
6 P 15 Q 23 R
7 S 16 T 24 U
8 V 17 W 25 X
9 Y (第二页)
(3)由上及下,从左到右,且同一页面不同栏目之间的序号必须连续
当开发人员按照客户需求,将序号列的显示规则更改为(2)所示方式后,客户往往会提出新的要求:打印出来的数据,存在多页纸的情况下,同一张纸中的序号,左右不连续。这种需求下,3个计算列的具体expression写法分别为:
<1> xh1:(getrow() - first(getrow() for page)) / long(describe("datawindow.rows_per_detail")) + first(getrow() for page)
<2> xh2:1 * ceiling(count(1 for page) / long(describe("datawindow.rows_per_detail"))) - sign(mod(count(1 for page), long(describe("datawindow.rows_per_detail")) )) * (1 - mod(count(1 for page), long(describe("datawindow.rows_per_detail")) )) + (getrow() - first(getrow() for page)) / long(describe("datawindow.rows_per_detail")) + first(getrow() for page)
<3> xh3:2 * ceiling(count(1 for page) / long(describe("datawindow.rows_per_detail"))) - sign(mod(count(1 for page), long(describe("datawindow.rows_per_detail")) )) * (2 - mod(count(1 for page), long(describe("datawindow.rows_per_detail")) ))+ (getrow() - first(getrow() for page)) / long(describe("datawindow.rows_per_detail")) + first(getrow() for page)
规律就是对应第N栏的序号列的表达式为:(N - 1) * ceiling(count(1 for page) / long(describe("datawindow.rows_per_detail"))) - sign(mod(count(1 for page), long(describe("datawindow.rows_per_detail")) )) * ((N - 1) - mod(count(1 for page), long(describe("datawindow.rows_per_detail")) )) + (getrow() - first(getrow() for page)) / long(describe("datawindow.rows_per_detail")) + first(getrow() for page)
增加序号列后的数据如下:
序号 数据 序号 数据 序号 数据
=========================================================================================
1 A 6 B 11 C
2 D 7 E 12 F
3 G 8 H 13 I
4 J 9 K 14 L
5 M 10 N 15 O (第一页)
16 P 20 Q 23 R
17 S 21 T 24 U
18 V 22 W 25 X
19 Y (第二页)