Oracle PL/SQL: 讓 "字串資料" 進行 "字元集轉換"

在 Oracle Database 中, 提供 Convert 函數, 做為提供字串的字元集轉換功能.

如 : 讓你的 UTF8 資料, 轉換成 Big5 資料,

 語法
Convert( '字串', 'To_字元集', 'From_字元集' )

Convert( '字串', 'To_字元集' )

由 UTF8 轉 Big5, 如下:
 範例
正確但不好的範例 : vData := Convert( vData, 'ZHT16MSWIN950', 'UTF8' );

正確且較好的範例 : vData := Convert( vData || ' ', 'ZHT16MSWIN950', 'UTF8' );

 注意事項
1) 因為有時最後面中文字會轉碼失敗, 所以多加一個空白, 讓最後一個中文字可轉碼成功.

2) 若確認最後面字元一定是英文,則不用多加一個空白.

3) 不要因多加一個空白, 所以在轉碼之後, 利用 rtrim 把最後面的空白去除之, 這樣反而會造成轉碼失敗 (如:單位).

4) 若字串要做額外處理, 如 : substr, replace, ... 等, 則先進行處理, 之後才做字元集轉換.

某帳本在某月的銷貨收入

在 Oracle ERP 中, 如何取得 "某帳本在某月的銷貨收入",

語法, 如下 :
 語法
SELECT GC.SEGMENT1 "公司別"
, GC.SEGMENT2 "廠別"
, GC.SEGMENT3 "會計主目"
, GC.SEGMENT4 "會計子目"
, SUM(GB.PERIOD_NET_CR - GB.PERIOD_NET_DR) "金額" -- (貸方 - 借方)
FROM GL_BALANCES GB
, GL_CODE_COMBINATIONS GC
WHERE GB.CODE_COMBINATION_ID = GC.CODE_COMBINATION_ID
AND GB.SET_OF_BOOKS_ID = &SOB -- 帳本
AND GB.PERIOD_NAME = to_char(to_date('&YYYYMM', 'YYYYMM'),'MON-YY') -- 作帳期間
AND GB.TRANSLATED_FLAG is null -- 作帳幣別
AND GC.ACCOUNT_TYPE = 'R' -- 收入類會科
AND SUBSTRB( GC.SEGMENT3, 1, 1 ) = '4' -- 銷貨收入
GROUP BY GC.SEGMENT1
, GC.SEGMENT2
, GC.SEGMENT3
, GC.SEGMENT4
HAVING SUM(GB.PERIOD_NET_CR - GB.PERIOD_NET_DR) <> 0;

由 Form 程式開啟 Submit Request, 且指定好報表

在 Oracle ERP 中, 通常會由 Menu : View / Requests 去執行報表, 如下 :


不過, 這個會列出 User 目前可執行的所有報表, 需由 User 指定要執行的報表名稱,

其實, 若要由 Form 程式, 直接開啟某個報表, User 只需輸入參數, 這種方式要有的.

利用 Open_Form, 然後設定 Open Form 兩個參數 : PROGRAM_APPL_SHORT_NAMECONCURRENT_PROGRAM_NAME 即可.

範例程式, 全部照抄, 只需更改紅色部分 :
 程式碼
DECLARE
pl_id ParamList;
pl_name VARCHAR2(10) := 'tempdata';
BEGIN
-- 建立 Parameter List
IF not Id_Null(Get_Parameter_List(pl_name)) THEN
begin
Destroy_Parameter_List( pl_name );
pl_id := Create_Parameter_List(pl_name);
exception
when others then
null;
end;
ELSE
pl_id := Create_Parameter_List(pl_name);
END IF;

-- 新增 Parameter
add_parameter( 'tempdata'
, 'PROGRAM_APPL_SHORT_NAME'
, TEXT_PARAMETER
, 'PROGRAM_APPL_SHORT_NAME'
);
add_parameter( 'tempdata'
, 'CONCURRENT_PROGRAM_NAME'
, TEXT_PARAMETER
, 'CONCURRENT_PROGRAM_NAME'
);
END;

OPEN_FORM( '$FND_TOP/forms/US/FNDRSRUN'
, ACTIVATE
, SESSION
, NO_SHARE_LIBRARY_DATA
, 'tempdata'
);


執行範例 :

1) 點選 Button :


2) 直接開啟 Submit Request, 且直接跳到參數畫面 :


這樣, 可以幫 User 節省一些開啟報表的時間喔.

Office 2003 編輯 2007 檔案

在 Office 2007 製作的檔案, 其文字方塊在 2003 會以圖片格式呈現, 而造成無法編輯.

這個問題, 目前 Microsoft 已提供解決方案,

只要 2003 安裝下面套件即可 : http://support.microsoft.com/kb/924074

注意 : 本人安裝套件後, 2003 還是無法編輯 2007 檔案, 是我安裝步驟錯誤嗎 ? 還是根本騙人的.

如何得知 Oracle Database 的語系

可以利用下面 SQL 語法, 得知 Oracle Database 的語系 (不是 NLS_LANG 的設定)
 語法
select value
from NLS_DATABASE_PARAMETERS
where parameter='NLS_CHARACTERSET';

J2ME 手機遊戲作品 - 拉霸台

在學習完 J2ME 後, 想其兒時遊戲, 就乾脆寫一個手機遊戲 - 拉霸台, 如下 :


操作極為簡單 :
2 號鍵 : 往左移
8 號鍵 : 往右移
4 號鍵 : 減少押注
6 號鍵 : 增加押注
5 號鍵 : 開始跑

所以, 若有興趣者, 可以 mail 或 msn 通知我, 我會分享給愛好者.

APP-FND-01242 : Cannot read value from field ...

原因 : Value Set 中有設定的 Filed Item, 但是在 Form 中沒有該 Field Item, 導致讀不到該 Field Item 的資料值.

 方式 1
客制 Form, 新增缺少的 Block / Field Item 即可.

缺點 1 : 有使用此 Value Set 的 Form, 都要新增此 Block / Item, 若有 n 個 Form 有用到此 Flexfield, 就必須客制 n 個.

缺點 2 : 怕會有遺漏的 Form 也使用此 Flexfield, 而沒有客制到, 導致作業時會有此錯誤訊息.


 方式 2
將使用到此 Value Set 的 Flexfield 拉到畫面上, 然後, 此 Flexfield 不配置 Value Set, 不顯示此 Flexfield, 且改由 LOV 抓出資料.
(此做法 : 參考這裡)

優點 : 只需客制目前的 Form 即可.

在客制 Form 中, 將某彈性欄位移到畫面上, 為何彈性欄位值會儲存成 NULL

因為在系統上輸入 or 修改其他某一個彈性欄位的資料時, 系統會將所有彈性欄位的資料回寫一次.

也就是說, Flexfield 若是用程式直接寫入, 而沒有在系統上設定 Flexfield, 則其他彈性欄位輸入 or 修改時, 會被回寫成 null 值.

所以, 由程式直接寫入的 Flexfield 值, 也一定要在 Flexfield 畫面上設定, 且 Enabled 勾選;

若不想給 User 看到, 可以將 Displayed 設為 No 即可, 如下圖所示 :

Send Mail on Oracle PL/SQL - 第 3 期 (顯示中文字)

第二期寫到如何用 Oracle 的 utl_smtp 發送 HTML Mail : 第二期

本期來說明, 如何讓 utl_smtp 發送中文 Mail.

但在這時候, 已不能用 utl_smtp.data 來放置資料, 而是改用 utl_smtp.write_data 與 utl_smtp.write_raw_data

utl_smtp.write_data 用來放置一般資訊

utl_smtp.write_raw_data 用來放置 16 進位資訊, 也是中文字必須轉換成 16 進位才可正常顯示

且使用這兩個函數, 必須先執行 utl_smtp.open_data

而顯示中文的關鍵, 在於 Mail Header 要加上
Content-Type: text/html; charset=utf-8/big5, 如 big5 or utf-8

Content-Transfer-Encoding: 8bit
這兩行

而如何得知資料庫語系, 請見我的另一篇文章 : 點選此處

下面這是尚未修正前, 無法正常顯示中文的情形 :


Send Mail 中文字範例, 如下 : (注意紅色字體)
 範例
declare
mail_conn utl_smtp.connection; --宣告 Mail Object
CRLF varchar2(2) := CHR( 13 ) || CHR( 10 );
v_message varchar2(255);
begin
-- 開啟 Mail Connection 物件
mail_conn := utl_smtp.open_connection('172.16.xxx.xxx');

-- 建立連線
utl_smtp.ehlo(mail_conn, '172.16.xxx.xxx');

-- 設定 寄件者
utl_smtp.mail(mail_conn, 'tomkuo139@yahoo.com.tw');

-- 設定 收件者
utl_smtp.rcpt(mail_conn, 'aaa@xxx.yyy.zzz');
utl_smtp.rcpt(mail_conn, 'bbb@xxx.yyy.zzz');

-- 設定 發信內容
utl_smtp.open_data(mail_conn);
v_message := 'HTML 語法';

-- 寫入 Mail Header
utl_smtp.write_raw_data( mail_conn, utl_raw.cast_to_raw('Subject:Oracle 發送 Mail 測試' || CRLF) );
utl_smtp.write_data( mail_conn, 'MIME-Version: 1.0' || CRLF );
utl_smtp.write_data( mail_conn, 'Content-Type: text/html; charset=utf-8/big5' || CRLF );
utl_smtp.write_data( mail_conn, 'Content-Transfer-Encoding: 8bit' || CRLF );

-- 寫入 Mail Body
utl_smtp.write_raw_data( mail_conn, utl_raw.cast_to_raw(v_message) );

-- 結束連線
utl_smtp.close_data(mail_conn);
utl_smtp.quit(mail_conn);
end;


執行結果 :


這段程式在 Outlook Express 顯示中文是正常的.

但在 Notes 中顯示仍為亂碼, 必須做一些修正, 範例:

主旨程式碼修正前: utl_raw.cast_to_raw('Subject...')

主旨程式碼修正後: utl_raw.cast_to_raw(convert('Subject...', 'UTF8/ZHT16MSWIN950'))

為了顯示中文字, 就辛苦點吧.

Send Mail 第一期 : 點選此處.

Send Mail 第二期 : 點選此處.

Send Mail 最終版 : 點選此處.

Send Mail on Oracle PL/SQL - 第 2 期 (HTML)

上期寫到如何用 Oracle 的 utl_smtp 發送 Mail : 上一期

本期來說明, 如何讓 utl_smtp 發送 HTML 格式的 Mail, 讓 Mail 更加美觀.

只需在 utl_smtp.data 發送資料當中, 再加上
MIME-Version: 1.0

Content-Type: text/html
這兩行, 這樣就可以了.

範例如下 :
 範例
declare
mail_conn utl_smtp.connection; --宣告
CRLF varchar2(2) := CHR( 13 ) || CHR( 10 );
v_message varchar2(255);
begin
-- 開啟 Mail Connection 物件
mail_conn := utl_smtp.open_connection('172.16.xxx.xxx');

-- 建立連線
utl_smtp.ehlo(mail_conn, '172.16.xxx.xxx');

-- 設定 寄件者
utl_smtp.mail(mail_conn, 'tomkuo139@yahoo.com.tw');

-- 設定 收件者
utl_smtp.rcpt(mail_conn, 'aaa@xxx.yyy.zzz');
utl_smtp.rcpt(mail_conn, 'bbb@xxx.yyy.zzz');

-- 設定 發信內容
v_message := 'HTML 語法';

utl_smtp.data(mail_conn, 'Subject:Oracle Send Mail Test' || CRLF ||
'MIME-Version: 1.0' || CRLF ||
'Content-Type: text/html' || CRLF ||
v_message
);

-- 結束連線
utl_smtp.quit(mail_conn);
end;


Mail 結果 :


不錯吧.

Send Mail 第一期 : 點選此處.

Send Mail 第三期 : 點選此處.

Send Mail 最終版 : 點選此處.

System Profile for Project

投影片, 目前只限站長瀏覽, Sorry :

正確顯示 Record History 資料

在 Oracle ERP 的 Help Menu 中, 有一個 Record History 作業, 如下 :


若其作業, 無法正常顯示 Record History :


則請檢查 Current Block 所使用的 Table / View 中,是否以下幾個欄位的 "欄位名稱是否存在" or "欄位名稱是否正確":

1) LAST_UPDATE_DATE : 最後修改日期

2) LAST_UPDATED_BY : 最後修改資料的 ERP User ID

3) CREATION_DATE : 建立日期

4) CREATED_BY : 建立資料的 ERP User ID

5) LAST_UPDATE_LOGIN : 登入系統的 OS User ID (可有可無)

除了第 5 個以外, 若缺少其中一個, 則 Record History 就無法正常顯示了.

Blogger 加入最新文章與最新回應

今天剛學會如何在 Blogger 加入 "最新文章" 與 "最新回應" 的方式, 在此分享給各位 :

加入 "最新文章"

1) 先到 "版面配置" 上, 按一下 "新增小工具" :


2) 選擇 "資訊提供" 此選項 :


3) 輸入網址, http://yourblogger/feeds/posts/full


4) 然後, 輸入 "標題" 與 "顯示章數" 即可了.


加入 "最新回應"

1) 先到 "版面配置" 上, 按一下 "新增小工具" :


2) 選擇 "資訊提供" 此選項 :


3) 輸入網址, http://yourblogger/feeds/comments/full


4) 然後, 輸入 "標題" 與 "顯示章數" 即可了.


這樣子, 你的 Blog 也會有最新文章與最新回應的功能了.

p.s. 這種方式的最大缺點, 就是 1.不會即時更新 2.最多只能顯示 5 篇, 真是美中不足.

若要即時更新, 且可超過 5 篇, 可以參考 Abin's Tech Note 的這兩篇文章 :

最新文章 : http://abintech.azhai.org/2008/01/blog-post.html

最新回應 : http://abintech.azhai.org/2008/01/recent-comments.html

FRM-40405: No changes to apply

在 Oracle ERP 中存檔時, 若出現 "FRM-40405: No changes to apply" 的錯誤訊息時, 可能的原因有以下幾種 :

1) Data Block 的資料沒有異動, 存檔時會出現
 錯誤
"FRM-40401: No changes to save" or "FRM-40405: No changes to apply" 的錯誤

這已不是程式的問題, 而是 User 沒有異動資料, 就做存檔動作導致.

2) 由 Open_Form 指令開啟 New Form, 在 New Form 做存檔時, 因為 Old Form 並未做異動, 而導致出現 "FRM-40405: No changes to save" 錯誤,

所以, 解決方式, 如下:
 方式
Open_Form 的第三個參數 session_mode = session, 而不是 no_session

也就是說, 在 Open_Form 開啟 New Form 時, 能夠讓 New Form 有其獨立的 Session, 讓 New Form commit 時, 不會影響到 Old Form.

以上, 幾種方式的問題與解答, 供各位參考.

如何訂閱 (RSS) 網站 or Blog 的文章

若想隨時知道某個 Blog 的新資訊,

但又不想到該部落格查看,

此時, 可以利用 RSS 方式訂閱 Blog, 方式如下,

若你瀏覽器是 IE, 則

1) 到你想知道的部落格.

2) 然後, 在 工具 / 摘要搜索, IE 會自動搜尋出摘要提供者, 選擇其中一個 :


3) 點一下 "訂閱此摘要" :


4) 按一下 "訂閱" 鈕, 這樣就可以了.


以後, 可以在 "我的最愛 / 摘要" 中, 點一下某個摘要內容 :


就會看到該 Blog or 網站最新公告的資訊了.


若你瀏覽器是 Firefox, 則

1) 到你想知道的部落格.
2) 點一下 "網址列旁邊的訂閱鈕" :


3) Firefox 會自動搜尋出摘要提供者, 選擇其中一個 :


4) 按一下 "立即訂閱" 鈕 :


5) 按一下 "新增" 鈕 :


這樣, 以後就可以看到該 Blog or 網站最新公告的資訊了.

Send Mail on Oracle PL/SQL - 第 1 期

在 Oracle Database 中, 本身就有提供一個 Send Mail 套件 : utl_smtp.

我們可利用 utl_smtp 此套件, 來達成在 PL/SQL 中 Send Mail 功能.

utl_smtp 的相關函數用法, 如下 :
 用法
declare
mail_conn utl_smtp.connection; --宣告
begin
-- 開啟 Mail Connection 物件
mail_conn := utl_smtp.open_connection('smtp_server');

-- 建立連線
utl_smtp.ehlo(mail_conn, 'smtp_server');

-- 設定 寄件者
utl_smtp.mail(mail_conn, 'sender_mail_address');

-- 設定 多個收件者
utl_smtp.rcpt(mail_conn, 'receiver1_mail_address');
utl_smtp.rcpt(mail_conn, 'receiver2_mail_address');
...

-- 設定 發信內容
utl_smtp.data(mail_conn, 'mail_content');

-- 結束連線
utl_smtp.quit(mail_conn);
end;


utl_smtp 的 Send Mail 範例, 如下 :
 範例
declare
mail_conn utl_smtp.connection; --宣告
begin
-- 開啟 Mail Connection 物件
mail_conn := utl_smtp.open_connection('172.16.xxx.xxx');

-- 建立連線
utl_smtp.helo(mail_conn, '172.16.xxx.xxx');

-- 設定 寄件者
utl_smtp.mail(mail_conn, 'tomkuo139@yahoo.com.tw');

-- 設定 收件者
utl_smtp.rcpt(mail_conn, 'aaa@xxx.yyy.zzz');
utl_smtp.rcpt(mail_conn, 'bbb@xxx.yyy.zzz');

-- 設定 發信內容
utl_smtp.data(mail_conn, 'Subject:Oracle Send Mail Test' ||
chr(13) || chr(10) ||
'Hello World'
);

-- 結束連線
utl_smtp.quit(mail_conn);
end;


很簡單吧, 下期將介紹 utl_smtp 的進階應用喔.

Send Mail 第二期 : 點選此處.

Send Mail 第三期 : 點選此處.

Send Mail 最終版 : 點選此處.

Open_Form 如何傳遞參數 (Parameter List) 給呼叫的 Form

Open_form 若要傳遞參數給呼叫的 Form, 必須利用 Parameter List.

相關使用到的 Function 有 : Id_Null / Get_Parameter_List / Destroy_Parameter_List / Create_Parameter_List / add_parameter 等函數.

可以參考下面的範例, 修改紫色的部分即可使用 (傳遞參數開啟的 Form Name) :
 程式碼
DECLARE
pl_id ParamList;
pl_name VARCHAR2(10) := 'tempdata';
BEGIN
-- 建立 Parameter List
IF not Id_Null(Get_Parameter_List(pl_name)) THEN
begin
Destroy_Parameter_List( pl_name );
pl_id := Create_Parameter_List(pl_name);
exception
when others then
null;
end;
ELSE
pl_id := Create_Parameter_List(pl_name);
END IF;

-- 新增 Parameter
add_parameter( 'tempdata', 'paramName', TEXT_PARAMETER, 'paramValue' );
END;

OPEN_FORM( '$CUSTOM_TOP/forms/US/FormName'
, ACTIVATE
, NO_SESSION
, NO_SHARE_LIBRARY_DATA
, 'tempdata'
);

Google Picasa 網路相簿的簡易操作介紹

之前有介紹過使用 Flickr 做網路相簿, 但是若是免費的, 相簿最多只能有三個, 大大限制了使用性, 所以, 換改用 Google 的 Picasa 網路相簿, 以下就大約介紹其使用方式 :

1) 若是 "第一次" 登入 Picasa 後, 會先出現下面畫面, 大致輸入一下資料即可 :


2) 點一下 "上載", 開始上傳圖片 :


3) 若要歸類, 可以先 "建立新相簿" :


4) 輸入 "相簿標題", 也可輸入 "拍攝地點", Picasa 自動會帶出相關地名, 讓你選擇 :


5) 準備上傳時, 若尚未安裝 Picasa 控制項, 會出現下面畫面, 則進行安裝即可 :


6) 安裝之 ...


7) 點一下 "上載", 準備上傳圖片了 ...


8) 選擇剛剛建立的相簿 :


9) 一次可選擇 "多個檔案" :


10) 看一下相片有無問題, 若無, 則按 "上載" 進行傳送 :


11) 上傳中 ...


12) 上傳完畢後, 可按 "編輯 / 說明文字", 輸入每張相片的說明 :


13) 一一輸入說明文字, 然後按 "完成" 即可 :


14) 最後, 當然要把成果分享給朋友, 可按 "連結到此相簿", 會顯示此相簿的鏈結網址喔, 就可將此網址分享給朋友喔.

採用 Blog 標籤輸入模式, 套用到 Form 作業中 (基本資料維護內嵌在作業內)

本文章投影片介紹在 Oracle ERP 中, 如何將基本資料維護內嵌在作業內 :

投影片 :


投影片內容 :

1.此方式的優缺點為何

2.如何實現此作業方式

3.存檔時, 該如何判斷

綠世界一遊

這是我們家庭聚會, 在 2008.11.16 到綠世界遊玩, 這也是我第一次到綠世界,

天氣預報雖說會冷, 但是, 天公作美, 天氣好且溫和, 也看到了很多以前沒見過的生物, 整個感覺很好.

下面是這次遊玩的相片, 分享給大家瀏覽 (點一下圖片即可觀賞).
綠世界

開啟 Form 會出現 'No organizations are currently defined' 錯誤


在 Oracle ERP 中, 當開啟 Form 時,若有出現下面的錯誤訊息:No organizations are currently defined,表示你目前所在的 Responsibility 沒有關連任何的 Org


請到 "INV / Setup / Organizations / Organization Access" 作業中, 設定 Responsibility 與 Organization 的關聯。

其中,
Org : Organization

Application : Responsibility Application

Name : Responsibility Name

這樣子, 當你再次去開啟 Form 時, 就不會有剛剛的錯誤發生了.
Related Posts Plugin for WordPress, Blogger...