tcbs sqr之轉睡眠戶_sqr示例學習筆記_報表report

wisdomone1發表於2011-10-19
#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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章