tcbs sqr之转睡眠户_sqr示例学习笔记_报表report

#define addtlsetup
#include 'Rptstub.lib'
#include '{libpath}tkit_batchstartup.inc'

 --begin-setup必须是程序的第一个节
 --begin-setup节控制整个程序的整体特征

 --begin-setup节包含如下命令
  -- ask
  --begin-sql(此命令也用在begin-procedure节中)
  --create-array
  --declare-chart
  --declare-image
  --declare-layout
  --declare-report 它为一个输出文件定义输出格式属性
  --declare-printer
begin-setup
   Declare-Layout Batch-Land --batch-land为输出格式的名字
     rientation=Landscape --是横向或纵向打印页,landscape为模向打印,而portrait为纵向打印页
     Left-Margin=0 --left-margin指定在页左边LIU出的空白区大小
     Top-Margin=0 --同上理,为页上方LIU出的空白区大小
     Max-Lines=60 --max-lines为一页打印的最大行数.如果指定了page-depth或bottom-margin,此参数不可用
     Max-Columns=170 --一行中最大行数
   End-Declare
end-setup



-- begin-heading节
-- !print命令,加上!符号为何义,编译指标吗,起什么作用
--一个sqr程序可包含多个begin-heading节或者其它的节,同理哟
-- begin-heading 4表示每个页面首部保LIU的行数
Begin-Heading 4 name = dormHeading    --name指定与此heading节相关联的名字
  !Print '银行:' (2,1)
  !Print &BankOrg (0, +4)

  --'转睡眠户清单' 为print要打印的信息
  --(2,65)设置当前位置为第2行,第65列
  -- bold center为对打印内容的格式化命令
  print '转睡眠户清单' (2,65)  BOLD  center  --print将数据输出到页面指定位置
  !Print '提交日期:' (0, 120)
  !Print &FmtdEffDate (0, +2)
 

   -- position (+2,25) 设置位置向下移动2行,在第25列
  print '─' (+1,2,84) fill --fill命令为按照打印位置和长度的指示,用指定字符或字符串填充页面
                           -- print '*' (1,1,79) fill 用 *填充行
  position (+1)     -- position(+1)即为从当前位置向下移动一行,上一行信息为:----------------
  print  '机构名称:达州市商业银行' (,2)    --(,2)表示何义???      猜测,前为当前行,
  Print '提交日期:' (, 146)
  Print &FmtdEffDate (, +2) --&fmtdeffdate为变量吧,这个变量是从哪儿传递进来的,如何与SQR进行交互通讯呢


  
    --let将一个表达式的值FU给一个字符串,数字,日期或者列表变量 ,$开头表示为变量
  Let $Global-HaveIWrittenAPage = 'Y'
End-Heading --end-heading指示heading节结束


--此begin-heading节与上面的begin-heading节是如何控制SQL显示结果的呢?没太明白
Begin-Heading 4 name = iactHeading    
  !Print '银行:' (2,1)
  !Print &BankOrg (0, +4)
  print '转久悬户清单' (2,65)  BOLD  center
  !Print '提交日期:' (0, 120)
  !Print &FmtdEffDate (0, +2)  

  print '─' (+1,2,84) fill
  position (+1)     --表示换行吧
  print  '机构名称:达州市商业银行' (,2)         
  Print '提交日期:'  (, 146)
  Print &FmtdEffDate (, +2) -- ,++2表示从当前行的当前行再右移2个列

   --$Global-HaveIWrittenAPage变量为何?从哪儿来,用于何方
  Let $Global-HaveIWrittenAPage = 'Y'
End-Heading

Begin-Heading 4 name = errorHeading    
  !Print '银行:' (2,1)
  !Print &BankOrg (0, +4)
  print '转睡眠户和久悬户错误清单' (2,65)  BOLD  center
  !Print '提交日期:' (0, 120)
  !Print &FmtdEffDate (0, +2) 
 
  print '─' (+1,2,84) fill
  position (+1)     
  print  '机构名称:达州市商业银行' (,2)         
  Print '提交日期:'  (, 146)
  Print &FmtdEffDate (, +2)

  Let $Global-HaveIWrittenAPage = 'Y'
End-Heading


 -- begin-procedure 开始一个过程。过程是SQR功能最强部分,它提供模块化FUNCTION和标准执行控制
 ! 开头表示注SHI信息
 -- osi-main为过程的名字
begin-procedure OSI-Main
!alter-report heading = myHeading !改变页眉


//do 调用某个指定的过程
// do 过程名称 [(参数1,参数2,...)]
//此处的参数指定了要传递给过程的参数,就是下述的$quenbr等
//用户可以使用参数如$quenbr向过程传递值或从过程接收值,输出输入两个方向
// do命令的一个字DUAN接收从过程返回的值,冒号表示是返回值,即是由过程返回的值
Do Sel-Parm($QueNbr,$ApplNbr,$QuesubNbr,'RPT',$Rpt)
if isblank($Rpt)
    !let $Rpt = 'no pram'
    !print $Rpt (,10)
    let $Rpt = 'Y'
end-if

Do Sel-Parm($QueNbr,$ApplNbr,$QuesubNbr,'PD',$pd)

// if 根据条件取值,决定是否执行一个命令
//if 逻辑表达式 ,此处为isblank($pd),$pd为上述过程sel-parm的参数值
// if结构
//      if 逻辑表达式
//           sqr_命令
//      else
//           sqr_命令
//      end-if

if  isblank($pd) //isblank要请教下魏源,逻辑表达式

     //move 将一个字DUAN的值移到另一个字DUAN,并可根据需要编辑字DUAN
     //move语法
     // move {src_any_lit|_var|_col}  to dst_any_var [[:$] format_mask|number|money|date]
     //src_any_lit指定任意源列,变量或常量
     //dst_any_var指定目标变量
     // format_mask指定一个可选格式掩码
     // number指示使用当前locale中number-edit-mask的设置来格式化src_any_lit|_var|_col
     // money 指示使用当前locale中money-edit-mask的调协来格式化src_any_lit|_var|_col
     //move 示例
     // move '123456789' to $ssn
     // move $ssn to $ssn xxx-xx-xxxx  -- xxx-xx-xxxx为格式掩码
     //show ' $ssn = ' $ssn.
     //产生如下输出:
     //$ssn = 123-45-6789
     // show 在screen上显示一个或多个变量或常量值。
     // show 语法
     // show 显示屏幕位置
    move &SortedEffDate to $pd
else
    do Make-Date-Sorted($pd)
end-if

// sqr数据元素包括 列,常量,变量

// 列 就是在数据库中定义的字DUAN  &ApplCashBox
//     数据库列或表达式名称由&开头

//常量 包括文本型常量或数字型常量
        文本型常量用单引号括起来,例如:'hello'
    数字型常量是以0到9开头的十进製数,可以有符号或小数点,例如:-54.24,也可以用科学记数法表示,如1.2E5


//变量 是用户所定义和操纵的文本或数字的存储位置
         文本或日期变量以$开头
     数字型变量以#开头
     列表变量以%开头
     标记位置的变量名以@开头,用在begin-document DUAN内标识开始打印位置
move &ApplCashBox to $cab




//begin-sql 开始一个SQL DUAN,此DUAN位于begin-procedure,begin-setup或begin-program节中
//begin-sql 用于开始除SELECT外的其它所有SQL语句。SELECT有它自己的BEGIN-SELECT DUAN
//如果在一个DUAN中包含多个SQL语句,每个语句(除最后一个语句外)都必须用分号结束
//begin-sql 中 存储过程
//                   对于oracle,存储过程是在BEGIN-SQL DUAN中用PL/SQL实现的
           对于某些数据库如ORACLE,在BEGIN-SQL DUAN中使用DDL语句会造成
           dml操作的提交,并RELEASE游标。因此用户必须确认操作以一种
          合适的次序被执行的,否则会造成不可预计的结果
//              oracle pl/sql 对于oracle,pl/sql在begin-sql DUAN中被支持,在每个PL/SQL语句的末尾添加 一个额外的合号。

//begin-sql示例
// 对于oracle pl/sql
// begin-sql
// declare
//varp1 varchar2(25);;
//var2 number(8,2);;
//begin
//varp1:='abc';;
//var2:=1234.56;;
//#v:=var2;;
//end;;
//end sql

//对于ORACLE存储过程
//begin-sql
//begin
//#dept_number:=get_dept_no($dept_name);;
//end;;
//end-sql
begin-sql
begin
OSIBANK.PROC_FROMACTTODORMIACT($QueNbr,$ApplNbr,$QuesubNbr,$pd,$Rpt,$cab,#errNbr,$errmsg,$oramsg);;
end;;
end-sql

!定义报表名称使用的公有变量--开始
!let $dt = datenow()
do Get-The-PostDate($dt)
move $dt to $dt 'YYYYMMDD'
Do Get-Bank-Option('RPTT',$Len)
!定义报表名称使用的公有变量--结束

if #errNbr != 0
    print '执行存储过程出错:' (,10)
    print '错误号:' (+1,10)

    // #errnbr为数字型变量
    print #errNbr (,+1) 
    print '批处理错误信息:' (+1,10)
    print $errmsg (,+1)
    print 'oracle错误信息:' (+1,10)
    print $oramsg (,+1)

    !print $Rpt (+1,10)
    !print $pd (,30)
    !print $cab (,50)

    //$QueApplChkpt 为文本变量
    Let $QueApplChkpt =  $oramsg
    Let $QueApplRc = #errNbr
    Do Final-QueAppl-Update
else
   do selectDorm !查询睡眠户过程  //do 过程名称,此处为过程selectdorm过程,此节过程下面begin-procedure中定义,此过程的概念不同于存储过程,是一个功能逻辑单元
   do selectIact !查询久悬户过程
   do ReportError !执行错误数据报告输出
   Let $QueApplChkpt = 'Report Complete'
   Let $QueApplRc = 0
   Do Final-QueAppl-Update
end-if
end-procedure

Begin-Procedure selectDorm !查询睡眠户过程
alter-report heading = dormHeading !改变页眉 //alter-report 改变报表特有的功能,此处heading=dormheading表示指定begin-heading节的名字,这里的dormheading在上面begin-heading节定义

//use-report 对于有多重报表的程序(何谓多重报表),允许用户在不同报表间切换
//use-report语法
// use-reportr {report_name_lit|_var|_col}
//report_name_lit指定一个报表,使其成为“当前”报表。接下来所有的PRINT和PRINT-DIRECT语句均将数
//                据输出到此报表,直到碰到下一个USE-REPORT命令
// use-report用于指定接下来的报表输出将写入到哪个报表文件中。一个应用可以使用多个USE-REPORT语句以控制多个报表
//  用户可以在DECLARE-REPORT DUAN以及相应的DECLARE-LAYOUT和DECLARE-PRINTER DUAN中指定报表名和报表特性

// use-report示例
// use-report customer_orders
// use-printer-type postscript
//print(1,1) ' customer name: '
//print () $customer_name


// use-procedure修改过程的用法 before-report指定执行第一个生成输出的命令时要执行的过程,例如:用户可以使用此命令生成报表标题
//                             before-page指定每页开始前,在此页第一个输出命令之前执行的过程,例如:它用于建立页的总计
use-procedure before-page = page_setup_dorm !每页开始前使用的过程
let $out=$Len||$dt||'\'|| '总行_转睡眠户清单' ||'.LIS'

//new-report 语法
// new-report {report_file_name_txt_lit|_var|_col}
//执行new-REPORT后,内部页号计数器重置为1
NEW-REPORT $out //关闭当前报表的输出文件,打开一个具有指定名字的新文件

!查看是否有数据
//begin-select是一个DUAN,它从数据库查询是数据并显示到报表,它是一种主要的方式。begin-select DUAN必须在PROCEDURE或BEGIN-PROGRAM节中。
//begin-select语法
//begin-select示例
//begin-select distinct --去除复复查询结果
//city (1,1,30) //(1,1,30)定义这些行的列位置,
//state (0,+2,2) //列名前面不能有空格
//zip (1,+3,6)
//from custlist order by city
//end-select
begin-select
count(*) &rownums_dorm  &rownums_dorm为数据库列或表达式
from OSIBANK.Rpt_TODORMIACT_Process where updDATE = to_date($pd,'yyyy-mm-dd') and ACCTSTATCD ='DORM' and rownum <=1
end-select
    // &rownums_dorm为数据库列或表达式
if  &rownums_dorm = 0            
   print '没有符合条件的数据' (+1,) center !该输出语句不能省略   
else

!查询'DORM'的状态描述
begin-select
acctstatdesc &dormState
from acctstat  where acctstatcd = 'DORM'
end-select

//begin-select end-sql可简单理解为执行oracle sql语句的节
begin-select
  position (+1)
p.ACCTNBR &acctNbr (,2,19)
!p.MJACCTTYPCD   (,27)
!p.MJMIACCTTYPCD (,37)
    move &acctNbr to $acctNbr //把从表中查询的列&acctnbr转移到变量$acctnbr
    do Get-Primary-Name($acctNbr,$dormName) //过程get-primary-name的参数为上述的变量$acctnbr
    print $dormName (,23,30)
substrb(m.MIACCTTYPDESC,1,30) (,55) !(,23)
p.BRANCHORGNBR  (,87,8) ! (,55,8)
p.DUPTYP        (,97,8) !(,65,8)
p.DUPNBR        (,107,18)  !(,75,18) edit 999999999999999999
p.ACCTNOTEBAL &acctNoteBal  (,127,20) edit 9,999,999,999,999.99    !(,95,20)
p.updDATE       (,149,10) edit 'yyyy-mm-dd'              !(,117,10)
!p.ACCTSTATCD    (,129,8)   !(,150)
   print  &dormState   (,161,8)   !(,129,8)
   let #coutner = #coutner + 1
   let #acctNoteBalTotal = #acctNoteBalTotal + &acctNoteBal
  !position (+1)
from OSIBANK.Rpt_TODORMIACT_Process p,OSIBANK.MJMIACCTTYP m where p.MJACCTTYPCD = m.MJACCTTYPCD and p.MJMIACCTTYPCD = m.MIACCTTYPCD and p.updDATE = to_date($pd,'yyyy-mm-dd') and p.ACCTSTATCD ='DORM'
end-select
    print '─' (+1,2,84) fill
    print '总户数:' (+1,2)
    print #coutner (,+1) edit 888,888,888,888
    move 0 to #coutner
    print '本金合计:' (,95)
        print #acctNoteBalTotal (,+1) edit 888,888,888,888.88
        move 0 to #acctNoteBalTotal

end-if
End-Procedure

Begin-Procedure selectIact !查询久悬户过程 
alter-report heading = iactHeading !改变页眉
use-procedure before-page = page_setup_iact !每页开始前使用的过程
let $out=$Len||$dt||'\'|| '总行_转久悬户清单' ||'.LIS'
NEW-REPORT $out

!查看是否有数据
begin-select
count(*) &rownums_iact 
from OSIBANK.Rpt_TODORMIACT_Process where updDATE = to_date($pd,'yyyy-mm-dd') and ACCTSTATCD ='IACT' and rownum <=1
end-select
   
if  &rownums_iact = 0            
    print '没有符合条件的数据' (+1,) center !该输出语句不能省略   
else

!查询'IACT'的状态描述
begin-select
acctstatdesc &iactState
from acctstat  where acctstatcd = 'IACT'
end-select

begin-select
   position (+1)
p.ACCTNBR       &acctNbr_iact (,2,19)
!p.MJACCTTYPCD   &mjAcctTypCD_iact (,27)
!p.MJMIACCTTYPCD &mjmiAcctTypCD_iact (,37)
   move &acctNbr_iact to $acctNbr_iact
   do Get-Primary-Name($acctNbr_iact,$iactName)
   print $iactName (,23,30)
substrb(m.MIACCTTYPDESC,1,30) &mjmiAcctTypCD_iact (,55) !(,23)
p.BRANCHORGNBR  &branchOrgNbr_iact (,87,8) ! (,55,8)
p.DUPTYP        &dupTyp_iact (,97,8) !(,65,8)
p.DUPNBR        &dupNbr_iact  (,107,18)  !(,75,18) edit 999999999999999999
p.ACCTTOTALAMT  &acctTotalAMT_iact (,127,20) edit 9,999,999,999,999.99 !(,95,20)
p.updDATE       &updDate_iact (,149,10) edit 'yyyy-mm-dd' !(,117,10)
!p.ACCTSTATCD    &acctStatCD_iact (,129,8)
   print &iactState (,161,8)   !(,129,8)
   let #coutner_iact = #coutner_iact + 1
   let #acctAmtTotal = #acctAmtTotal + &acctTotalAMT_iact
  !position (+1)
from OSIBANK.Rpt_TODORMIACT_Process p,OSIBANK.MJMIACCTTYP m where p.MJACCTTYPCD = m.MJACCTTYPCD and p.MJMIACCTTYPCD = m.MIACCTTYPCD and p.updDATE = to_date($pd,'yyyy-mm-dd') and p.ACCTSTATCD ='IACT'
end-select
        print '─' (+1,2,84) fill
    print '总户数:' (+1,2)
    print #coutner_iact (,+1) edit 888,888,888,888
    move 0 to #coutner_iact
    print '余额合计:' (,95)
        print #acctAmtTotal (,+1) edit 888,888,888,888.88
        move 0 to #acctAmtTotal

end-if
End-Procedure


//头文件
!该过程可以考虑作为公有部分放入头文件中
Begin-Procedure ReportError  
alter-report heading = errorHeading !改变页眉
use-procedure before-page = error_page_setup !每页开始前使用的过程
let $out=$Len||$dt||'\'||'error_转睡眠户和久悬户.LIS'
NEW-REPORT $out   

begin-select
   position (+1)
acctnbr &acctNbr_error (,2)
batchactvmsg (,25)
batchoraclemsg (,100)
   !position (+1)
from osibank.queapplerror where quenbr = $QueNbr and applnbr = $ApplNbr and quesubnbr = $QueSubNbr
!from osibank.queapplerror where quenbr = 1708 and applnbr = 366 and quesubnbr = 4
end-select

End-Procedure

begin-procedure page_setup_dorm       
    print '─' (1,2,84) fill
          position (+1)
    print '账号' (,2,19)   
    !print '产品大类' (,27)
    print '户名' (,23,30)
    print '产品小类' (,55,30) !(,23,30)
    print '机构号'  (,89,6) !(,57,6)
    print '证件类型' (,97,8) !(,65,8)
    print '证件号码' (,107,8) !(,117,8)
    print '本金'  (,143,4) !(,111,4)
    print '日期'  (,155,4) !(,123,4)
    print '账户状态' (,161,8) !(,129,8) 
        print '─' (+1,2,84) fill
    !position (+1)  
end-procedure


begin-procedure page_setup_iact       
    print '─' (1,2,84) fill
          position (+1)
    print '账号' (,2,19)   
    !print '产品大类' (,27)
    print '户名' (,23,30)
    print '产品小类' (,55,30) !(,23,30)
    print '机构号' (,89,6) !(,57,6)
    print '证件类型' (,97,8) !(,65,8)
    print '证件号码' (,107,8) !(,117,8)
    print '余额' (,143,4) !(,111,4)
    print '日期' (,155,4) !(,123,4)
    print '账户状态'  (,161,8) !(,129,8)      
        print '─' (+1,2,84) fill
    !position (+1)  
end-procedure

begin-procedure error_page_setup      
    print '─' (1,2,84) fill
    position (+1)   
    print 'Queue Number:'  (,2)
    Print $QueNbr         (, +1)            
    print  'Application Number:' (,25)
    Print $ApplNbr             (, +1)   
    Print 'Queue Sub Number:' (, 55)
        Print $QueSubNbr           (, +1)   
    print '─' (+1,2,84) fill
          position (+1)
    print '账号' (,2)
    print '批处理错误信息' (,25) 
    print 'oracle错误信息' (,100)     
        print '─' (+1,2,84) fill
    !position (+1)  
end-procedure

begin-procedure OSI-Startup  
End-procedure

//begin-footing
begin-footing 3  //3表示页底部保LIU的行数
  print '─' (,2,84) fill
  print '单位客户证件类型:' (+1,2)
  print '0-组织机构代码证' (,+2)
  print '1-工商营业执照号码' (,+2)
  print '2-事业法人证书' (,+2)
  print '3-社团法人证书' (,+2)
  print '4-军队代号' (,+2)
  print '5-国税税务登记证' (,+2)
  print '6-地税税务登记证' (,+2)
  print 'X-其他证件' (,+2)
  page-number (+1,126)  '当前页为第' '页,'  //page-number显示当前页号 (+1,126) 为显示的位置 '当前页为第' '页,'为显示的内容
  last-page () '共' '页。' //last-page为显示最后一页的页号 ()表示当前行位置
  print '打印时间:' (,+1)
  let $printDate = datenow() //datanow()为函数,返回客户端当前的日期和时间
  move $printDate to $printDate 'YYYY-MM-DD'
  print $printDate (,)
end-footing

#include '{libpath}tkit_rptheader.inc'
#include '{libpath}tkit_queappl.inc'
#include '{libpath}tkit_vars_opts.inc'
#include '{libpath}tkit_Sqrfunc.inc'

 

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

转载于:http://blog.itpub.net/9240380/viewspace-709371/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值