2011年12月14日

[Mac] 停止 mail 收件人更新通訊錄

繼上一篇 "設定 Mac 通訊錄讀取 Zimbra 全域聯絡人" 之後,
發現,只要 mail 一收到信,收件人就會自動更新到通訊錄中,
這立意是不錯,但困擾的是,姓和名的欄位根本就不對,
被更新過的通訊錄,姓氏和名字的欄位竟然會重複,一整個很無奈,
找了很久,終於在網路上找到解決的方式了,有需要的人請享用:


defaults write com.apple.mail SuppressAddressHistory -bool true

在 terminal 中執行上面這行指令,關閉 mail 後,重新開啟就會生效了。
有一點小小的副作用:即使收件人是不存在通訊錄中的,他也不會自動加到通訊錄中,
連收件人紀錄也不會寫,不過這點到是對我沒有影響,
因為我喜歡手動加到通訊錄,勝過讓他自動幫我加。

2011年11月28日

[Mac] 讓 Mac 認識 Windows 的電腦名稱

要從 Mac 上用電腦名稱連進 Windows 的網路芳鄰,常讓人一個頭兩個大,
這裡提供的作法是把 IP 和 電腦名稱的對應,放到 /etc/hosts 檔案裡,
只要記憶過一次,下次就不用更做這樣的動作,
畢竟,大部份的人,常用的電腦就那幾台而已。

其實這篇是( Lion 下批次更新 hosts 檔的 shell script )的延伸
將前述的 shell script 包裝起來變成 app


服用前請注意,

1. 不能修改此 app 的檔名(若改名可能會造成 hosts遺失)
2. 使用前一定要先備分 /etc/hosts
3. hosts 若不慎遺失請不要怪我

下載位置:

找主機IP.app.zip


[Mac] 設定 Mac 通訊錄讀取 Zimbra 全域聯絡人

自從公司把 Exchange Server 換成了 Zimbra 後,很多作業都不順,
尤其是在非 Microsoft 的作業系統上,很多設定都要自力自強,
在 Mac 上Mail 和 Calendar 都不是太大的問題,
但 Contacts 就麻煩了,
因為他的設定太無腦了,直接就抓該帳號的聯絡人,
在介面上還沒有地方可以設定,改抓全域聯絡人,
下面來介紹一下,可以調整這個設定的方式,

以下設定先決條件是,Zimbra Server 上有設 galsync account

首先,打開通訊錄,然後加入一個 CardDav 帳號(通訊錄 -> 偏好設定)

設定完成後,將通訊錄關閉
打開 Finder,按 Command + Shift + G
在跳出的 TextBox 中輸入 ~/Library/Application Support/AddressBook/Sources 並前往該路徑

在該路徑下可以看到如下圖的目錄,但目錄名稱是第一個步驟動態產生的,所以會因人而異
在該目錄下會有一個 Configuration.plist,用文字編輯器將此檔案開起(如果有XCode的話也可以用XCode提供的編輯器編輯)。


打開聯絡資訊 -> 偏號設定 -> 帳號
在伺服器設定裡將紅框處的文字複製出來。
在 Configuration.plist 中尋找剛剛複製出來的文字,
如下圖標示紅框處,調整為 Zimbra Server 上設定的 galsync account 的名字


接下來再重新開啟通訊錄,便會開始同步 GAL 的聯絡人囉。

2011年10月26日

[Mac] bbedit 真好用

BBedit 就他像的 slogan

It doesn’t suck.®

但他不止不糟,而且還非常的優秀。
最棒的是還提供了 command line 的指令
bbedit、bbfind、bbdiff

bbedit 的用法,網路上有一堆文章在介紹,也就不多提了,
來看一下 bbfind ,
在換到 Mac Book Air 上工作後,
另一個(前一個)困擾我的問題是,
在 Windows 上有個非常好用的 grepWin ,
可以讓我在追程式問題的時候,快速的找到相關關鍵字的程式,
但 Mac 下一直找不到好用的替代品,
其實我要的功能不多,只要可以整合 finder,
簡單的輸入關鍵字,就會在指定的目錄下搜尋所有文字檔,
且不同編碼的文字檔也要可以搜尋。
像這樣:



2011年10月4日

[Javascript] console object 如何 cross-browser

前面有提到 console 物件 的內容及使用,
緊接著會遇到的問題就是,不是所有的瀏覽器都有這玩意,
以下是利用 ExtJS  applyIf 的方式,解決 cross-browser 的問題。

    function applyIf(object, config) {
        var property;
    
        if (object) {
            for (property in config) {
                if (object[property] === undefined) {
                    object[property] = config[property];
                }
            }
        }
    
        return object;
    }
    function PageLoad() {
        
        window.console = window.console || {};
        
        applyIf(window.console, {
            log: function(message) { alert(message); } ,
            info: function(message) { alert(message); } ,
            error: function(message) { throw message; }
        });
        
        console.log("log");
        console.info("info");
        console.error("error");
    }


2011年10月3日

[Javascript] console 物件

隨著瀏覽器越來越強,Javascript的程式也越來越龐大,
為了方便除錯,瀏覽器也內建了一些開發工具,
而這些開發工具或多或少都有提供一些內建的 Javascript 物件供使用,
其中 console 是我還蠻喜歡用的一個物件,

各家瀏覽器的 console 物件都不盡相同, 寫個小小的程式來紀錄一下差異

<html>
<header>
<script type="text/javascript">
 function PageLoad() {
  var keys = "";
  for(var key in console) {
   keys += key + "<br />";
  }
  var divResult = document.getElementById("divResult");
  divResult.innerHTML = keys;
  console.log("log");
  console.info("info");
  console.error("error");
} </script> </header> <body onload="PageLoad();"> <div id="divResult"> </div> </body> </html>

常用的不外乎就 log 、 info 、 error,其他的到是沒什麼研究了,底下是執行的結果。

《 執行結果 》
IE 9:

log
info
warn
error
assert
dir
clear
profile
profileEnd




Firefox 7:(不含firebug)
log
info
warn
error
debug
trace
__noSuchMethod__


Chrome 14:
profiles
memory
debug
error
info
log
warn
dir
dirxml
trace
assert
count
markTimeline
profile
profileEnd
time
timeEnd
timeStamp
group
groupCollapsed
groupEnd


延伸閱讀:console object cross-browser

2011年9月30日

[Mac] Lion 下批次更新 hosts 檔的 shell script

2011.11.28 以下 shell script 包裝成 app 囉: Lion 上找主機 IP 並自動更新 hosts 的 app 


用 Air 一段時間了,在公司最頭痛的問題就是很多測試機都只有WINS認識,
雖然可以用 finder 透過 smb://servername 的方式存取檔案,
但對於一個開發網頁程式的工作者來說,相當的痛苦,
因為沒辦法直接 http://servername 進行測試,
在 linux 下可以透過修改 nsswitch 的方式處理,但 Lion 中就不知道該怎麼做了,
最後索性直接改 /private/etc/hosts ,將常用的 Server 與 ip 加進去,
畢竟Server的IP也不是那麼常更換的,
但遇到另一個問題是每次有新的機器,
都要手動下
smbutil lookup servername
再去 /private/etc/hosts 修改內容,過程一整個很繁雜,
於是就寫了幾支 shell script
要新增一台新的機器就在 command line 下

sudo ./hiWins.add.sh SERVERNAME

要從機器清單中匯入就在 command line 下

sudo ./hiWins.import.sh < YOUR_SERVERNAME_LIST_FILE

使用前記得要先備分 /private/etc/hosts ,以免發生意外 :p


(1) findip.sh

#!/bin/bash

# [功能]
# 利用 smbutil lookup 尋找 server 的 ip
# [使用方式]
# echo hrispd-t | ./findip.sh

function getIp(){
    IP=$(smbutil lookup "$1" |grep -i "IP Address" |sed "s/IP.*: //")
}

while read LINE; do             #讀取stdin
    getIp ${LINE}               #取得IP
    if [ ${#IP} != 0 ]; then
        printf "%s\t%s" $IP ${LINE}
    fi
done

(2) hiWins.update.sh
#!/bin/bash

# [功能]
# 更新 /private/etc/hosts 中所有 server 的 ip,輸出並不會直接回寫 hosts 檔,單純 echo 出來
# [使用方式]
# ./hiWins.update.sh SERVERNAME

#讀取原始的 hosts 檔
exec < "/etc/hosts"

#標記是否有相同的ServerName,若無則一律新增
FOUND="N"
result=
while read LINE; do
    #取第一個字
    C1=$(echo ${LINE} | cut -c1-1)
    if [ $C1 != "#" ]; then
        #將空白或tab分隔的字串拆成陣列
        declare -a Array=($LINE)
        if [ "$1" == "${Array[1]}" ]; then
            FOUND="Y"
            out=$(echo "$1" | ./findip.sh)
            if [ ${#out} != 0 ]; then
                printf "%s\n" "$out"
            else
                printf "%s\n" "${LINE}"
            fi
        else
            printf "%s\n" "${LINE}"
        fi
    else
        printf "%s\n" "${LINE}"
    fi
done

if [ $FOUND == "N" ]; then
    out=$(echo "$1" | ./findip.sh)
    if [ ${#out} != 0 ]; then
        printf "%s\n" "$out"
    fi
fi

(3) hiWins.add.sh
#!/bin/bash

# [功能]
# 更新 /private/etc/hosts 中所有 server 的 ip ,並加入指定的 server ip(若已存在則純更新)
# [使用方式]
# ./hiWins.add.sh SERVERNAME
# [注意事項]
# 需要 sudo 權限

if [ $# == 0 ]; then
    echo "Input Server Name please."
else
    out=$(./hiWins.update.sh "$1")
    
    printf "%s\n" "$out" > out.hosts
    
    cp ./out.hosts /etc/hosts
fi

(4) hiWins.import.sh
#!/bin/bash

# [功能]
# 依 YOUR_SERVERNAME_LIST 檔案中,定的 SERVERNAME 清單,
# 逐筆呼叫 hiWins.add.sh 更新(或加入) /private/etc/hosts
# [使用方式]
# ./hiWins.imports.sh < YOUR_SERVERNAME_LIST
# [注意事項]
# 需要 sudo 權限

while read LINE; do             #讀取stdin
    if [ ${#LINE} != 0 ]; then
        ./hiWins.add.sh ${LINE}
    fi
done

2011年8月19日

[.Net] C# Express 撰寫 Windows Service 的方式

手工打造 Windows Service

Step 1.新增專案
C# Express裡專案範本只有這幾個,不過沒關系,
先選主控台應用程式。
image

Step 2.在方案總管加入兩個新的類別
imageimage

第一個類別,負責當服務啟動及停止時要做的事情
先加入 System.ServiceProcess 的參考
image

image
繼承 ServiceBase,並複寫 OnStart 及 OnStop
另外在建構式中 ,要初始化相關服務的資訊,
這個部分是Windows Service啟動時所需要的。



MyWinService.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.ServiceProcess;
using System.Diagnostics;
using System.Timers;

namespace MyWinService
{
    class MyWinService : ServiceBase
    {
        const string SERVICE_NAME = @"MyWinService";
        System.Timers.Timer TheTimer = new System.Timers.Timer();

        public MyWinService()
        {
            InitializeComponent();
        }
        private void InitializeComponent()
        {
            this.ServiceName = SERVICE_NAME;
            this.CanStop = true;
            this.AutoLog = false;
            this.EventLog.Log = "Application";
            this.EventLog.Source = SERVICE_NAME;
        }
        protected override void OnStart(string[] args)
        {
            //Todo:  config 取得 Interval
            TheTimer.Interval = 30 * 1000;
            TheTimer.Elapsed += new ElapsedEventHandler(TheTimer_Elapsed);
            TheTimer.Start();
            this.EventLog.WriteEntry(SERVICE_NAME + " Service has started.");
        }
        protected override void OnStop()
        {
            TheTimer.Stop();
            this.EventLog.WriteEntry(SERVICE_NAME + " Service has stopped.");
        }
        protected void TheTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            //Todo: your code here
        }
    }
}
第二個類別,服務安裝程式會呼叫到的類別,負責將安裝服務
加入 System.Configuration.Install 的參考
image

MyWinServiceInstaller.cs
using System;
using System.ServiceProcess;
using System.ComponentModel;
using System.Configuration.Install;

namespace MyWinService
{
    [RunInstaller(true)]
    public class MyWinServiceInstaller : Installer
    {
        const string SERVICE_NAME = @"MyWinService";
        private ServiceProcessInstaller ServiceProcessInstaller1;

        private ServiceInstaller ServiceInstaller1;
        public MyWinServiceInstaller()
        {
            InitializeComponent();
        }

        private void InitializeComponent()
        {
            this.ServiceProcessInstaller1 = new ServiceProcessInstaller();
            this.ServiceProcessInstaller1.Account = ServiceAccount.LocalSystem; //服務啟動預設登入類型(安全性)
            this.ServiceProcessInstaller1.Username = null;
            this.ServiceProcessInstaller1.Password = null;
            this.ServiceInstaller1 = new ServiceInstaller();
            this.ServiceInstaller1.Description = "這裡寫服務的描述";
            this.ServiceInstaller1.DisplayName = SERVICE_NAME;
            this.ServiceInstaller1.ServiceName = SERVICE_NAME;
            this.ServiceInstaller1.StartType = ServiceStartMode.Automatic; //啟動模式(自動/手動/停用)
            this.Installers.AddRange(new Installer[] { this.ServiceProcessInstaller1, this.ServiceInstaller1 });

            this.Committed += new InstallEventHandler(MyWinServiceInstaller_Committed); //當安裝成功後,啟動服務
        }
        void MyWinServiceInstaller_Committed(object sender, InstallEventArgs e)
        {
            // Auto Start the Service Once Installation is Finished.
            var controller = new ServiceController(SERVICE_NAME);
            controller.Start();
        }
    }
}
Step 3.主程式
這個部分是負責服務啟動時,載入 MyWinServices 類別
另外安裝及解除安裝也一併在這裡處理,方便設定服務,而不需要另外包裝安裝程式。

Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Diagnostics;
using System.ServiceProcess;
using System.Runtime.InteropServices;

namespace MyWinService
{
    class Program
    {
        /// <summary>
        /// 主程式
        /// </summary>
        /// <param name="args"></param>
        [STAThread()]
        static void Main(string[] args)
        {
            //沒有輸入參數的時候,當做起動服務的入口(若啟動服務也需要參數的話,這邊要改寫)
            if (args.Length == 0) {
                System.ServiceProcess.ServiceBase.Run(new MyWinService());
            } else {
                if (args[0].ToUpper() == "/INSTALL")  {
                    //安裝
                    InstallService();
                } else if (args[0].ToUpper() == "/UNINSTALL") {
                    //解除安裝
                    UnInstallService();
                } else {
                    Console.Write("輸入的參數不正確!");
                }
            }
        }
        static string INSTALL_EXE = Path.Combine(RuntimeEnvironment.GetRuntimeDirectory()
                                                , @"InstallUtil.exe");
        static void InstallService()
        {
            string currFileName = Process.GetCurrentProcess().MainModule.FileName;
            Process.Start(INSTALL_EXE, string.Format(@"""{0}""", currFileName));
        }
        static void UnInstallService()
        {
            string currFileName = Process.GetCurrentProcess().MainModule.FileName;
            Process.Start(INSTALL_EXE, string.Format(@"/u ""{0}""", currFileName));
        }
    }
}
這樣就大功告成囉!
以下是執行的畫面:
直接執行不給參數會要求我們要安裝服務
image

使用 /install 安裝服務:
image

服務安裝成功並啟動:
image

參考資訊:http://social.msdn.microsoft.com/Forums/en/Vsexpressvcs/thread/8b9207c8-4b59-4740-b6c3-c5fb1d8fea56

2011年3月9日

[GH]轉結至12月底加班補休時數


------------------------------------
/*
STEP 1
先準備 HIHI_TRAN 的資料
example:

CREATE TABLE HIHI_TRAN (
PER_SERIL_NO dbo.PER_SERIL_NO
,DEP_CODE_ACT VARCHAR(100)
,DEP_NAME_ACT NVARCHAR(100)
,EMP_ID VARCHAR(100)
,CNAME NVARCHAR(100)
,FINAL_HR FLOAT
)
GO
--/***************************** HIHI_TRAN ***********************************************/
delete from HIHI_TRAN
GO
raiserror('Now Insert HIHI_TRAN Datas .... ',1,1)
insert into HIHI_TRAN ([PER_SERIL_NO],[DEP_CODE_ACT],[DEP_NAME_ACT],[EMP_ID],[CNAME],[FINAL_HR])  Values (N'P3637',N'1100',N'公○○部門',N'3637',N'馮○○',25)
insert into HIHI_TRAN ([PER_SERIL_NO],[DEP_CODE_ACT],[DEP_NAME_ACT],[EMP_ID],[CNAME],[FINAL_HR])  Values (N'P4689',N'1100',N'公○○部門',N'4689',N'林○○',0)

*/
------------------------------------



------------------------------------
/*
STEP 2
作完下面語法後,再執行
http://mrhihi-paul.blogspot.com/2011/03/gh.html
去更新補休時數
*/
------------------------------------
DECLARE @TEST CHAR(1); SET @TEST = 'N'

/* 先把上次轉檔的資料清掉,準備重轉 */
IF @TEST<>'Y'
    DELETE LOL_OT WHERE APPLY_DATE = '2010/01/01'
    AND PER_SERIL_NO IN (
    SELECT PER_SERIL_NO FROM HIHI_TRAN
    )
IF @TEST<>'Y'
    DELETE LOL_LEV WHERE APPLY_DATE ='2010/01/01'
    AND LEV_TYPE_COD = '00014'
    AND PER_SERIL_NO IN (
    SELECT PER_SERIL_NO FROM HIHI_TRAN
    )

/* 到12月底所有人加班時數(含轉檔) */
DECLARE @OT TABLE (
    PER_SERIL_NO dbo.PER_SERIL_NO
    ,OT_COMPEN_HR FLOAT
    ,OT_COMPEN_RHR FLOAT
)
INSERT INTO @OT
SELECT PER_SERIL_NO
     , SUM(OT_COMPEN_HR)
     , SUM(OT_COMPEN_RHR)
  FROM LOL_OT
 WHERE SDATE <='2011/01/01 06:00'
   AND EFORM_STATUS_COD IN ('W','P')
 GROUP BY PER_SERIL_NO

/* 到12月底所有人補休請假時數(含轉檔) */
DECLARE @LEV TABLE (
    PER_SERIL_NO dbo.PER_SERIL_NO
    ,LEV_HR FLOAT
    ,LEV_BORROW_HR FLOAT
)
INSERT INTO @LEV
SELECT PER_SERIL_NO
     , SUM(LEV_HR)
     , SUM(LEV_BORROW_HR)
  FROM LOL_LEV
 WHERE LEV_TYPE_COD = '00014'
   AND EFORM_STATUS_COD IN ('W','P')
   AND ASSIGN_DATE <= '2010/12/31'
 GROUP BY PER_SERIL_NO

DECLARE @TMP_OT TABLE(
    PER_SERIL_NO dbo.PER_SERIL_NO
    ,DEP_SERIL_NO dbo.DEP_SERIL_NO
    ,OT_HR FLOAT
)
INSERT INTO @TMP_OT
SELECT A.PER_SERIL_NO
     , [DEP_SERIL_NO]=EMP.DEP_SERIL_NO_ACT
     , [OT_HR]=A.FINAL_HR -(ISNULL(B.OT_COMPEN_HR,0) - ISNULL(C.LEV_HR,0))
  FROM HIHI_TRAN A
  JOIN EMP_EMPLOYEE EMP ON A.PER_SERIL_NO = EMP.PER_SERIL_NO
  LEFT JOIN @OT B ON A.PER_SERIL_NO = B.PER_SERIL_NO
  LEFT JOIN @LEV C ON A.PER_SERIL_NO = C.PER_SERIL_NO
 WHERE 1=1
   --AND A.FINAL_HR >= 0
   --AND (B.OT_COMPEN_HR - C.LEV_HR)>=0
   AND (ISNULL(B.OT_COMPEN_HR,0) - ISNULL(C.LEV_HR,0))<= A.FINAL_HR

IF @TEST<>'Y'
    INSERT INTO LOL_OT (FLOW_ID, FLOW_INST_ID, CMP_SERIL_NO, PER_SERIL_NO, OT_APPLY_NO, SEQ, DEP_SERIL_NO, SHIFT_CODE, OTAPPLY_KND_COD, APPLY_DATE, OT_TYPE_COD, SDATE, EDATE, OT_HR, SAGT_SERIL_NO, REASON, ORG_OT_COMPEN, EXTRA_OT_COMPEN, OT_COMPEN_HR, OT_COMPEN_DATE, OT_COMPEN_RHR, OT_FEE_HR, EFORM_STATUS_COD, IS_APPLY_EXP, CUT_FLG, CHK_FLG, KP_SDATE, KP_EDATE, KP_OT_HR, KP_ORG_OT_COMPEN, KP_OT_FEE_HR, ASSIGN_DATE, MOD_STATUS, CRE_DTE, CRE_USR, MOD_DTE, MOD_USR, MOD_REASON, RECHK_FLG, OT_CREDIT_YM)
    SELECT '','','GH100601',PER_SERIL_NO,'OT'+RTRIM(PER_SERIL_NO),1,DEP_SERIL_NO,'24','2','2010/01/01','1','2010/01/01','2010/10/31',OT_HR,'','',OT_HR,0.00,OT_HR,'2012/01/01',OT_HR,0.00,'P','N','Y','Y','2010/01/01','2010/10/31',OT_HR,OT_HR,0.00,'2010/01/01','',GETDATE(),'轉檔(20110106)',GETDATE(),'轉檔(20110106)','','N',''
    FROM @TMP_OT

-------------------------------------------
DELETE @OT
INSERT INTO @OT
SELECT PER_SERIL_NO
     , SUM(OT_COMPEN_HR)
     , SUM(OT_COMPEN_RHR)
  FROM LOL_OT
 WHERE SDATE <='2011/01/01 06:00'
   AND EFORM_STATUS_COD IN ('W','P')
 GROUP BY PER_SERIL_NO

DELETE @LEV
INSERT INTO @LEV
SELECT PER_SERIL_NO
     , SUM(LEV_HR)
     , SUM(LEV_BORROW_HR)
  FROM LOL_LEV
 WHERE LEV_TYPE_COD = '00014'
   AND EFORM_STATUS_COD IN ('W','P')
   AND ASSIGN_DATE <= '2010/12/31'
 GROUP BY PER_SERIL_NO
-------------------------------------------

DECLARE @TMP_LEV TABLE (
    PER_SERIL_NO dbo.PER_SERIL_NO
    ,LEV_HR FLOAT
)
INSERT INTO @TMP_LEV
SELECT A.PER_SERIL_NO
     , [LEV_HR]=ISNULL(B.OT_COMPEN_HR,0) - ISNULL(C.LEV_HR,0) - A.FINAL_HR
  FROM HIHI_TRAN A
  LEFT JOIN @OT B ON A.PER_SERIL_NO = B.PER_SERIL_NO
  LEFT JOIN @LEV C ON A.PER_SERIL_NO = C.PER_SERIL_NO
 WHERE A.FINAL_HR <> (ISNULL(B.OT_COMPEN_HR,0) - ISNULL(C.LEV_HR,0))

IF @TEST<>'Y'
    INSERT INTO LOL_LEV(CMP_SERIL_NO, LE_APPLY_NO, PER_SERIL_NO, SEQ, FLOW_ID, FLOW_INST_ID, LEVAPPLY_KND_COD, APPLY_DATE, DEP_SERIL_NO, SHIFT_CODE, LEV_TYPE_COD, SDATE, EDATE, LEV_MINUTE, LEV_HR, LEV_DAY, AGT_SERIL_NO, SAGT_SERIL_NO, REASON, EFORM_STATUS_COD, CUT_FLG, OTHER_OPTION1_NAME, OTHER_OPTION2_NAME, OTHER_OPTION3_NAME, IS_APPLY_TRAVEL, OCCUR_DATE, ASSIGN_DATE, MOD_STATUS, CRE_DTE, CRE_USR, MOD_DTE, MOD_USR, MOD_REASON, L_LE_APPLY_NO, LEV_BORROW_HR)
    SELECT 'GH100601','LE'+RTRIM(A.PER_SERIL_NO),A.PER_SERIL_NO,1,'','0','2','2010/01/01',B.DEP_SERIL_NO_ACT,'24','00014','2010/01/01','2010/10/31 23:59:00',LEV_HR*60,LEV_HR,LEV_HR/8,'','','','P','Y','','','','N',NULL,'2010/01/01','',GETDATE(),'轉檔(20110116)',GETDATE(),'轉檔(20110116)','',NULL,0.00
      FROM @TMP_LEV A
      JOIN EMP_EMPLOYEE B ON A.PER_SERIL_NO = B.PER_SERIL_NO