Datawindow 可以讓你設定 retrieve argument,有多少個或類型是什麼都需要預先寫死,在retrieve 的時候一個都不能少,沒彈性可言,但有方法改變這現實嗎?當然有,不然我提這個幹嘛?

方法是這樣的:

  1. 取出原 sql (GetSQLSelect())
  2. 拼湊 where statement
  3. 原 sql 跟 where statement 合併成新 sql
  4. 新 sql 放進 Datawindow 並 retrieve (SetSQLSelect())
  5. 還原原 sql 到 Datawindow (SetSQLSelect())

還是圖比 SQL 好看,弄成圖了:

image

文章標籤

過時程式員 發表在 痞客邦 留言(0) 人氣()

前一篇已經把檔案寫到數據庫中了,那要怎麼下載呢?這裏簡單說一說。

1.    在PB 中定義 Blob 變量
       Blob    lblob_file

2.    以 SelectBlobBinary 存到 blob

過時程式員 發表在 痞客邦 留言(0) 人氣()

有時候用戶會希望把文件例如 jpg、pdf 等等上傳到系統中,作為對電腦數據的依據,這次聊聊怎麼上傳檔案。

上傳檔案基本有兩種方式,一是以檔案模式上傳到 file server ,二是以 Binary 模式寫到數據庫中,各有長短。前者需要另建 file server,也就是需要額外的支出,但由於是以文件是以檔案格式儲存,後台直接用 Windows 的檔案總管就可以打開;後者則把文件寫到原有數據庫中,不必另購,但這會導致數據庫體積變大,增加了備份時間和對硬盤空間的要求,而且由於是以 binary 形式儲存,需要另外加工還原成檔案才能使用。沒有最好的方案,只有最適合的方案,各適其適。就個人經驗所限,這次只能聊聊怎麼寫到數據庫中了。

在 PB 裏,用以儲存 Binary 的變量類型叫 Blob(Binary Large Object),可以儲存 word, excel, email 和圖片之類的東西,把它們轉化成 Binary 後就可以寫到變量中,再更新到數據庫了。

上傳步驟如下:

文章標籤

過時程式員 發表在 痞客邦 留言(0) 人氣()

SQLCode 就是在 PowerBuilder 內執行 SQL 語句的返回值:

0       代表成功

100  代表取到空值

-1      代表出問題了

文章標籤

過時程式員 發表在 痞客邦 留言(0) 人氣()

為了連接多個數據庫,我們可能需要好幾個Transaction Object,但每一個都預先寫到代碼裏面嗎?這樣彈性就不夠大了,我們可以一開始就先把它們寫到緩存中,適時調用。注意要養成用完就斷開連接的好習慣。

 

思路大概如下:

  1. 把數據庫連線設定寫到 ini 或數據庫中
  2. 在程式中定義 Transaction Array
  3. 程式啓動後就把各個連線設定寫到Transaction Array
  4. 建立 Function() ,接收 Database 名稱,連接此數據庫,並登記到全局變量中
  5. 建立 Function(),接收 Database 名稱,檢查全局變量並斷開連接
  6. 2, 3, 4, 5 都可以考慮寫到一個 User Object 中,下圖只供參考,沒有指定方式,按你的想法去寫就好了。

image

文章標籤

過時程式員 發表在 痞客邦 留言(0) 人氣()

這裏提供個另建 Transaction Object 的例子,PB 內使連接數據的話,一般都默認是使用   SQLCA 的,所以如果是另建的話呢,你都需要以「using <transaction>」或「DW.SetTransobject(<transaction>)」去指定 Transaction。什麼情況下需要另建呢?比方說連入權限管理數據庫檢查密碼、取得權限設定,或連上其他系統的數據作比較等等。

 

// 定義   Transaction

transaction   ltr_obj

文章標籤

過時程式員 發表在 痞客邦 留言(0) 人氣()

Transaction Object 保存所有連接數據庫的參數並用以連接數據庫。其實只要在開發環境把參數設好,PB 就已經替你把腳本拼出來了,只要在「Preview」中拷貝到你的程序中就可以使用了,連接時記得要加上 connect using sqlca 啊。

image    image

image  

 

文章標籤

過時程式員 發表在 痞客邦 留言(0) 人氣()

SPID 全稱Server Process ID,是當前連接 MS SQL Server 的唯一識別碼,每次連接都會分派一個新的 spid 給你,通過spid 就可以查到程序目前在數據庫的狀態了。

 

這句可以查到數據庫中當前的所有任務,找出死鎖,blocked > 0 的就是被鎖了:

select * from sysprocesses

文章標籤

過時程式員 發表在 痞客邦 留言(0) 人氣()

在程序裏很多的動作或事件我們都會想記錄下來以作日後檢查之用,很多人一看到「時間」兩個字就會想起Windows 右下角的系統時間,並打算把這時間記到數據庫中,這想法是危險的,為什麼呢?因為每台電腦的系統時間基本都各不同,所以這時間在查案時並不可靠。

更有參考價值是更新數據庫那一刻的時間,所以取「數據庫」時間才是可靠而且統一的,就算你說它的時間也不一定對呀,但起碼它對事件發生的「時間順序」還是準確的。

除了在數據表中以 Trigger 填充日期外,你也可以在 PB 中這樣從數據庫取時間:

Datatime  ldt_now

文章標籤

過時程式員 發表在 痞客邦 留言(0) 人氣()

變量命名規範化是件很重要的事情,最好能在程序開發前就定好規範,往後不管是老同事還是新入職的新同事,大家都要遵從命名規範去做,這有助於同事間的溝通,也方便日後在編碼上互想支持,讓大家一看就知道它的特性和用途。在控件名命方面,PowerBuilder 已經有所建議了,你可以從 PB 裏打開下面的畫面以作參考。

 

PowerBuilder 裏的變量主要分成三類,Local VariableInstance VariableGlobal VariableLocal Variable 只能在當前頁的代碼中使用Instance Variable 就是在當前視窗的所有 event、function 中都可用Global Variable 就是在整個程序中都可用。對於這三類,我的命名習慣是這樣的,以 string 為例,ls_value 是 local string,is_value 是 instance string,你已經猜到了吧? gs_value 就是 global string 了,這樣就一目了然,方便易明了。

 

文章標籤

過時程式員 發表在 痞客邦 留言(0) 人氣()