2015年11月25日 星期三

SCriptcase 在 buttom 之後的 error_message

Scriptcase的error handling 提供了內定的 macro 函數:

sc_error_message();
sc_error_exit();

然而,此 sc_Error_message() 函數似乎僅限於在 on_xxx events 中
放在 on_validate 等都work
但是,放到 自訂的 buttom 之後,似乎不work

於是,只好改用

echo "Error: Error message!!!";
sc_error_message("Error: Error Message!!!");
sc_error_exit();

這樣可以出現 echo 視窗。

但是如果只有 
echo "Error: Error message!!!";
sc_error_exit();
 這樣,出現echo 視窗後,還是會繼續執行,不會停止程式。

必需完整的

echo "Error: Error message!!!";
sc_error_message("Error: Error Message!!!");
sc_error_exit();

三段都有才可以。

記錄之,備查!


註:使用 echo "";  可以顯示一個 Output 小視窗。




2015年11月22日 星期日

將經營規則 business rule 寫在 mysql 中

資料庫系統,一定牽涉到資料庫本身,以及應用程式所處理的功能。
這些功能的規則,稱為 Business Rule. 有人翻譯為"商業規則",我認為這個翻譯不大妥當,應該為 "經營規則"。

這些經營規則,以前通常都是在 APP 應用程式中去設計執行,但如果有不同的程式給不同的人使用,而要遵守同一個 business rule ,那就變成必需在各個 AP 中個別去撰寫程式碼,這樣就會有不一致以及浪費時間的現象。

所以,關於這些資料的經營規則 business rule 最好是直接在  mysql 中執行即可,以方便保持資料的一致性,規則的一致性。

使用 mysql 的 STORED ROUTINE(Procedure/Function)及 Trigger Routine 以及Table 間的Foreign Key 規則、Index 唯一或可重複等工具,即可以達到一定的一致性規則。

而畫面的新增/更改/刪除/查詢,則可以很簡單的運用如 Scriptcase 等畫面產生器,就可以輕鬆的完成輸出入界面。


某些技巧:

如果有些程式碼是在特定的情況下才需要被執行,可以設計一個欄位值來控制他。
例如:field: execute_it char(1), Default:"0"
在 update_trigger中的程式可以寫:

IF NEW.execute_it = "1" THEN
    -- Execute some code...
    SET NEW.execute_it = "0";
ELSE
    -- Execute the other code......
END IF;

記得最後必須將 execute_it 的值設回來"0"
    SET NEW.execute_it = "0";



2015年9月28日 星期一

SC error handling


if({password} != {repassword})
{
sc_error_message("ERROR: ERROR ERROR MEssage!!!!");
sc_error_exit();
} else {
{password} = md5({password});
}

2015年9月14日 星期一

運用MySQL的Trigger 來設計鎖單功能

一個商業上資料表單,經常應該經過審核過後,即會希望把單據鎖定,不再被修改或刪除。例如:訂單、進貨單、出貨單、請假單......
如果經過Approve過的單據,還可以隨意被修改,那不是很糟糕嗎!

如此的商業邏輯 Business Rule,應該由MySQL 來做就好,以輕鬆維持資料庫的完整性。
運用 MySQL的 Trigger 就可以輕鬆的做到。

方法是:在該表單的欄位裡面,增加一個 lock bit(1)的欄位。

然後,建立一個 Trigger BEFORE_UPDATE:

BEGIN
IF OLD.lock THEN
    SET NEW = 'ERROR: 本單已經鎖定,無法更改。如欲更改,請先解除鎖定狀態。';
END IF;
END

BEFORE_DELETE:
BEGIN
IF OLD.lock THEN
    SET NEW = 'ERROR: 本單已經鎖定,無法刪除。如欲刪除,請先解除鎖定狀態。';
END IF;
END

這樣就ok了!

2015年9月10日 星期四

Scriptcase 上傳到伺服主機時,要注意可讀寫

當Scriptcase發佈到服務主機時,要注意一下,某些資料夾的權限是需要開啟可讀寫的。

/_lib/tmp 是要可讀寫

2015年9月6日 星期日

MySQL SUM with LIMIT records

當使用 SUM() 做加總函數時,MySQL是針對所有的WHERE 條件的,如果有 LIMIT 現制筆數時,他並不會只針對現制筆數部分做部分加總。

SELECT sum(quantity) 
FROM stock_card
LIMIT 0,2;
以上,這樣會得到所有記錄的總加總,而不是只有兩筆;

SELECT sum(quantity) 
FROM (SELECT quantity
      FROM stock_card
      LIMIT 0,2
) AS subquery;
以上,這樣就可以僅僅兩筆的加總。

2015年8月27日 星期四

MySQL: Trigger not activated on delete cascade

MySQL 在delete cascade時,並未啟動 Trigger

解決方法:將Delete Cascade 的 Delete 改為自己做 Delete Trigger


如何判斷現在FORM是在 insert mode? 還是 update mode?

只要用  if (empty({primary_key})) 就可以知道是否為新增模式了。 如果 {promary_key} 是空白的,那麼就是在新增模式;反之,就是更新模式。 以上。