熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> PB編程 >> 正文

PB動態報表的實現

2013-11-23 17:28:08  來源: PB編程 

  實現原理

  PowerBuilder中有一種以PSR為後綴的特殊的保存報表的文件格式(本文簡稱PSR文件)數據窗口可以直接讀取PSR文件生成報表而程序通過生成PSR文件就可以實現動態報表格式的保存

  首先通過設置數據窗口對象(dataobject)中的文本列等的Resizeable和moveable屬性為來實現對象位置的拖動控制通過數據窗口的Modify函數實現對象值的更改(包括增加和刪除)

  其次要保存報表格式在一個應用中數據窗口對象的名稱總是惟一的將每一個數據窗口對象轉化成PSR文件存於數據庫表中在窗口打開時程序先校驗報表格式是否存在如果存在將報表格式讀出來放在一個臨時文件當中然後設置數據窗口(datawindow)的數據對象(dataobject)為這個報表文件並提取數據 如果不存在直接提取數據即可

  實現過程

   建立一個數據庫表用以保存報表格式文件

   建立一個窗口w_temp 定義實例變量如下

  string is_dwtypeis_dwobject

  //保存報表中對象的類型及名稱

   在窗口的Open事件中加入如下代碼 校驗報表格式是否存在如果存在讀取定義好的報表格式到數據窗口

  blob emp_pic

  long ll_handle

  string ls_dwobjectls_reportfilels_path

  ls_dwobject = dw_printdataobject

  //判斷是否存在該數據窗口的報表格式

  select count(*) into:ll_count from dyn_report where dwobject =:ls_dwobject;

  if ll_count> then

  //讀取報表格式文件到大文本變量

  selectblob memo into:emp_pic from dyn_report where dwobject =:ls_dwobject;

  //創建PSR臨時文件並保存到硬盤

  ls_reportfile =\temppsr

  ll_handle = FileOpen(is_reportfileStreamMode!write!LockWrite!Replace!)

  FileWrite(ll_handleemp_pic)

  FileClose(ll_handle)

  dw_printdataobject = ls_reportfile

  dw_printsettransobject(sqlca)

  else

  Dw_printsettransobject(sqlca)

  End if

  Dw_printretrieve()

   保存報表格式這可以通過Cb_savereport按鈕的clicked事件實現

  string ls_filename

  long ll_count

  blob Emp_id_pic

  ls_filename =temppsr

  //保存報表格式到硬盤臨時文件

  dw_printsaveas(ls_filenamePSReport! false)

  sqlcaautocommit = true

  select count(*) into :ll_count from dyn_report where dwobject =:is_dwobject;

  if ll_count = then

  insert into dyn_report(dwobjectrptitle)

  values(is_dwobject:ls_filename:ls_path)

  end if

  //從硬盤臨時文件讀取數據保存到數據庫表中

  emp_id_pic = of_readbmpfile(ls_filename)

  //該函數將二進制文件內容讀到大文本對象中

  UPDATEBLOB dyn_report SET memo = :Emp_id_pic where dwobject = :is_dwobject;

  //更新數據庫

  sqlcaautocommit = false

   動態報表的實現通過數據窗口dw_print的clicked事件捕獲數據窗口中的對象並將對象名存放在實例變量is_dwobject中為下一步修改報表做准備

  string ls_typels_dwoname

  //得到對象類型和名稱

  ls_type = trim(upper(dwotype))

  ls_dwoname = trim(dwoname)

  is_dwtype = ls_type

  choose case ls_type

  case TEXTCommandButtonGROUPBOX

  is_dwobject = ls_dwoname

  //設置為可以拖動和改變大小

  thismodify(ls_dwoname+Resizeable=+

  thismodify(ls_dwoname+moveable=+

  case LINE

  //直線對象不能通過設置Resizeable和moveable屬性進行調整必須通過其他途徑

  is_dwobject = ls_dwoname

  case RECTANGLEELLIPSEGRAPHBITMAP

  is_dwobject = ls_dwoname

  thismodify(ls_dwoname+Resizeable=+

  thismodify(ls_dwoname+moveable=+

  case COLUMNCOMPUTE

  is_dwobject = ls_dwoname

  thismodify(ls_dwoname+Resizeable=+

  thismodify(ls_dwoname+moveable=+

  end choose

  最後再通過modify()函數就可以實現基本的動態報表操作這一類的文章較多PB中也有大量的例子可直接使用在此不再贅述

   在cb_exit按鈕的clicked()事件中加入close(parent)

   在應用的open事件中加入 open(w_temp)然後保存並運行全部工作到此結束!

  本程序在PBOracle 下調試通過

       編輯推薦

       ASP NET開發培訓視頻教程

       Microsoft NET框架程序設計視頻教程


From:http://tw.wingwit.com/Article/program/PB/201311/24637.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.