目前分類:PowerBuilder (63)

瀏覽方式: 標題列表 簡短摘要

DataShare() 的功用就是在 DataWinodw 間「共用」數據。在一些在程序各處都用到的數據,或數據量大的表中,比如用戶名稱、供應商名稱或貨物資料,DataShare 都能有效提高程序度。

做法是先把 dropdowndatawindow 定義到 global datastore,預先 retrieve()到系統緩存內,在有需要的時候,就以 DataShare() 把它的數據共用的當前畫面的下拉中,這樣就可以減省每次都重新 retrieve 的時間。除了下拉,各種查詢也可以使用這個方法,例如把貨物資料都存到緩存中,查詢時就把數據共用到查詢畫面,然後以 DW.Filter()DataWindow 中查找資料。

這方法有個缺陷,就是看不到 retrieve 後所新增的數據,就是你 retrieve 後,同事或你自己新增的資料並不會自動包含到緩存中。這種情況你就需要在適當的時候預先更新一下緩存內的數據,例如在貨物維護功能內,有改動後就在背後偷偷 retrieve 一下該 global datastore 去更新一下數據。寫法如下:

 

文章標籤

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

不同的 Datawindow 有時候需要按本身特性分配到不同的打印機,比方說把銷售報表印到 A4 雷射打印機、標籤分配到熱感標籤打印機、一套幾份的發貨單要印到 Dot Matrix 打印機,為方便使用及減少用戶選錯打印機的機會,我們可以把哪個DW打印到哪台打印機的設定寫到代碼中。

這裏介紹幾個相關的函數:
PrintGetPrinters() 取系統打印機清單( 注意有 s )
PrintGetPrinter()  取預設打印機

文章標籤

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

剛在做把程序由 PB9 升級 PB 12 的項目,出現了一個奇怪的現象,明明我寫好是連去數據庫 A 的,為何老在連去 B?由於兩個庫都有着幾個名稱相同的 table,導致程序一直正常運作,但數據卻總是寫在錯的數據庫?

找了半天,原來是因為 PB9 裏面的這一句已經失效了,導致一直都沒有連上正確的數據庫:
SQLCA.LogID = "stupid_user"
SQLCA.Servername = gs_server

文章標籤

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

在展示數據的時候,為方便理解,我們常常會把不同的數據拼在一起,比方說「姓名(學號)」,在一般的數據表設計中,姓名跟學號會是不同的兩個欄位,在數據窗口要要怎麼拼呢?

DataWindow 提供了兩種方法,一是 Computed Column,這是從數據源加,在SQL裏就寫好的;二是 Computed Field,這只要在畫面上加入就可以,而且更可以調用 function() 做更多的事情,但這種方式有個缺憾,就是速度慢。

PB 很聰明,為提高速度,在retrieve 時只會執行畫面上會顯示到的 Computed Field 而已,如果畫面有有連續十張A4大小的單據,她就只會執行第一頁的 Computed Field ,在用戶把 scrollbar 往下拉往第二頁時,PB 才會執行第二頁的Computed Field ,如果佻皮的把 scrollbar 在第一頁程最後一頁往回拉的話,程序就有可能會因為不斷執行 Computed Field 語句而卡死,所以兩者之間需要慎選。

 

文章標籤

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

系統中常需要向用戶確認某些動作,例如同意、刪除、廢除之類,系統彈出信息就是想他思考過再決定,所以我們一定要他看過,再做點事才繼續下一步。

在設計這類信息的時候,為減少看都不看,或大意點錯,預設按鈕都應該定為「否」,是否刪除,預設為「否」;是否同意,預設為「否」;是否吃屎,也預設為「否」,這樣縱然誤選了,也無傷大雅,重按再選就好了。

畫面設計是一門學問,數據如何展示、按鈕怎麼放,Tab sequence 順序怎麼排,除了可以引導用戶怎麼使用外,也可以避免用戶犯錯,減少出錯後,程序員補救的時間。

PB 裏,預設按鈕是像下面這樣寫,如果是 YesNoCancel! 的話,預設值就應該是 3 的Cancel 了。

文章標籤

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

"The procedure entry point CsrNewThread could not be located in the dynamic library entry ntdll.dll"

image

 

剛把一個公司的程式由 PB9升級成 PB12,在開發環境一切正常,但 deploy 成 exe 後,執行時就出現上圖的報錯。一看頭疼,這種跟編碼沒關,跟數據庫又沒關的,我一向最不懂處理,馬上到網上看高手們有沒有解決方案可以……抄襲,有是好像有的,但只有一些可以試一下,但看起來高深莫測的方法,但都沒有肯定的答案。有時候高人話對話就是高,導致凡人難以看懂……

文章標籤

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

為什麼要取電腦名稱?電腦名稱用途可多了,它可以用於寫日誌,記下犯人在哪台電腦作案,也可以在數據庫中找到導致死鎖的兇手,然後馬上打電話過去……所以呢,能取就能,能記下就記下。犯人(用戶)死活不認的話,你就可以很帥的跳高高,很用力地把證據掉到他桌上……

要取得電腦名稱,需要先告訴 PB 可以找誰要,這次要用的是「Kernel32.dll」,這是個 Windows 內置的檔案,不必外找,不信你可以在檔案總管 search 一下,放哪裏你都不用管,PB 自會處理。

image

 

文章標籤

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

PowerBuilder (36) - 如何過濾下拉數據窗口?


如果下拉裏面會數據太多,會讓用戶浪費時間會尋找數據上,為方便用戶尋找並減少操作時間,這時候就需要在下拉的數據中做一下過濾。

以下圖為例,如果我希望選班級後,學生的下拉中就只有該班級的學生名單,那該如何做呢?

文章標籤

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

PowerBuilder (35) - 如何設置下拉數據窗口?(DropDownDataWindow)


要達到下拉數據窗口的效果,以一句簡單的話來說,就是在數據窗口內多放一個數據窗口

你首先要把作為下拉的 DataWindow 做好,為容易區分,建議名命方式為 dddw_xxxx,然後在你想要加入下拉的數據窗口中,選中要加入下拉的欄位,在Style Type 中選 DropDownDW。

文章標籤

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

這次說一說怎麼讓 DataWindow 能自動換行。在做報表的時候,由於受紙張大小所限,為顯示足夠的欄位,難免會導致某些欄位欄寬不足,未能顯示完整資料,這時候,用戶又來了…


遇到圖中的問題,我們有三步需要做:

image

文章標籤

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

DataWindow 數據源有四種:
1.    External 這是只建個框,數據在代碼裏面拼湊,一般用於比較沒有關聯性的數據,用以展示或導出,
2.    在 DataWindow Painter 裏面從數據表裏面拼湊成的SQL
3.    在 DataWindow Painter 裏面從數據庫視圖(View)裏面拼湊成的SQL

文章標籤

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

系統常常需要按用戶突然而來的要求而調整,但有時候礙於網速或地理位置所限,我們並不希望頻繁的調整系統和部署,加上如果同一套系統有不同版本的話,例如同時有網上版和本機版的,同樣的需求就可能需要調整兩個不同的系統,由於版本的不一,程式語言不一樣,程式員也可能兩個不同的人,這樣除了增加調整時間以外,也增加了代碼錯誤或版本不一致的風險。

為解決這種問題,我們可以把代碼寫到伺服器中,在MS SQL Server 中,這叫「Stored Procedure」,中文好像是「存儲過程」或「預存程序」。Stored Procedure就是把多項指令打包起來,需要調用的時候就隨時調用,不必再次重寫,不管調用它的是什麼語言,它都能按投入跑出預計的結果。加上 SQL 語言是跟數據庫打交道的好朋友,不管主力是哪種語言的開發員都會懂一點點,有着誰都能看懂、誰都能維護的好處,這很有助於同事間的互助互補 ( 就是我休假的時候你可以替我調一下啦~     ),而且只要部署到伺服器就可以了,不必重新部著整個程式也可以讓所有用戶執行到最新的代碼了。

這是 MS SQL存儲過程的 create 寫法,想有反饋的就要標明是「output」:

image

文章標籤

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

預設值( Default value/Initial value ),在用戶新增數據的時候,我們會希望先放一點預設值,用以減少用戶的入工輸入時間,也可以設定某些給系統內部使用的值,如 Y 是有效,N 是失效之類不給用戶輸入,但系統內部有用的數據。

預設的方法最少有三種,一是在數據庫裏面設,二是在 PB  InsertRow() 的時候寫,三是在 DataWindow 裏面設,三種方式各有好處,其中涉及系統時間的,在數據庫裏面設會更好,這裏先說 DataWindow 怎麼設。

在打開 DataWindow 後,單擊菜單上的「View\Column Specifications」,你就可以看到這 DataWindow 裏面的所有欄位,然後你就可以在「Initial Value」欄裏填上想要預設的值,填完後只要點菜單上的「Insert Row」就可以看到效果了。

 

文章標籤

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

你知道嗎?PowerBuilder 開發環境內代碼是可以隨意更改的,我比較喜歡字母佔比都是一樣的字形,這會讓代碼排縮看起來會比整齊。設定一個舒服的環境,工作起來才會順手嘛 ~

 

image

Arial ,這是佔比不一樣的,「f」跟「m」佔的空間不一。

文章標籤

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

DataWindow 預設只能更新一個表,如果你的 DataWindow 是由多個表關聯出來,而你又想更新其他表的話,這時候要怎麼做?

這時候就可以以 Modify() 在執行環境修改 DataWindow 的屬性,把可更新的表、欄位都改成新的表,改多少次都行,但注意最後要還原設定,否則用戶再次點更新的時候就可能亂套了。

// 關閉原有的更新
dw_1.Modify("class_id.Key=No") // 把原來的主鍵關閉

文章標籤

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

跟前一篇的 Datastore 類似,但有時候我們並不需要對 datastore 內的數據作改動,只要能取到值就可以了,那我們就可以使用 PB  內的 cursor。對比 datastore ,cursor 會使用到更少的資源,速度更快,也不必單純為了後台運算而多建一個 datawindow,也避開了別人以為沒用而誤把你的 Datawindow 刪掉或修改的風險。

// 定義變量
String     ls_student_id, ls_class
Integer    li_year

文章標籤

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

Datastore 就是隠形的 Datawindow,大部份 Datawindow 的功能它都擁有,GetItem(), SetItem(), Sorting, Insert, Delete, Update 它全都有。有時候會想把批量的數據取出來,然後逐條處理,這個時候就可以用上 Datastore 了。

 

比方說,把高中某班的學生取出來,再按學號到不同的表中取各科目的考試成績、課外活動記錄、各種奬項等等,匯總出來生成年度記錄或成績單,由於過程中用戶沒必要看到實際數據,只要看到進度和結果就可以了,這時候就可以把學生名單取到 datastore 中,再以 for loop把學號逐個取出來處理。

 

文章標籤

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

image

右按 object ,點「Edit Source」就可以看到那一大堆不是人看的源碼了,正常人平常不會開來玩,但遇上不正常的時候就需要進來弄一下了(小夫~)。

 
image 

文章標籤

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

DataWindow 過濾方法有三:
1.    在 PB\Rows\Fillter 裏面設
2.    在代碼裏以 SetFilter()
3.    在代碼裏以 DataWindow Syntax 設,這太煩了,往後只要有 PB Function 能代替的我都不說這個了。

文章標籤

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

DataWindow 排序方法有:
1.    在 DataWindow 內的 SQLSortPB 就會 Order by 加到 SQL 的最後,不勾上「Ascending」就是「遞減」的意思,這是第一重排序。
2.    在 DataWindow PainterPB\Rows\Sort 內設,這是第二重排序,設了這個的話,前面的SQL 排序就失效了。
3.    在代碼裏以 SetSort() 排序,這算是在 Runtime 時以代碼整前面的 Row\Sort 設定,彈性最大,可即時回應用戶操作,比如點擊欄名。

文章標籤

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