2016年9月21日 星期三

如何在MySQL的程式中中止程序?

如果是 Stored Function,可以使用 return expr

而 procedure. trigger, event 則要用 leave

CREATE PROCEDURE SP_Reporting(IN tablename VARCHAR(20))
proc_label:BEGIN
     IF tablename IS NULL THEN
          LEAVE proc_label;
     END IF;

     #proceed the code

END;

2016年9月15日 星期四

關於 mysql #1442 cannot update table "xxx" in Store function/trigger .....

MySQL 裡有在使用 Stored Function/Trigger 的,大概都會碰到過 #1422 這個Error.

今天記錄一下我的狀況:

我寫了一個 Procedure ,其中有一段

UPDATE table1 SET  field1=....., field2=....., WHERE .....
其中一個 field = (SELECT mem_id FROM members WHERE xxxx=xxxxx)

這裡呼叫了 members 這個 table,
而 UPDATE 的 table1 裡面的 Trigger,又有一段
UPDATE members SET xxx=xxxxx......

所以,此時,就產生了 #1422的Error!

也就是說,我在一個 UPDATE Statement 中呼叫了members 的 SELECT ,而在 該UPDATE中又啟動 trigger 又去 UPDATE members ,

而 #1422 的基本錯誤就是:不能在 自己的 trigger 中又要去 update自己!

一般而言,這是 對自己的 table

而我上述的例子,不是自己的 table, 而是有引用到的 另一個 table。我一直在自己的table中找不到錯誤,後來經朋友幫忙看,才發現是 用到的另一個table members的問題!

記錄在這裡,留給自己參考,如果剛好有緣者,也請參考之。

update multiple records at one time!

今天發生一個需求:
我有兩個 table:  members, orders
orders裡面有多筆 members 的訂單紀錄
如今,我想要統計 每一個members,分別各自合計下了總訂單金額。
如何做?

如果只是查詢,那簡單:

SELECT mem_id, sum(orders_total) FROM  orders GROUP BY mem_id;

這樣就出來的。以 mem_id 為群組,分別總計他們的 sum()

........

現在,我希望將此資料 update 到 members 裡面的一個欄位 all_orders_total, how to do?

經過測試,這樣就好了:

UPDATE members m, (SELECT mem_id, sum(orders_total) as tot FROM orders GROUP BY mem_id) b
SET  m.all_orders_total = b.tot
WHERE  m.mem_id = b.mem_id;

就這樣,解決了!

2016年9月10日 星期六

讓html頁面停留3秒後動作

在<html>
<head>

//增加這一段:

<meta http-equiv="refresh" content="3; url=/index.php">

</head>

三秒後,會自動重新載入到 index.php

MySQL Trigger 的問題?

為何有些在 Trigger 中執行 Update另一個table,沒有問題
而在 SQL prompt 之下,直接執行 Update 那個 table 就 error???

這是 MySQL的bug嗎?


==================================================

找到原因了:原來是 MD5(100), 跟 MD5(100.00) 這裡不一樣的!


CCS $Redirect

要製作一個網頁,程式判斷:如果 某個值空白,則跳到另一個網頁

Global $Redirect;
if (empty($somevalue)) {

    /// Redirect to another page
    $Redirect = "otherpage.php";

} else {

  //  normal part...

}

上述這個功能,我記得以前寫過,可以用的。不知為何,今天寫卻不行!?!???

試了半天,只好試另個辦法:


if (empty($somevalue)) {

    /// Redirect to another page

    header('Location: /otherpage.php');
    exit();

} else {

  //  normal part...

}

第二個這樣改就可以了。

改日有空再來研究為何第一個不行?!

在此做個紀錄。



2016年9月9日 星期五

MySQL Business Rule

DBA 要能善用 Stored Procedure/Stored Function 用來包裝 Business Rule


資料庫管理師可以藉由儲存程序常商業邏輯包裝起來,除了可以有安全控管的功能外,也可以簡化開發,方便程式攥寫。此外,有些複雜的邏輯與資料處理,可以先在資料庫端預先處理,就可以提昇整體效能。所以,儲存程序的攥寫,是資料庫管理師必須熟識的技能。


2016年9月3日 星期六

codecharge $_POST

codecharge的 record form 綁定了 datasource ,經過程式的處理後,
<form ...... action="{Action}"> 原則上 action還是會回到自己頁面本身程式,才把更新的內容寫到資料庫去。
如果
<form ..... action="otherpage.php"> 那麼,程式裡處理了半天,資料也計算過了,但是,只要按了 submit 按鈕,就直接跳到 "otherpage.php"去了,根本就沒有處理頁面資料庫本身的update/delete !

又:$_POST["var"]

發出的 page :  send.php
<form ...... method='post' action="process.php">
<input type="input" name="var"....>

必須在 process.php 裡面,才可以接收到 $_POST["var"]
如果程式跳到任何其他程式,例如:something.php,在something.php裡面就是抓不到 $_POST["var"]了!


因此,如果,要在兩個程式中間傳遞參數的方法,是什麼呢?!

或是,我已經有一組$_POST[] 參數資訊要傳遞,可是 上面 codecharge程式還要先處理完資料庫以後,才要傳遞參數,但是 action已經設定為"himself.php",怎麼辦?

接收端的程式已經被定義好使用 $_POST!

2016年9月2日 星期五

codecharge buttom on_click event

Button Control Reference

Server side event:

on_click

Occurs after the button has been clicked and the form is submitted. 
If the button appears in a record or editable grid form, record operations such as insert, update and delete occur after this event has been processed. 
In cases where the form does not have a Data Source, this event is used to perform post-submission operations such as sending emails messages based on the submitted information.

按鈕按了! ==> Form送出去了 ==> 執行本on click Event的程式 ==> 執行Insert/Update/Delete

 

2016年8月14日 星期日

Javascript 的物件加法要這樣加!

var form = document.getElementById("form");
form.orders_total2.value = parseInt(form.orders_total1.value) + parseInt(form.ship_fees.value);
form.pay_method.value="eCash";


如果沒有用parseInt(),就變成是字串String 的相加(串聯) !

喔!!!!


如何根據不同的結果,發出不同 的 Form?

form 的 action 用 javascript 動態決定。
假設你的form id是 form1

則你可以利用javascript語法  :  form1.action = "你要去的網頁.php" ;
                               form1.submit();

這樣的方法去動態改變要submit的地方

網頁讀取資料庫的值,以決定顯示的html內容



<script type="text/javascript">
window.onload=function(){
var form_name = document.getElementById('Contentquick_newmemapplyform');
if (form_name.pay_method.value=="eCash") {
document.getElementById("paybycash").style.display = "block";
document.getElementById("paybycard").style.display = "none";
} else {
document.getElementById("paybycash").style.display = "none";
document.getElementById("paybycard").style.display = "block";
}

};
</script>

使用 window.onload  event 來決定要顯示的 div

2016年7月3日 星期日

CodeCharge 修改登入資訊程式

原本的 CodeCharge 裡面內建有 Login 模組,設定在 Project 的 Setting 的 Security 模組裡面。

原先登入需輸入一個 Login Name, password,檢查帳號、密碼,通過就可以了。

但是,現在希望登入的帳號,可以接受  username、手機號碼、身分證字號

那就自己修改 CCLoginUser() 函數了。

CodeCharge 的物件Object 有 Panel 的指定

CodeCharge 裡面的物件指定,如果有 Panel ,記得 Panel 是透明的,可以跳過去

例如:

NavBar.ccp 是一個獨立可勘入的 Page,內有兩個 Panel : Panel1, Panel2
Panel1 是顯示未登入時的資訊
Panel2 是顯示已經登入時的資訊

Panel2 裡面有UserName 要顯示,

所以,程式中要指稱到 UserName,表示如下:

globale $NavBar;
$NavBar->UserName->SetValue("......");

如果以物件上下層的關係來看,中間有個 Panel2,
好像是這樣:

$NavBar->Panel2->UserName->GetValue();

其實是這樣:

$NavBar->UserName->GetValue();





2016年6月11日 星期六

CodeCharge: cannot connect to database

CodeChargeStudio : DataBase Error: Cannot connect to database MySQL
Databse Halted.

Database error: cannot connect to Database
MySQL Error
Session halted.

上兩周原本是Win7 的電腦被自動更新為 Win 10,原本擔心一些舊的AP不知道是否可以正常運作,例如CodeCharge等,結果試試,似乎還好。

前天,將原本舊的一個專案,原本運作都正常,就做了一些更新後,就上傳了。結果,產生了上述的錯誤!

搞了一整天,查不出原因。

後來,逐一比對 db_mysql.php 這檔案才發現,我不知道為什麼 db_mysql.php 是舊的,應該是 php 5.5以後,一些舊的 指令已經不能用了,mysql_pconnect() 必須改成:mysqli_connect() 等等。

手動的ftp方式,將新的 db_mysql.php 更新到伺服器上,就正常了!

註記在這裡。

註:
不是:是新的改成 mysqli_connect() 就不行了!
舊的可以!
將 舊的 db_mysql.php 改回去,蓋掉新的 db_mysql.php 就正常了!

2016年4月1日 星期五

CodeCharge Studio的 DateTime format

Code Charge 有他自己的 DateTime 格式,不同於 MySql 與 php,所以,從mySql 中讀出來的日期資料,如果用 php程式處理,需要使用 CCS 提供的函數:

CCFormatDate Function (PHP)

CCParseDate Function (PHP)

2016年1月23日 星期六

codecharge 設計一個grid 後面,不同的按鈕形狀

想要設計一個效果:在Grid 資料表裡面,每一筆記錄,因為資料狀泰不同,而有不同的按鈕。
按鈕是一個連結到另一個網頁,伴隨著一些連結參數。

原本使用Code Charge 的 Link Control,然後在該Grid 的 BeforeShowRow Event 中進行設定:
$grids->link1->SetValue("some thing");
結果發現,都失敗了!連結的文字,跟本都不理我。

後來,看了 CCS的 help 檔案,裡面有一個範例是這樣的:

<a href="{label1}?parameter={label2}">{label3}</a>

也就是根本就捨棄使用CCS內的 Link Control,而是使用html,裡面的一些設定,完全自己使用label來控制。這引發我很多想法。
Bootstarp 裡面,可以有很多現成的可以使用效果:
<a href=.....> 也可以使用 class="btn btn-primary",這樣一來,Link也有按鈕的效果。
class="btn btn-primary disabled" 就可以使該連結失效!
而這些值都可以在
BeforeShowRow Event 中依據需要而自由設定。
這樣就解決問題了!

2016年1月12日 星期二

CodeChargeStudio!!! button onclick bug!?

設計了一個 record form,裡面有 button ,
可是為什麼設計了一個 on-click event,卻抓不到該筆 records 的欄位?

奇怪?!




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

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