2010年11月4日 星期四

使用JavaScpript計算日期(幾年後、幾月後、幾天後)

使用JavaScpript計算日期(幾年後、幾月後、幾天後)

在使用JS時,
有時候可能會需要計算到期日,
就是就會某天,再加上某個天數(或年或月)後,
計算出來的日期。
在SQL裡,有DATEADD的函式;
在.Net裡,有DateTime.AddDays等函式;
而若要在JS計算的話,該如何實現呢??

主是要使用setYear()setMonth()setDate()

不過呢,這方法它的計算邏輯與.net及SQL的不太相同
不相同的地方就是在於大小月的處理方式

SQL的大小月處理及潤年

JavaScript的大小月處理及潤年


由上圖可知,JavaScript的潤年規則還是有的~~
不過,在計算跨月處理大小月時的邏輯,是會將多餘的天數累加上去的~~這點請注意。

至於.Net的呢,邏輯是與SQL相同。

程式碼參考如下:

//轉成日期格式
var orgDay = new Date("1983/4/29");
orgDay.setMonth(orgDay.getMonth() + 2);//加月份

//以下則為取出年、月、日
var d = orgDay.getDate();
var Y = orgDay.getFullYear();//此方法才可以確實的支援FX、IE、Chrome各大瀏覽器
var M = orgDay.getMonth() + 1;//月份是由0開始計算,也就是一月的話,取出的值會是0

if (d < 10) { d = "0" + d; } //設定日期若為個數則加0
if (M < 10) { M = "0" + M; } //設定日期若為個數則加0

//設定為1983/06/29的日期格式
var OkDay = Y + "/" + M + "/" + d;



抓取年份時,請採用getFullYear()。不要太直覺性的使用getYear(),
該方法會在FireFox及Chrome上發生問題~~
例如應該回傳2010的值,會變成「110」。
這110,是從「2010-1900」計算而來的~~~

2010年8月17日 星期二

使用RSClientPrint直接列印RS報表

使用RSClientPrint直接列印RS報表


一般而言,當我們想要列印RS報表時,
都是先將報表另存下來後,再開啟檔案列印的。

原來,Report Services早就幫我們想好這點了,
它提供了一個叫「RSClientPrint」的cab元件,
直接執行JavaScript就可以列印報表了!!

雖然在很早以前就以前提供了,但這時候,也需特別注意環境,
也就是SQL Server的版本,在這邊,以SQL 2005為例。
在SQL 2005最初版來說,有被攻擊的危險,
所以,在某次系統安全性更新後,該功能會被拿掉,必須再去升級才行使用。
當然,如果允許的話,建議將其升級為最新版本的最好囉。(目前為SP3)

以目前來說,至少需為SQL Server 2005 SP2 的版本才能列印,
至少必須確定
C:\Program Files\Microsoft SQL Server\MSSQL.2\Reporting Services\ReportServer\bin\RSClientPrint.cab
2008/8/5之後的版本才行。
若不是的話,可能是有些更新沒有裝到。試著安裝此更新

環境都確定好後,就可以開始實作了。

程式碼參考如下:(其實這段,網路上一堆,到處都可以copy的到)

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="RSClientPrint.aspx.cs" Inherits="RSClientPrint" %>
<!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">
<head runat="server">
<title>未命名頁面</title>

<script type="text/javascript" language="javascript">
function Print()
{
alert('進入列印');

if (typeof RSClientPrint.Print == "undefined") 
{
   alert("Unable to load client print control.");
   return;
}
//邊界
RSClientPrint.MarginLeft = 0;
RSClientPrint.MarginTop = 0;
RSClientPrint.MarginRight = 0;
RSClientPrint.MarginBottom = 0;

//繁體中文
RSClientPrint.Culture = 2052;
RSClientPrint.UICulture = 2052;

//預設為A4
//如果 PageWidth 大於 PageHeight,列印方向就會設定為 [橫向]。 否則,就會設定為 [縱向]。
RSClientPrint.PageHeight = 297;
RSClientPrint.PageWidth = 210;

RSClientPrint.Authenticate = true;

RSClientPrint.Print('http://localhost/ReportServer', '/TestPage', 'TestPage')
}
</script>

</head>
<body>
    <object style="display: none;" id="RSClientPrint" classid="CLSID:0D221D00-A6ED-477C-8A91-41F3B660A832"
        codebase="RSClientPrint.cab#Version=2005,90,4053,00" VIEWASTEXT>
    </object>
    <form id="form1" runat="server">
        <div>
                 <asp:Button ID="Button1" runat="server" Text="列印" OnClientClick ="Print();return false;" />
        </div>
    </form>
</body>
</html>



有個地方需要注意一下。classid 及 codebase 這邊:
  1. Version」也請參考該元件裡的RSClientPrint.inf內的版次。(不過,有測試過,就算拿掉也可以用)
  2. CLSID:0D221D00-A6ED-477C-8A91-41F3B660A832」也請參考RSClientPrint.inf的資料
  3. codebase」將指向該元件檔案的位置,由於這邊我是將網頁及元件放在同個目錄下。請配合調整。
如果值亂改的話,會導致元件安裝不正常。如下圖


倘若設定都正常的話,執行該網頁,則會看到以下畫面:

想用的話,當然只能選擇「安裝」
安裝完後,按下列印,即會彈出列印方塊。按下「確定」就可以列印囉~~
或者可以點選「預覽」功能。(我的測試報表字好像有點小)

微軟的說明文件:在自訂應用程式中使用 RSClientPrint 控制項
另外,此方法…只能支援IE瀏覽器。





2010年7月7日 星期三

安裝Visual Studio 2010

安裝Visual Studio 2010


系統硬碟空間:至少7.4GB(Ultimate)
系統安裝期間,會有三次的「重新開機」,若電腦目前有在作業而不方便重開的話,
建議暫時不要安裝。等電腦閒置時,再裝。



安裝完 .Net 4.0後,馬上要求重新開機。

又要重開?

即將開始一段冗長的等待…

按完「完成」後,又要重開機。

啟動畫面

環境設定

耶~~VS2010 入手~~


2010年6月11日 星期五

線上列印-Word

線上列印-Word


這個功能呢~~
主要就是可以讓使用者在線上列印我們Web應用程式產生的Word。
而不用讓使用者自行下載下來後,再開啟Word來列印。

首先,必須先「加入參考
之後,便會再「Web.Config」上,看到自動幫你新增的一行組件資訊

<add assembly="Microsoft.Office.Interop.Word, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"/></assemblies>

那這邊,也來說明一下目前我的程式流程!

1 載入指定目標路徑的「範本檔案
2 將範本檔案進行修改:(使用第三方元件:Aspose.Word)
  • 從資料庫撈對應的資料至Word裡對應的「功能變數」
  • 再另存修改後的檔案至指定路徑
3 由指定路徑載入Word檔進行列印作業
4 刪除指定路徑的Word檔

以下的程式碼,為執行列印作業的範例:
主要方法是在「PrintOut」,它的列印格式可以很活。詳細可參考Document.PrintOut 方法


        //物件宣告
        Microsoft.Office.Interop.Word.Application app = null;
        Microsoft.Office.Interop.Word.Document doc = null;
        object oMissing = System.Reflection.Missing.Value;
        object templateFile = "指定路徑:欲列印的檔案";

        //繫結Word檔
        app = new Microsoft.Office.Interop.Word.ApplicationClass();
        doc = app.Documents.Add(ref templateFile, ref oMissing, ref oMissing, ref oMissing);

        //列印參數設定
        object oBackground = false;//true 表示當 Microsoft Office Word 列印文件時,繼續執行自訂程式碼。
        object oRange = WdPrintOutRange.wdPrintAllDocument;//頁面範圍。
        object oOutputFileName = oMissing;//如果 PrintToFile 為 true,這個引數會指定輸出檔的路徑和檔名。
        object oItems = WdPrintOutItem.wdPrintDocumentContent;//要列印的項目。
        object oCopies = 1;//要列印的份數。
        object oPages = "";//要列印的頁數和頁面範圍,以逗號分隔。例如,「2, 6-10」是表示列印第 2 頁以及第 6 到第 10 頁。
        object oPageType = WdPrintOutPages.wdPrintAllPages;//要列印的頁面類型。
        object oPrintToFile = false;//true 表示將印表機指令傳送至檔案。請確定使用 OutputFileName 指定檔案名稱。
        object oCollate = true;//當列印文件的多份複本時,true 表示先列印文件的所有頁面,再列印下一份複本。(自動分頁)
        object oManualDuplexPrint = false;
        object oPrintZoomColumn = 0;
        object oPrintZoomRow = 0;
        object oPrintZoomPaperWidth = 0;
        object oPrintZoomPaperHeight = 0;
        object oTrue = true;
        object oFalse = false;
    
        
        //釋放物件用
        object m_sc = 0;
        object m_of = oMissing;
        object m_rd = oMissing;


        //執行列印
        doc.PrintOut(ref oBackground, ref oFalse, ref oRange, ref oOutputFileName, ref oMissing, ref oMissing, ref oItems, ref oCopies, ref oPages, ref oPageType, ref oPrintToFile, ref oCollate, ref oMissing, ref oManualDuplexPrint, ref oPrintZoomColumn, ref oPrintZoomRow, ref oPrintZoomPaperWidth, ref oPrintZoomPaperHeight);

        
        // 關閉 Word 物件
        if (app != null)
        {
            app.Quit(ref m_sc, ref m_of, ref m_rd);
        }
        // 釋放文件
        if (doc != null)
        {
            doc = null;
        }
        // 釋放 Word 物件
        app = null;



請注意~~~
這個是因為IIS在執行MS Word時,發生權限不足的問題~
必須在Web.Config中,設定讓ASP.NET實作「本機模擬」

<compilation debug="true">

若要進一步設定,可參考如何在 ASP.NET 應用程式中實作模擬

當然,指定模擬的話,需要注意,在「主控台根目錄/元件服務/電腦/我的電腦(右鍵內容)/COM安全設定/存取權限
裡面有指定的帳戶。

開啟主控台根目錄方式:
1 執行:DCOMCNFG.EXE
2 控制台->系統管理工具->元件服務