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

PB中動態DataWindow的技術應用

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

  在PowerBuilder的應用程序開發過程中對數據庫中數據進行操作的對象是數據窗口對象(DataWindow)利用數據窗口對象我們可以十分方便地完成對數據庫中已經存在的表中數據進行檢索查詢插入刪除和更新但是在實際問題中我們常常遇到數據庫中的一些表是用戶在程序運行期間動態生成的若要對這樣表中的數據進行操作就要運用動態數據窗口對象值得提到的一點是在動態數據窗口對象生成時其標題區(Header Band)中的文本不能直接顯示成漢字這的確是一點遺憾不過這個問題可以通過映射的方法得到解決

  問題的提出

  設有如下兩張表

  A表中的記錄是用戶可以在程序運行期間進行自由增加修改刪除和更新的B表中的屬性(即字段)由A表中的記錄決定並動態創建而且能夠方便地對B表中的數據提供漢化的操作界面當然將B表創建為下表

  也是可以的但是在動態生成數據窗口對象時其標題區(Header Band)中的文本不會顯示成漢字而是一些亂碼反而不利於問題的解決

  問題的解決

  動態創建B表的解決

  我們要動態創建B表就要構建動態SQL語句何謂動態SQL語句?數據庫應用程序通常進行確定的工作因此在編寫和編譯時就可以確定完整的SQL語句但當需要使用PowerBuilder不支持的嵌入SQL語句(如DDL語句)或者在編譯時不知道語句的具體格式或參數則在運行時構成SQL語句這類語句被稱為動態SQL語句

  動態SQL語句的格式

  EXECUTE IMMEDIATE SQL statement [Using Transation Object];

  參數說明

  SQL statement 包含一條有SQL語句的字符串

  Transation Object 事務對象

  動態數據窗口對象創建及標題區(Header Band)中文本漢化的解決

  )在程序運行時我們可以調用Create函數動態生成數據窗口對象格式如下

  DataWindowControlCreate(Syntax{Errorbuffer})

  參數說明

  DataWindowControl 將在其中創建數據窗口對象的數據窗口控件名

  Syntax 數據窗口對象源代碼

  Errorbuffer 用於保存錯誤信息的字符串

  )由於標題區(Header Band)中文本框的名稱是對應細目區(Detail Band)中相應列的名稱加上_t構成的而細目區(Detail Band)中列的名稱又是相應表的屬性的名稱因此我們能夠使用游標(Cursor)取出A表中的ywm和zwm的值然後使用映射的方式替換標題區(Header Band)中文本框的文本(Text)屬性從而使標題區(Header Band)中文本框的文本顯示為相應的漢字

  一個簡單的例子

  在PowerBuilder 和MS SQL Server 的環境下使用一個簡單的例子實現上述的觀點限於篇幅只列出主要界面及關鍵程序

  動態創建B表按鈕對應的代碼是

  int li_i=li_count

  string ywm[]zdlx[]ls_templs_sql

  //使用游標(Cursor)從數據庫的表中獲取ywm和zdlx的值並存儲於數組ywm[]和zdlx[]中

  select count(*) into :li_count from a;

  DECLARE a_cur CURSOR FOR SELECT ywmzdlx FROM a order by ywm;

  OPEN a_cur ;

  FETCH a_cur INTO :ywm[li_i] :zdlx[li_i] ;

  do while sqlcasqlcode=

  ls_temp=trim(zdlx[li_i])

  choose case ls_temp

  case

  ls_temp=char(

  case

  ls_temp=numeric(

  end choose

  zdlx[li_i]=ls_temp

  ywm[li_i]=trim(ywm[li_i])

  li_i++

  FETCH a_cur INTO :ywm[li_i] :zdlx[li_i] ;

  loop

  close a_cur;

  //創建B表和主鍵(Primary Key)

  ls_sql=create table b++ywm[]+ +zdlx[]+ not null&

  +constraint pk_b primary key (+ywm[]+))

  execute immediate:ls_sql;

  //增加B表的列

  for li_i= to li_count

  ls_sql=alter table b add +ywm[li_i]+ +zdlx[li_i]

  execute immediate:ls_sql;

  end for

  動態創建數據窗口對象按鈕對應的代碼是

  string syntaxsqlselecterrmsgls_colls_colls_namels_b;

  //動態創建數據窗口對象DataWindow

  ls_b=b

  sqlselect=select * from +ls_b;

  syntax=sqlcasyntaxfromsql(sqlselectstyle(type=grid)errmsg)

  dw_create(syntax)

  //漢化標題區(Header Band)文本

  DECLARE v_cur CURSOR FOR SELECT ywmzwm FROM a order by ywm;

  OPEN v_cur ;

  FETCH v_cur INTO :ls_col :ls_col ;

  do while sqlcasqlcode=

  ls_name=ls_col+_+t++text+=++ls_col+

  dw_modify(ls_name)

  FETCH v_cur INTO :ls_col :ls_col ;

  loop

  close v_cur;

  dw_settransobject(sqlca)

  dw_retrieve()

  結束語

  利用PowerBuilder的動態數據窗口對象的技術應用可以解決實際中數據庫的動態數據處理問題從而使應用程序具有更好的交互性和適應性若稍加變動用途是十分廣泛的


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