在SQR中使用Break逻辑


在报表中,当一列值改变时,也就是出现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
!****************************
该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
!****************************

输出结果如下:

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
!****************************

#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'


运行结果如下:








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值