James's profileJames の BlogPhotosBlogListsMore Tools Help
    2/27/2008

    遷徙

    一顆種子飄啊飄的  到了曠野
    飽含著養份要在這片土地繁衍生息
     
    沒有繁華的絢麗 沒有璀璨與迷離
    返璞之後 才能勇敢的褪去外衣
     
    掬一把春泥耕讀於沃野
    先民的汗水溶於喜悅的淚滴
     
    浩瀚的大地 物轉星移
    萬千子民只為實現心中的  摩西
    2/25/2008

    背叛(KUSO)

     
    2/22/2008

    思念與貪戀

    思念是一種病
    而 貪戀不是罪
     
    思念是因距離而心起
    而 貪戀是因為心起而產生距離
     
    思念是從朝暮到晨昏
    而 貪戀是從深夜不願到天明
     
    思念與貪戀交錯間
    兩顆心的距離是永遠

    離人

    離人

     作詞:厲曼婷 作曲:何家文 編曲:屠穎

     *銀色小船搖搖晃晃彎彎 懸在絨絨的天上
     妳的心事三三兩兩藍藍 停在我幽幽心上
     妳說情到深處人怎能不孤獨 愛到濃時就牽腸掛肚
     我的行李孤孤單單散散惹惆悵

     #離人放逐到邊界 彷彿走入第五個季節
     晝夜亂了和諧 潮泛任性漲退 字典裡沒春天

     △離人揮霍著眼淚 迴避迫在眼前的離別
     你不肯說再見 我不敢想明天
     有人說 一次告別天上就會有顆星又熄滅


     

     

    到不了

    到不了 - 范瑋琪 
         曲︰張洪量
         詞︰范瑋琪
         編︰王豫民

       *你眼睛會笑 彎成一條橋
         終點卻是我 永遠到不了
         感覺你來到 是風的呼嘯
         思念像苦藥 竟如此難熬
         每分每秒

       #我找不到 我到不了
         你所謂的將來的美好
         我什麼都不要 〔你〕知不知道
         若你懂我 這一秒

       +我想看到 我在尋找
         那所謂的愛情的美好
         我緊緊的依靠 緊緊守牢
         不敢漏掉 一絲一毫 願你看到

     
    2/21/2008

    救人寶寶 台大「做」出亞洲第1個

     
    如果純就科學面來說,台大的技術著實令人驕傲
    我們的世界離科幻小說的世界更近了
    但就人道層面而言,一個被賦予救贖任務的生命
    是否他一出生就決定了他這個人生的價值?
    任務完成了之後,他的人生還有意義嗎?
     
    身為父母者,絕對不希望自己孕育的生命有任何缺陷或瑕疵
    他們一定會盡全力去保護這得來不易的生命
    然而,救人寶寶是否也會得到相同的對待?
    不僅考驗著父母,也考驗著人類社會千百年來的道德與價值觀

    天氣好好

    天氣好好今天
     
    這種溫暖讓人舒服
    2/19/2008

    上元節

    再過兩天就要元宵節了
    傳統中國人的年是一直要過到元宵節的
     
    有一首台灣的兒謠是這麼唱的
     
    初一早,初二早,初三睏到飽,
    初四接神,初五隔開,初六舀肥,初七七元,
    初八完全,初九天公生,初十有食席,
    十一請子婿,十二請查某子返來食泔糜配芥菜,
    十三關老爺生,十四月光,十五是上元暝。
    元宵節最熱鬧的地方非鹽水莫屬了
     
    大一剛進成大的隔年,在班代號召之下
    全班一起到班代家作客
    沒錯 班代就是土生土長的鹽水人(現為台南縣都發局局長)
    從下午開始整個鹽水鎮就進入管制時段
    到處都是人潮,一座座的炮城蓄勢待發
     
    越到晚上人潮更為擁擠 氣氛也愈來愈瘋狂
    整個鹽水鎮最終成了不夜城
     
    高潮的時刻則是在神轎啟動的那一刻
    全部的人潮擠在國小的操場
    為得就是那一刻萬砲齊發射向神轎的剎那
    那是一種感動,屬於天、地、人、神明共存的狀態
    沒有親身經歷那種場景
    你不會明瞭為什麼鹽水蜂炮其傳承的歷史是這麼的有意義
     
    算算大學四年,自己竟參予了三次鹽水蜂炮
    每一次都是感動(當然也是很危險)
     
    有機會真的要去參與鹽水的盛會
     
    2/18/2008

    心情低落

    當世界完全遺棄
    我只剩下呼吸
     
    雨直直落下  在天與地相連的間隙
    奈何我找不到可以棲身之地
     
     
     
    2/14/2008

    聽海

    聽海 - 張惠妹 
         曲︰涂惠元
         詞︰林秋離
         編︰涂惠元

         寫信告訴我今天 海是什麼顏色
         夜夜陪著你的海 心情又如何
         灰色是不想說 藍色是憂鬱
         而漂泊的你 狂浪的心 停在哪裡

       *寫信告訴我今夜 你想要夢什麼
         夢裡外的我是否 都讓你無從選擇
         我揪著一顆心 整夜都閉不了眼睛
         為何你明明動了情 卻又不靠近

       #聽 海哭的聲音 嘆息著誰又被傷了心
         卻還不清醒 一定不是我 至少我很冷靜
         可是淚水 就連淚水也都不相信

       +聽 海哭的聲音 這片海未免也太多情
         悲泣到天明 寫封信給我 就當最後約定
         說你在離開我的時候 是怎樣的心情

     

     

    我要快樂

    我要快樂

    作詞:鄔裕康 作曲:林倛玉(林毅心) 編曲:吳慶隆

    又被愛傷了一遍
    無所謂 當作成長
    剛剛走開的人 煙還點著 味道卻淡了

    我並不是天生愛寂寞 卻比任何人都多
    就算把世界給我 我還是一無所有

    我要快樂我要能睡的安穩
    有些人不抱了才溫暖 離開了才不恨 我早應該割捨
    我要快樂 哪怕笑的再大聲
    心不是熱的 全都是假的
    只有眼淚是真的
    轉載來自 ※Mojim.com 魔鏡歌詞網

    把從前想了一遍
    謝謝了 傷我的人
    想做樂觀的人 每種雨聲 聽了都不冷
    我並不是天生愛寂寞 卻比任何人都多
    就算把世界給我 我還是一無所有

    我要快樂我要能睡的安穩
    有些人不抱了才溫暖 離開了才不恨 我早應該割捨
    我要快樂 哪怕笑的再大聲
    心不是熱的 全都是假的
    我的決定是對的

     
     

    好冷的情人節

    今天是情人節,好冷
     
    印象中這幾年來都是暖冬,今年覺得特別冷
    太平山都下雪了(想起幾年前跟老婆他們家族上太平山等雪,還被台視拍到)
     
    情人節對已結婚七年的我來說,好遙遠
    小孩出生後,就鮮少對節日有什麼慶祝的浪漫
    (帶兩隻小猴全場蹦蹦跳哪需什麼浪漫)
     
    早上收到會計部秋萍給我們部門的巧克力
    結婚不久的她
    很有心也很浪漫的一個女孩子
    也祝他情人節快樂
     
    雖然是很冷的情人節
    有情人的人 沒情人的人
    都要快樂!!
    2/12/2008

    開工

    鼠年開工 正月初六
    天一樣的冷啊
     
    鞭炮聲倒是少了許多  是時辰還沒到嗎 (才說著就響起來了)
     
    除夕前將一台 Server 關機,結果今天卻開不起來
    Power 壞掉了,奇怪不關機都沒事
     
    新的一年 祝股市開紅盤 一路發發發
    2/11/2008

    寒夜思

    夜寒春將思故里
    燈窗斜影映人寂
    遙舉空杯憶佳友
    伏案埋首閱文集
     
    歲次戊子正月初二于台北
    2/5/2008

    明天放假了

    再過9小時,就要放大假了!!
    6天的假期,說長不長,說短不短
     
    今天給他穿便服來上班,配合休假的心情
    聽著Sara Brightman & Andrea Bocelli 的 "Time to Say Goodbye"
    如果每天上班都是這種心情...多好 (那就準備回家吃自己吐舌頭)
     
    還是把東西整理整哩,哪些該先完成的,今天把他告一段落吧
    2/4/2008

    extjs: 使用JsonStore & .Net Web Service讀取資料庫

     

    extjs 在 2.0 之後針對資料擷取的部份,做了大幅度的改善
    透過很直覺的定義方式,可以很快的建構出以Grid為base的資料呈現方式

    底下要示範的是,如何透過.Net的Web Service以及Ext.data.JsonStore將資料庫中的已完成簽核紀錄快速讀取出來

    首先我們先建構.Net的Web Service
    qryfinished.asmx 他會在 App_Code下產生一個 qryfinished.aspx
    在這邊我們還會需要使用一個 Audits class 來建構我們所需的 Json Array

    Imports Microsoft.VisualBasic

    Public Class Audits
      Public sno As Integer
      Public InstanceID As String
      Public ReferenceNo As String
      Public Version As String
      Public FTime As String
      Public StartTime As String
      Public SignTime As String
      Public UserID As String
      Public UserName As String
      Public ApproverID As String
      Public ApproverName As String
      Public Actions As String
      Public Diff As String
      Public vendor As String
      Public dept As String
    End Class

    上述的class就是我們要產生的Json Array的格式

    Imports System.Web
    Imports System.Web.Services
    Imports System.Web.Services.Protocols
    Imports Newtonsoft.Json
    Imports CommonModule
    Imports Audits ' define一個Json Array所需的 class

    <WebService(Namespace:="http://xxx/webservices")> _
    <WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
    <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
    Public Class qryfinished
      Inherits System.Web.Services.WebService

      <WebMethod()> _
      Public Function ToJSONString(ByVal uid As String) As String
        Dim strSQL As String
        Dim connWorkFlow1 As System.Data.SqlClient.SqlConnection = Nothing
        Dim sqlCommand As System.Data.SqlClient.SqlCommand, sqlCommand1 As System.Data.SqlClient.SqlCommand
        Dim drWorkflow As System.Data.SqlClient.SqlDataReader = Nothing, drWorkflow1 As System.Data.SqlClient.SqlDataReader = Nothing
        Dim cmdWMS As System.Data.SqlClient.SqlCommand
        Dim drWMS As System.Data.SqlClient.SqlDataReader = Nothing
        Dim iCount As Integer = 1
        Dim WF_UserID As String = uid
        Dim starttime As String = "", signtime As String = Now().ToString
        Dim oAudits() As Audits ' define Json Array
        Dim pb_no As String = ""

        ReDim oAudits(0)

        Try

          strSQL = "select distinct SLIP_NO from CELL_TMP_TB where status='C' order by SLIP_NO"

          If connWMS Is Nothing Then
            Connection(False, True, False)
          End If

          If connWorkFlow Is Nothing Then
            Connection(False, False, True)
          End If

          If connWMS.State <> Data.ConnectionState.Open Then
            connWMS.Open()
          End If

          cmdWMS = New System.Data.SqlClient.SqlCommand(strSQL, connWMS)

          drWMS = cmdWMS.ExecuteReader()

          Do While drWMS.Read()
            pb_no = drWMS.GetString(drWMS.GetOrdinal("SLIP_NO"))
            strSQL = "select top 1 * from Audits NOLOCK where ReferenceNo='" + pb_no + "'  order by StartTime"

            If connWorkFlow.State <> Data.ConnectionState.Open Then
              connWorkFlow.Open()
            End If

            sqlCommand = New System.Data.SqlClient.SqlCommand(strSQL, connWorkFlow)

            drWorkflow = sqlCommand.ExecuteReader()
            If drWorkflow.Read() Then
              ReDim Preserve oAudits(iCount - 1)

              starttime = drWorkflow.GetDateTime(drWorkflow.GetOrdinal("StartTime")).ToString()

              oAudits(iCount - 1) = New Audits()
              oAudits(iCount - 1).sno = iCount
              oAudits(iCount - 1).UserID = WF_UserID
              oAudits(iCount - 1).StartTime = starttime
              oAudits(iCount - 1).UserName = drWorkflow.GetString(drWorkflow.GetOrdinal("UserName"))

              GetERP(oAudits(iCount - 1), pb_no)

              strSQL = "select top 1 * from Audits NOLOCK where ReferenceNo='" + pb_no + "' order by SignTime desc"

              connWorkFlow1 = getSqlConnection("cnnWorkFlow")
              sqlCommand1 = New System.Data.SqlClient.SqlCommand(strSQL, connWorkFlow1)
              connWorkFlow1.Open()

              drWorkflow1 = sqlCommand1.ExecuteReader()
              If drWorkflow1.Read() Then
                oAudits(iCount - 1).InstanceID = drWorkflow1.GetString(drWorkflow1.GetOrdinal("InstanceID"))
                oAudits(iCount - 1).ReferenceNo = drWorkflow1.GetString(drWorkflow1.GetOrdinal("ReferenceNo"))
                signtime = drWorkflow1.GetDateTime(drWorkflow1.GetOrdinal("SignTime")).ToString()
                oAudits(iCount - 1).SignTime = signtime
                oAudits(iCount - 1).Actions = drWorkflow1.GetString(drWorkflow1.GetOrdinal("Actions"))
              End If
              drWorkflow1.Close()
              connWorkFlow1.Close()

              oAudits(iCount - 1).Diff = getSignTime(CDate(starttime), CDate(signtime))
            End If
            iCount += 1
            drWorkflow.Close()
          Loop

          drWMS.Close()
        Catch ex As System.Data.Odbc.OdbcException
          My.ErrorHandling.ExceptionHandler(ex, Resources.Settings.smtphost, Resources.Settings.From, Resources.Settings.CopyTo)
        Finally
          If Not drWorkflow Is Nothing Then drWorkflow = Nothing
          If Not drWorkflow1 Is Nothing Then drWorkflow1 = Nothing
          If Not drWMS Is Nothing Then drWMS = Nothing
          If Not connWorkFlow1 Is Nothing Then connWorkFl ow1 = Nothing
        End Try 
        ' 將 Json Array 透過 JavaScriptConvert.SerializeObject 轉換成序列化的String資料以利Internet傳輸
        Return "{""totalCount"":" + CStr(iCount - 1) + ",""data"":" + JavaScriptConvert.SerializeObject(oAudits) + "}"
      End Function

    End Class

    回傳的 Json String

    {"totalCount":1,"data":[{"sno":1,"InstanceID":"7C038193C70EBC50482573C500328A3B","ReferenceNo":"XX -7C0358","Version":null,"FTime":null,"StartTime":"2008/1/3 下午 05:12:02","SignTime":"2008/1/3 下午 05:52:00","UserID":"nnnnnn","UserName":"AAA","ApproverID":null,"ApproverName":null,"Actions":"確認","Diff":"39分58秒","vendor":"XXXX","dept":"XXX"}]}

    由於JasonStore要回傳的是一個格式化過的Json Array資料
    所以我們要另外建構一個qryfinished2.aspx透過它來呼叫qryfinished這個Web Service
    並透過Web Service中的ToJSONString將Json Array以序列化的方式回傳到前端網頁中

    Partial Class qryfinished2
        Inherits System.Web.UI.Page
      Public JSONString As String

      Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim myJSONObject As New qryfinished ' 呼叫 Web Service
        Dim uid As String = Request.QueryString("uid")

        JSONString = myJSONObject.ToJSONString(uid)
      End Sub
    End Class

    qryfinished2.aspx, 只呈現 Json String

    <%@ Page Language="VB" AutoEventWireup="false" CodeFile="qryfinished2.aspx.vb" Inherits="qryfinished2" %>
    <%=JSONString%>

    建構好Web Service及呈現Json String的網頁後,接下來我們要建構 extjs 的UI部分

    /*
    * Ext JS Library 2.0
    * Copyright(c) 2006-2007, Ext JS, LLC.
    * licensing@extjs.com
    *
    * http://extjs.com/license
    */

    Ext.onReady(function(){

        Ext.QuickTips.init();

        // turn on validation errors beside the field globally
        Ext.form.Field.prototype.msgTarget = 'side';

        // create the Data Store
        // 透過qryfinished2.aspx去讀取qryfinished.asmx這個Web Service抓出已簽核完成的資料
        // 作為 Grid 的資料來源
        var store = new Ext.data.JsonStore({
            url: 'http://xxx/DateCode/qryfinished2.aspx?uid='+WF_UserID,
            root: 'data',
            id: 'InstanceID',
            fields: [
                  'sno','ReferenceNo', 'UserName', 'Actions', 'StartTime', 'SignTime', 'Diff', 'dept', 'vendor'
            ]
        });

        // 呼叫 define 在 HTML 中的 Javascript 讓第一個欄位可以點擊後開啟資料頁
        function renderReferenceNo(value, p, record){
                return String.format(
                                '<a href="javascript:void(0);" onclick="doSign(\'{0}\',\'{1}\',\'{2}\',\'worklist\');" title="點此開啟入庫單">{2}</a>',
                                record.id, WF_UserID, value);
        }

        // define 一個 FormPanel 上面擺 Grid
        var fs = new Ext.FormPanel({
            collapsible:true,
            frame: true,
            title:'Date Code 逾期簽核-'+dcTitle,
            labelAlign: 'right',
            labelWidth: 85,
            width:800,
            waitMsgTarget: true,
            tbar: [''],
            // 顯示在FormPanel上的元件
            items: [new Ext.form.FieldSet({
                title: '查詢條件',
                collapsible: true,
                animCollapse: true,
                autoHeight: true,
                defaultType: 'textfield'/*,
                contentEl: 'pb_master'*/
            }),new Ext.grid.GridPanel({
                store: store,
                frame: true,
                //autoHeight: true,
                autoScroll: true,
                loadMask: true,
                sm: new Ext.grid.RowSelectionModel({singleSelect:true}),
                stripeRows: true,
                columns: [
                    { header: '', dataIndex: 'sno', width: 30, align: 'right' },
                    { id: 'ReferenceNo', header: '入庫單號', dataIndex: 'ReferenceNo', width: 80, renderer: renderReferenceNo, align: 'center', sortable: true },
                    { header: '部門', dataIndex: 'dept', width: 50, align: 'center', sortable: true },               
                    { header: '申請者', dataIndex: 'UserName', width: 50, align: 'center', sortable: true },
                    { header: '廠商', dataIndex: 'vendor', width: 80, align: 'center', sortable: true },               
                    { header: '簽核結果', dataIndex: 'Actions', width: 70, align: 'center', sortable: true },
                    { header: '申請時間', dataIndex: 'StartTime', width: 150, align: 'center', sortable: true },
                    { header: '完成時間', dataIndex: 'SignTime', width: 150, align: 'center', sortable: true    },
                    { header: '簽核歷時', dataIndex: 'Diff', width: 150, sortable: true }
                ],
                width: 788,
                height: 400
            })]
        });

        fs.render('form-ct');  // 將 FormPanel render 在 "form-ct" 這個 div tag 中

        store.load();  // 讀取資料

        fs.getTopToolbar().add('->', {
                text: '',
                tooltip: '重新整理',
                iconCls: 'breload',
                handler: function(){       
                        location.reload();
                }
        });
    });

    在給前端查詢的頁面中,我們只要將 define 好的 pgfinished.js include 進來即可

    <%@ Page Language="VB" MasterPageFile="~/qryMasterPage.master" AutoEventWireup="false" CodeFile="dc_finished.aspx.vb" Inherits="dc_finished" %>
    <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
      <script type="text/javascript">
      var WF_UserID="<%=WF_UserID %>";
      var dcTitle="已完成簽核查詢";
      </script>
      <script src="pgfinished.js" type="text/javascript"></script>
    </asp:Content>

    部份程式在Master Page 中

    <%@ Master CodeFile="qryMasterPage.master.vb" Inherits="qryMasterPage" Language="VB" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <!--<meta content="30" http-equiv="refresh" />-->
    <head id="Head1" runat="server">
      <title>Date Code逾期簽核系統</title>
      <link href="js/ext-2.0/resources/css/ext-all.css" rel="stylesheet" type="text/css" />
      <link href="js/ext-2.0/resources/css/xtheme-gray.css" rel="stylesheet" type="text/css" />
      <script src="js/ext-2.0/adapter/ext/ext-base.js" type="text/javascript"></script>

      <script src="js/ext-2.0/ext-all.js" type="text/javascript"></script>

      <link href="menus.css" rel="stylesheet" type="text/css" />
      <link href="forms.css" rel="stylesheet" type="text/css" />
      <!-- Common Styles for the examples -->
      <link href="js/ext-2.0/examples/examples.css" rel="stylesheet" type="text/css" />
      <style type="text/css">
        html, body {
            font:normal 12px verdana;
            margin:0;
            padding:0;
            border:0 none;
            overflow:hidden;
            height:100%;
        }
    </style>

      <script type="text/javascript">
    function doSign(unid,uid,pb_no,s){
      s=(typeof(s)=="undefined") ? s="":s;
      if (s=="finished")
        window.open("dc_read.aspx?unid="+unid+"&stage="+s+"&pb_no="+pb_no+"&uid="+uid,"DC","");
      else
        window.open("dc_check.aspx?unid="+unid+"&stage="+s+"&pb_no="+pb_no+"&uid="+uid,"DC","");
    }

      </script>

    </head>
    <body class="x-aero">

      <script src="js/ext-2.0/examples/examples.js" type="text/javascript"></script>

      <br />
      <form id="form1" class="x-form">
        <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
        </asp:ContentPlaceHolder>
      </form>
      <table align="center" border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>
            <div id="form-ct">
              <div id="pb_master">
              </div>
            </div>
          </td>
        </tr>
      </table> 
    </body>
    </html>

    完成圖

    新圖片

    建構 extjs 的 Application 也是符合 MVC 的規範
    Model: Web Service
    View: HTML
    Controller: extjs
    以這樣的方式去思考,就比較容易清楚掌握該如何撰寫 extjs 的 Application 了

    年前的倒數第二個上班日

    過年前的倒數第二個上班日
    大半的同事都休假去了
    雖然來上班 也是在休息
     
    大頭們都休假去了 中午跟部門的同事一起去聚餐
     
    花一點時間 把一些東西整理整理吧
     
    extjs 的 JSON data store 與 Grid 整合在 Net 中
    嗯不錯的標題
    2/1/2008

    冷冬。像過年的氣氛

    持續了近一個禮拜的濕、冷
    鼠年的腳步近了
     
    像小時候的記憶,冬天到了除夕夜是最冷的一天
     
    今年要第一次在家中過年,不回台中也不回丈母娘家
     
    婆說要煮酸菜白肉鍋,禮拜天得去一趟南門市場
    那兒的酸白菜與白肉是最道地的
    跟婆提議買一隻雙美珍的雞,可能得除夕當天去買,希望不要太塞
     
    趁過年把家裡整理一下,牆該刷一刷,Slicon也得補一補窗戶的縫隙,窗簾壞的該修,一扇捲是紗窗也該換
    家中有兩個小皮蛋,東西就是會面臨這種遭遇
     
    這個年,值得期待