在报表中,当一列值改变时,也就是出现break时,通常会做一些特殊处理,比如跳过一行、在break之前或之后执行某个procedure、打印小计等等。
不使用Break逻辑
如下例,针对选择的每一个员工,打印该员工的姓名、公司和员工薪水。该例不使用任何break逻辑:
- !****************************
- !An employee list program that uses no break logic
- !****************************
- Begin-Program
- !****************************
- Do List_Employees
- End-Program
- !****************************
- Begin-Heading 2
- !****************************
- Print 'Company' (1,1)
- Print 'Paygroup' (,+2)
- Print 'Emplid' (,+2)
- Print 'Name ' (,+4)
- Print 'Annual Salary' (,+15)
- Print ' ' (2,1)
- End-Heading
- !*****************************************
- Begin-Procedure List_Employees
- !*****************************************
- Begin-Select
- B.Company (,1,7)
- B.Paygroup (,+2,8)
- A.Emplid (,+2,8)
- A.Name (,+2,20)
- B.Annual_Rt (,+2,12) Edit $,$$$,$$$.00
- Position (+1)
- From PS_Personal_Data A, PS_Job B
- Where A.Emplid=B.Emplid
- And B.Effdt=(Select Max(D.Effdt) From PS_Job D
- Where D.Effdt<=Sysdate
- And D.Emplid=B.Emplid
- And D.Empl_Rcd=B.Empl_Rcd)
- And B.Effseq = (Select Max(C.Effseq) from PS_Job C
- Where C.Emplid=B.Emplid
- And C.Empl_Rcd = B.Empl_Rcd
- And C.Effdt=B.Effdt)
- Order By B.Company, B.Paygroup, A.Emplid
- End-Select
- End-Procedure
- !****************************
!****************************
!An employee list program that uses no break logic
!****************************
Begin-Program
!****************************
Do List_Employees
End-Program
!****************************
Begin-Heading 2
!****************************
Print 'Company' (1,1)
Print 'Paygroup' (,+2)
Print 'Emplid' (,+2)
Print 'Name ' (,+4)
Print 'Annual Salary' (,+15)
Print ' ' (2,1)
End-Heading
!*****************************************
Begin-Procedure List_Employees
!*****************************************
Begin-Select
B.Company (,1,7)
B.Paygroup (,+2,8)
A.Emplid (,+2,8)
A.Name (,+2,20)
B.Annual_Rt (,+2,12) Edit $,$$$,$$$.00
Position (+1)
From PS_Personal_Data A, PS_Job B
Where A.Emplid=B.Emplid
And B.Effdt=(Select Max(D.Effdt) From PS_Job D
Where D.Effdt<=Sysdate
And D.Emplid=B.Emplid
And D.Empl_Rcd=B.Empl_Rcd)
And B.Effseq = (Select Max(C.Effseq) from PS_Job C
Where C.Emplid=B.Emplid
And C.Empl_Rcd = B.Empl_Rcd
And C.Effdt=B.Effdt)
Order By B.Company, B.Paygroup, A.Emplid
End-Select
End-Procedure
!****************************
该SQR报表输出如下:
使用Print命令的On-Break选项
当某个输出字段的值改变时,On-Break选项会触发指定的操作。可以指定 On-Break 选项的一些限定词(qualifier),这些限定词定义了当break出现时要采取的操作。使用最频繁的限定词是Print(不要与Print命令搞混了)。Print 限定词是On-Break选项的默认限定词。当制定On-Break选项时不必指定该限定词。当使用On-break 选项的 Print 限定词时,可以指定 break 字段何时被打印或不被打印:
- Always 总是打印Break 字段。
- Change 只有当break字段的值改变时才打印。默认为Change。
- Change/Top-Page 1.当break字段的值改变时打印 2.在每一页的顶部时打印
- Never break字段永远不打印
如下例:
- !****************************
- !Using break logic in the employee list program
- !****************************
- Begin-Program
- !****************************
- Do List_Employees
- End-Program
- !****************************
- Begin-Heading 2
- !****************************
- Print 'Company' (1,1)
- Print 'Paygroup' (,+2)
- Print 'Emplid' (,+2)
- Print 'Name ' (,+4)
- Print 'Annual Salary' (,+15)
- Print ' ' (2,1)
- End-Heading
- !*****************************************
- Begin-Procedure List_Employees
- !*****************************************
- Begin-Select
- ! We use the On-Break option below:
- B.Company (,1,7) On-Break Print=Change/Top-Page Skiplines=1
- B.Paygroup (,+2,8)
- A.Emplid (,+2,8)
- A.Name (,+2,20)
- B.Annual_Rt (,+2,12) edit $,$$$,$$$.00
- Position (+1)
- From PS_Personal_Data A, PS_Job B
- Where A.Emplid=B.Emplid
- And B.Effdt=(Select Max(D.Effdt) From PS_Job D
- Where D.Effdt<=Sysdate
- And D.Emplid=B.Emplid
- And D.Empl_Rcd=B.Empl_Rcd)
- And B.Effseq = (Select Max(C.Effseq) from PS_Job C
- Where C.Emplid=B.Emplid
- And C.Empl_Rcd = B.Empl_Rcd
- And C.Effdt=B.Effdt)
- Order By B.Company, B.Paygroup, A.Emplid
- End-Select
- End-Procedure
- !****************************
!****************************
!Using break logic in the employee list program
!****************************
Begin-Program
!****************************
Do List_Employees
End-Program
!****************************
Begin-Heading 2
!****************************
Print 'Company' (1,1)
Print 'Paygroup' (,+2)
Print 'Emplid' (,+2)
Print 'Name ' (,+4)
Print 'Annual Salary' (,+15)
Print ' ' (2,1)
End-Heading
!*****************************************
Begin-Procedure List_Employees
!*****************************************
Begin-Select
! We use the On-Break option below:
B.Company (,1,7) On-Break Print=Change/Top-Page Skiplines=1
B.Paygroup (,+2,8)
A.Emplid (,+2,8)
A.Name (,+2,20)
B.Annual_Rt (,+2,12) edit $,$$$,$$$.00
Position (+1)
From PS_Personal_Data A, PS_Job B
Where A.Emplid=B.Emplid
And B.Effdt=(Select Max(D.Effdt) From PS_Job D
Where D.Effdt<=Sysdate
And D.Emplid=B.Emplid
And D.Empl_Rcd=B.Empl_Rcd)
And B.Effseq = (Select Max(C.Effseq) from PS_Job C
Where C.Emplid=B.Emplid
And C.Empl_Rcd = B.Empl_Rcd
And C.Effdt=B.Effdt)
Order By B.Company, B.Paygroup, A.Emplid
End-Select
End-Procedure
!****************************
输出结果如下:
1.当break字段的值改变时打印:
2.在每一页的顶部时打印
在上面的例子中,我将Company字段作为一个break字段,对其使用On-Break选项。除了Pritn限定词外,还是用了另外一个限定词Skiplines。该限定词指定当出现break时应该跳过多少行。
使SQR程序API Ware
要想在进程调度器中执行SQR程序,且又要使进程调度器能够更新SQR程序的运行状态,就必须要使SQR程序API Ware。也就是说必须在SQR成添加一些能够将SQR程序的状态返回给进程调度器的代码,从而让Process Monitor能够反应程序的当前状态。可以通过#Include命令包含PeopleSoft 自带的一些SQC文件。如上例,因为没有#include任何SQC文件,所以在进程监控器中出现如下结果:
可见程序已经成功Posted,但是状态却为Error。
修改TEST10B.SQR程序:
- !****************************
- !TEST10B.SQR
- !Using break logic in the employee list program
- !****************************
- <span style="color: rgb(255, 0, 0);">#Include 'setenv.sqc' !Set environment</span>
- <span style="color: rgb(255, 0, 0);">begin-setup
- #Include 'setupdb.sqc'
- end-setup</span>
- Begin-Program
- <span style="color: rgb(255, 0, 0);">Do Stdapi-Init</span>
- Do List_Employees
- <span style="color: rgb(255, 0, 0);">Do Stdapi-Term</span>
- End-Program
- !****************************
- Begin-Heading 2
- !****************************
- Print 'Company' (1,1)
- Print 'Paygroup' (,+2)
- Print 'Emplid' (,+2)
- Print 'Name ' (,+4)
- Print 'Annual Salary' (,+15)
- Print ' ' (2,1)
- End-Heading
- !*****************************************
- Begin-Procedure List_Employees
- !*****************************************
- Begin-Select
- ! We use the On-Break option below:
- B.Company (,1,7) On-Break Print=Change/Top-Page Skiplines=1
- B.Paygroup (,+2,8)
- A.Emplid (,+2,8)
- A.Name (,+2,20)
- B.Annual_Rt (,+2,12) edit $,$$$,$$$.00
- Position (+1)
- From PS_Personal_Data A, PS_Job B
- Where A.Emplid=B.Emplid
- And B.Effdt=(Select Max(D.Effdt) From PS_Job D
- Where D.Effdt<=Sysdate
- And D.Emplid=B.Emplid
- And D.Empl_Rcd=B.Empl_Rcd)
- And B.Effseq = (Select Max(C.Effseq) from PS_Job C
- Where C.Emplid=B.Emplid
- And C.Empl_Rcd = B.Empl_Rcd
- And C.Effdt=B.Effdt)
- Order By B.Company, B.Paygroup, A.Emplid
- End-Select
- End-Procedure
- !****************************
- <span style="color: rgb(255, 0, 0);">#Include 'datetime.sqc' !Routines for date and time formatting
- #Include 'stdapi.sqc'</span>
!****************************
!TEST10B.SQR
!Using break logic in the employee list program
!****************************
#Include 'setenv.sqc' !Set environment
begin-setup
#Include 'setupdb.sqc'
end-setup
Begin-Program
Do Stdapi-Init
Do List_Employees
Do Stdapi-Term
End-Program
!****************************
Begin-Heading 2
!****************************
Print 'Company' (1,1)
Print 'Paygroup' (,+2)
Print 'Emplid' (,+2)
Print 'Name ' (,+4)
Print 'Annual Salary' (,+15)
Print ' ' (2,1)
End-Heading
!*****************************************
Begin-Procedure List_Employees
!*****************************************
Begin-Select
! We use the On-Break option below:
B.Company (,1,7) On-Break Print=Change/Top-Page Skiplines=1
B.Paygroup (,+2,8)
A.Emplid (,+2,8)
A.Name (,+2,20)
B.Annual_Rt (,+2,12) edit $,$$$,$$$.00
Position (+1)
From PS_Personal_Data A, PS_Job B
Where A.Emplid=B.Emplid
And B.Effdt=(Select Max(D.Effdt) From PS_Job D
Where D.Effdt<=Sysdate
And D.Emplid=B.Emplid
And D.Empl_Rcd=B.Empl_Rcd)
And B.Effseq = (Select Max(C.Effseq) from PS_Job C
Where C.Emplid=B.Emplid
And C.Empl_Rcd = B.Empl_Rcd
And C.Effdt=B.Effdt)
Order By B.Company, B.Paygroup, A.Emplid
End-Select
End-Procedure
!****************************
#Include 'datetime.sqc' !Routines for date and time formatting
#Include 'stdapi.sqc'