顯示具有 程式語言 標籤的文章。 顯示所有文章
顯示具有 程式語言 標籤的文章。 顯示所有文章

2021年11月9日 星期二

POSTGRE SQL 想使用變數去定義一段日期區間, 但遍尋不到像是在 MSSQL 時常用的 DECLARE @count int, @x int, @y nvarchar(10)...

想到一招利用 CTE 方式去定義一個這樣類似變數的作法來實現...

原來的script

with

cte_order_11month(uuid ,counts)

as (

--前11個月的所有訂購

select 

c.uuidcount(1) 

FROM ecorder e 

LEFT JOIN customer c ON c.id=e.customer_id 

 WHERE e.ecorder_source NOT IN ('11','12','14','15','16')

       and e.ecorder_date >= current_date - interval '1 month' * 12

       and e.ecorder_date <  to_date(to_char(current_date'yyyy/MM')||'/01''yyyy/MM/dd')

GROUP BY c.uuid

HAVING count(1)>0

)
....

上面code裡的current_date 是系統定義的當天, 若要想要改變日期, 就要在許多用到 current_date 的地方置換掉, 變為你要的日期....這對我來說真是痛點啊...

試著玩了一下底下的寫法..

with

v_test(start_date)

as (

select to_date('2021-10-1' , 'yyyy-mm-dd')

--select current_date

),

cte_order_11month(uuid ,counts)

as (

--前11個月的所有訂購

select 

c.uuid, count(1) 

FROM ecorder e 

LEFT JOIN customer c ON c.id=e.customer_id 

WHERE e.ecorder_source NOT IN ('11','12','14','15','16')

       and e.ecorder_date >= (select start_date from v_test) - interval '1 month' * 12

       and e.ecorder_date <  to_date(to_char((select start_date from v_test), 'yyyy/MM')||'/01', 'yyyy/MM/dd')

GROUP BY c.uuid

HAVING count(1)>0

)
....


以上面片段Script 為例 e.ecorder_date >= (select start_date from v_test), 其中select start_date from v_test 就是去我們自定義的v_test中的 start_date, 取出值來後, 再接著處理..

那這樣不就是變相的可以使用變數, 來完成這段 script 查詢嗎? 帥啦~

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'

紀錄一下~

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;
    }
}

2017年12月5日 星期二

[程式類]C# 產生HTML的行事曆格式 how to create a calendar in html.

有時只是想要在網頁上顯示一個月有哪些內容~並不是真正的要搞個行事曆系統出來, 此時可以用用這個,只是產出HTML語法; 丟到client端上的某個table 的 innerHTML 就可以了~

this function just generates the HTML of a calendar.  Using <table> <tr><td> tag.



public string GetCalendarDetail(string tmpYear, string tmpMonth)
{
string tmpStr = "";

tmpYear = "2017";
tmpMonth = "12";

int MonthDayCount = DateTime.DaystmpMonth(int.Parse(tmpYear), int.Parse(tmpMonth));

tmpStr = "<table class='table table-bordered my_table my_class_table'><tr style='height:13px;font-size:16px;'>";

int i, j, tmpDay = 1;
DateTime tmpDate;
int StartWeekDay = Convert.ToInt16(Convert.ToDateTime(tmpYear + "/" + tmpMonth + "/01").DayOfWeek);
tmpDay = tmpDay - StartWeekDay;
for (j = 1; j <= StartWeekDay; j++)
{
tmpStr += "<td></td>";
}
j = j - 1;
for (i = 1; i <= MonthDayCount; i++)
{
//Head
tmpDate = Convert.ToDateTime(tmpYear + "/" + tmpMonth + "/" + i);
if ((i + j) % 7 == 1)
{
tmpStr += "</tr>";
//Body
if (StartWeekDay == 0 && i == 1)
tmpStr = tmpStr.Replace("<tr style='height:13px;font-size:16px;'></tr>", "");
else
{
tmpStr += "<tr style='height:70px;font-size:12px;'>";
for (int k = 1; k <= 7; k++, tmpDay++)
{
tmpStr += "<td>";
if (tmpDay >= 1 && tmpDay <= MonthDayCount)
{
//tmpDaty is the Date
tmpStr += tmpDay.ToString();
}
tmpStr += "</td>";
}
tmpStr += "</tr>";
}
}
tmpStr += "<td>" + tmpDate.ToString("MM/dd") + "(" + tmpDate.DayOfWeek.ToString() + ")</td>";
}

//fill the qup
if (i + StartWeekDay <= 36)
for (int x = i + StartWeekDay; x <= 35; x++)
tmpStr += "<td></td>";
else if (i + StartWeekDay > 36)
for (int x = i + StartWeekDay; x <= 42; x++)
tmpStr += "<td></td>";

tmpStr += "<tr style='height:70px;font-size:12px;'>";
for (int k = 1; k <= 7; k++, tmpDay++)
{
tmpStr += "<td>";
if (tmpDay >= 1 && tmpDay <= MonthDayCount)
{
//tmpDaty is the Date
tmpStr += tmpDay.ToString();
}
tmpStr += "</td>";
}
tmpStr += "</tr>";

tmpStr += "</td></table>";

return tmpStr;
}

2017年1月6日 星期五

[程式類]PLSQL查詢工作日; plsql how to get business days

若在PLSQL想要查詢所傳日期參數月的所有工作天,則使用以下方法達成

WITH ALLWorkDate as
(
    select allday workday from (
        select allday from (
            select to_date(to_char(TO_DATE(:tdate,'YYYY/MM/DD'),'yyyy-mm')||'-01','yyyy-mm-dd')+rownum-1 allday
            from
                (select to_date(to_char(TO_DATE(:tdate,'YYYY/MM/DD'),'yyyy-mm')||'-01','yyyy-mm-dd'),to_date(add_months(to_date(to_char(TO_DATE(:tdate,'YYYY/MM/DD'),'yyyy-mm')||'-01','yyyy-mm-dd'),'yyyy-mm-dd'),1) from dual)
            connect by rownum <= add_months(to_date(to_char(TO_DATE(:tdate,'YYYY/MM/DD'),'yyyy-mm')||'-01','yyyy-mm-dd'),1)-to_date(to_char(TO_DATE(:tdate,'YYYY/MM/DD'),'yyyy-mm')||'-01','yyyy-mm-dd')
        ) where 1=1
            and to_char(allday,'D') >1
            and to_char(allday,'D') <7
            and allday not in (select Holiday from EBHoliday where to_char(Holiday,'yyyy-mm') = to_char(TO_DATE(:tdate,'YYYY/MM/DD'),'yyyy-mm'))
        order by allday desc
    )aa
),LastWorkDate as
(
    select workday
    from ALLWorkDate
    where rownum = 1
),Last2WorkDates as
(
    select workday
    from ALLWorkDate
    where rownum <= 2
)

其中ALLWorkDate會將所有該月的日期撈出,再去掉在'假日檔'裡的日期;
我遇到的題目是最後一個工作日, 及最後兩個工作日..
所以利用反向排序後, 再用rownum指定是一筆, 還是兩筆...

[程式類]-PLSQL(oracle)中字字碼RDAP 字數算錯

在PLSQL 若採用RDAP 想輸出固定字數的字元時我們通常採用;

LDAP(Col, 10, ' ')

Col指的是欄位,
10表示固定10碼
' '表示要填不足碼的值
LDAP指左補' ',表示此欄位靠右;RDAP則反之

但是若Col裡的值是中文字時, 這時就要注意"難字"的問題

例:

LDAP('這是測式堃',10,' ')

這時它會誤判堃這個字,會造成所要的結果和你想的不一樣,

中文若要輸出固字的字數,則要使用DECode方法來避免這個問題產生

RPAD(DECODE('這是測式堃', NULL, ' ' , '這是測式堃'), 10, ' ')

2015年5月7日 星期四

[程式類]-JQuery iframe 底下同名(name)多物件的選取方式

通常我們使用JQuiry來選擇一些物件, 若網頁內文有iframe, 同時底下又一堆input box要選取..

這個時候要怎麼辦呢?

請利用contents()

$("#iframe_1").contents().find("input[name='Memo']").each(function(index){
alert($this.val());
});


[程式類]-JQuery .each 迴圈如何停止

在網頁上, 我們時常使用JQuery選擇器來做畫面上的檢核。尤其在畫面很複雜,輸入的欄位取相同的名稱時更常用到.each()這個迴圈功能,來判斷類似欄位的長度大小,數值等等。

舉個小小的例子, 在程式要送出之後, 做完檢查之後, 若發現在有長度超過的情況, 則彈出警示視窗, 並且停留在本頁。

以下為Javascritp中應用Jquery的程式碼:

dofrmSubmit()   {
if(!ChkFields()){return;}

frm1.submit();
}

function ChkFields()   {
$('input[name=Memo]').each(function(index){
if($(this).val().length >= 19)   {
alert("所輸入文字不得超過19個字元!!請查核!!");
return false;       //quit .each() loops
}
});

if($('input[name=Money]').val()=="") {
alert("請輸入金額欄位!");
return false;
}
}

在畫面上我們故意打了金額(Money),  但是在備註欄位(Memo)故意找其中一個, 打入長度過長的測試字串;

但為何使用了檢核後, 程式也照實的跳出警示訊息, 但是奇怪的地方來了...這一頁怎麼還被送出了呢?

原因在要跳出.each 的迴圈, return false; 是讓他中斷整個迴圈,話說程式檢查到問題,也中斷了,但是第二段ChkFileds()並沒有真的return false; (因為被.each用掉了)

所以在這裡要多設計一個flag,如果整個.each中有問題, 要把這個flag設定成true, 如下所示..

function ChkFields()   {
var CheckFailed = false;
$('input[name=Memo]').each(function(index){
if($(this).val().length >= 19)   {
alert("所輸入文字不得超過19個字元!!請查核!!");
CheckFailed = true;
return false; //跳出.each
}
});
if(CheckFailed == true)   {
return false;                     //ChkFields傳回 false;
}

if($('input[name=Money]').val()=="") {
alert("請輸入金額欄位!");
return false;
}
}

可以看到我檢核的部分加上紅色字體的部份,再多上一個flag(CheckFailed )來紀錄是否曾經有誤, 而利用這個flag, 判斷後再傳回false, 來達成這整個的效果~~

否則, 第一個出現的return false, 僅僅是跳出.each loop而已哦~~



POSTGRE SQL 想使用變數去定義一段日期區間, 但遍尋不到像是在 MSSQL 時常用的 DECLARE @count int, @x int, @y nvarchar(10)... 想到一招利用 CTE 方式去定義一個這樣類似變數的作法來實現... 原來的script w...