2018年8月14日 星期二

如何update Oracle某一TABLE裡的排序位, 並以名稱做為排序

在這裡做個筆記, 功能是以名稱排序後, update 欄位中的排序欄位(SORT)

update TABLE1 t set t.SORT =
    ( select RN
      from (select ROW_NUMBER() OVER(ORDER BY NAME) RN ,TABLE1.CODE
             from TABLE1
             where SYSTYPE='TYPE1'
             order by nlssort(NAME,'NLS_SORT=TCHINESE_RADICAL_M') 
           )
      where t.CODE = CODE and t.SYSTYPE = SYSTYPE
    )
where SYSTYPE='TYPE1'

紀錄一下~

林口通勤到台北-不搭機捷的理由

在高速公路還在收回數票的時候,林口的地埋位置就處於泰山收費站之後,每每要到台北就必需付40元,所以住在林口在當時算是不划算的選擇。後來跟著ETC的建置後,這個問題終於落幕。所以林口人就慢慢變多了,如何搭車上班這件事就要好好聰明選擇了。

回憶當時在936,937公車都還沒有的情形下,往返台北的交通工具就是機車。從大科路下山往泰山五股再經過三重到台北...

這樣的輕移民在我們出了一場車禍之後就立馬改為搭公車了。往事真的不堪回首;現在反而覺得可以搭著快速公車,往返台北還有30分鐘可以自由選擇睡覺、滑手機、看書、發呆。

但從期待機捷到現在之所以沒有搭乘的理由其實就是票價,當初的如意算盤打的是以台北車站到捷運淡水站到A9林口站的距離相當;如果又有轉乘和優遊卡折扣,那麼當初選林口的如意算盤算是打的精準。

但是人算不如天算啊,這些都隨著正式通車後破滅了...稍微計算一下

A.搭機捷到台北上班

機捷A1台北站 到 A9林口站 單次票價:80元 通勤時間差不多 32:48 分鐘, 但是你到站後想要再轉搭台北捷運,最快也要5分鐘才能到捷運系統。(在沒有買月票的情形)

     (優惠列表:30天30% off,60天35% off,90天 40% off,120天 50% off)


B.搭公車到圓山轉北捷到台北上班

936,937 以未來城社區來計算往圓山捷運站 單次票價:30元 通勤時間差不多 30~50(+-10%)分鐘,但是下車直接到台北捷運紅線。接下來又可以享受30分鐘內轉乘捷運的優惠。(注意因經由高速公路端視路況影響較大)


這樣計算一下往返價格與時間

A.機捷 80+80+(北市捷運票價) 至少 160+起跳 | 時間32+ (若以買最優惠120天優惠計算,5折80元)
B.公車 30+(北市捷運票價及轉乘優惠)|時間30~50(+-10%) (正常情況下)


以為我實例:在西門町上班我

A.160+20=180   來回->360    (若以買最優惠120天優惠計算,5折80+20=100元)

B.30+12=42        來回->84      (若以買最1280優惠計算,(1280/22=58)+20=78元)

   還可以踏UBIKE健身。(前30分鐘免費)


價差可以自己算算看, 在時間上我是覺得沒有比想像中差很多, 所以我目前就妥協於價格考量。

再以一個月22天來計算一下,更會有感。尤其現在1280公車捷運搭到飽的情況下,84*22=1848-1280=568 更可以省下來。


所以聰明的你/妳, 會怎麼選擇呢?


大家其實都很精打計算的~現在936,937搭公車的人愈來愈多了, 到時候社會住宅那2000多戶如果都住滿滿的,到最後又會是怎樣的情形呢? 再來打算吧~

2018年2月7日 星期三

[程式類]Aspose如何將樣板WORD插入多筆來自資料庫(Blob)的圖片

Aspose word是一個非常好用的文件產生器, 像是要在本文填入文字, 就要利用WORD
按一下 [插入] > [快速組件] > [功能變數]
[快速組件] 功能表上的 [插入功能變數] 選項。

在左方功能變數名稱選擇MergeField, 在欄位名稱填入例如: NAME 後按下確定
«NAME»

這是WORD裡的功能變數裡的顯示。

而在程式裡C#為例:
        Document docTemplate = new Document(ExportFile);

        DataTable mainTbHeader = new DataTable();
        mainTbHeader.Columns.Add("NAME");     

        DataRow mainDr = mainTbHeader.NewRow();
        mainDr["NAME"] = "NAME1";
        mainTbHeader.Rows.Add(mainDr);
        docTemplate.MailMerge.Execute(mainTbHeader);
        docTemplate.Save(ExportFile);
這樣檔案裡就會照著你的意思,有一文字ASPOSE。

以上為Aspose裡插入文字時的做法。

那如果是多筆文字的話在Word Tamplate要使用TableStart/TableEnd 如下所示:
«TableStart:NameList»
     «Name»
«TableEnd:NameList»

在程式中
DataTable NameList = new DataTable("NameList");

        NameList.Columns.Add("Name");

        // set row data 
DataRow dr = NameList.NewRow();
        dr["Name"]="Name1";
        NameList.Rows.Add(dr);

dr["Name"]="Name2";
NameList.Rows.Add(dr);

ds.Tables.Add(NameList );
        docTemplate.MailMerge.ExecuteWithRegions(ds);
這樣便可以將多筆資料內容,一筆一筆的填入。

重點來了, 本旨想要解釋的圖片呢?
Word Tamplate要使用Table,這一點和上面多筆文字內容一樣要使用table, 但是在Word的功能變數內容有些不同。如果是圖面要使用[Image:]這個特別的識別Tag
«TableStart:NAMELIST»
     «NAME»
     «Image:Picture»
«TableEnd:NAMELIST»

在程式中
        DataTable NameList = new DataTable("NameList");

        NameList.Columns.Add("Name");
        NameList.Columns.Add("Picture", typeof(Byte[]));// Byte Image

        // set row data 
        DataRow dr = NameList.NewRow();
        dr["Name"] = "Name1";
        byte[] myByteArray = GetImageFile(PK); //try to get the Image file
        dr["Picture"] = myByteArray;
        NameList.Rows.Add(dr);

        dr["Name"] = "Name2";
        byte[] myByteArray = GetImageFile(PK2); //try to get the Image file
        dr["Picture"] = myByteArray;
        NameList.Rows.Add(dr);

        ds.Tables.Add(NameList);
        docTemplate.MailMerge.ExecuteWithRegions(ds);

        //this part for Bind Image
        DocumentB起彼落uilder builder = new DocumentBuilder(docTemplate);
        ReportingEngine engine = new ReportingEngine();

        engine.BuildReport(docTemplate, ds, "ds");

請加入此Class
public class HandleMergeImageFieldFromBlob : IFieldMergingCallback
{
    void IFieldMergingCallback.FieldMerging(FieldMergingArgs e)
    {

    }

    /// <summary>
    /// This is called when mail merge engine encounters Image:XXX merge field in the document.
    /// You have a chance to return an Image object, file name or a stream that contains the image.
    /// </summary>
    void IFieldMergingCallback.ImageFieldMerging(ImageFieldMergingArgs e)
    {
        if (e.FieldValue == null || e.FieldValue is System.DBNull) return;
        // The field value is a byte array, just cast it and create a stream on it.

        MemoryStream imageStream = new MemoryStream((byte[])e.FieldValue);
        // Now the mail merge engine will retrieve the image from the stream.

        e.ImageStream = imageStream;

        e.ImageHeight.Value = 166;
        e.ImageWidth.Value = 250;
    }
}