2015年12月7日 星期一

DataSource->Where

DataSource->Where Run-Time Property (PHP)

Syntax

object->DataSource->Where [=value]

This property stores all conditions that are eventually used in the WHERE clause of a query that selects, updates or deletes data from the database. Programmers can add their own conditions (preserving the SQL syntax) in one of the events triggered before the final query is built and executed (i.e. BeforeBuildSelect, BeforeBuildDelete, BeforeBuildUpdate).

在CodeCharge 的 help 裡面有這一段,他說設定了DataSource->Where 是儲存了  Select, update, delete  的 WHERE 子句。
程式設計師可以分別在 BeforeBuildSelect, BeforeBuildDelete, BeforeBuildUpdate 裡面,去設定 WHERE 子句。

結果,我一開始以為,只要在 BeforeBuildSelect 中設定了 WHERE 子句,就已經設定了所有的 WHERE 子句,結果一執行的結果,Select 出來的是我要的結果沒錯,但是,一執行 Update 就整個資料庫都被 Update ,就相當於沒有 Where 一樣。(  我在 Record 的定義中,並沒有設定 WHERE)。這並不是我要的結果。

後來經過測試的結果是:原來,我必須個別去設定 BeforeBuildUpdate  的 Where,以及 BeforeBuildDelete 的 Where 才會被正確的執行。

 CodeCharge的SELECT, UPDATE, DELETE 的 WHERE 子句是個別設定的!

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;
以上,這樣就可以僅僅兩筆的加總。

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

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