2010年12月31日 星期五

.NET 網頁自動輸入及Submit form

記錄一下.net要怎麼連外部網頁並進行自動輸入與Submit form

先加入namespace
Imports System.Net

Dim wbBrowser As New WebBrowser()

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
   '加入瀏覽器正在轉址時的event
   AddHandler wbBrowser.Navigating, AddressOf wbBrowser_Navigating
   '加入瀏覽器轉址完成的event
   AddHandler wbBrowser.Navigated, AddressOf wbBrowser_Navigated
End Sub

Private Sub wbBrowser_Navigating(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserNavigatingEventArgs)
   '當網頁按鈕click flag為true,且發生轉址時
   If WebSubmit = True Then
      '設定瀏覽器轉址狀態flag
      WebNavigating = True
      '清除網頁按鈕click flag
      WebSubmit = False
   End If
End Sub

Private Sub wbBrowser_Navigated(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserNavigatedEventArgs)
   '當瀏覽轉址狀態flag為true,且已轉址完成時
   If WebNavigating = True Then
      '取得結果頁的內容
      GetResult()
      '清除瀏覽器轉址狀態
      WebNavigating = False
   End If
End Sub

'/***等待瀏覽器處理完成***/
Private Sub WaitForResponse()
   '如果Browser的狀態還未準備好,就繼續處理
   Do Until wbBrowser.ReadyState = WebBrowserReadyState.Complete
      Application.DoEvents()
   Loop
End Sub

'/***輸入網頁控制項的內容***/
Private Function InputControl(ByVal ControlName As String, ByVal ControlValue As String) As Boolean
   Try
      '取得網頁中的控制項並給其值
      '前提是控制項要有設Name屬性才能用此方式抓到
      '否則就要用wbBrowser.Document.getElementById method
      wbBrowser.Document.Body.All(ControlName).InnerText = ControlValue
      Return True
   Catch ex As Exception
      Return False
   End Try
End Function

'/***執行網頁按鈕的click動作***/
Private Function SubmitForm() As Boolean
   Try
      '因為目標網頁的Submit button沒有Name和ID屬性
      '所以只好用TagName來取得所有的Input物件
      '再判斷其type屬性是Submit的執行click動作
      Dim InputObjs As HtmlElementCollection = wbBrowser.Document.Body.GetElementsByTagName("input")

      For e As Integer = 0 To InputObjs.Count - 1
         Dim btnSubmit As HtmlElement = InputObjs(e)
         If btnSubmit.GetAttribute("type").ToString().ToUpper() = "SUBMIT" Then
            '設定網頁按鈕click flag
            WebSubmit = True
            btnSubmit.DomElement.click()
            e = InputObjs.Count
         End If
      Next
      Return True
   Catch ex As Exception
      Return False
   End Try
End Function

'/***取得網頁內容***/
Private Sub GetResult()
   Dim strWholeBody As String = wbBrowser.Document.Body.InnerHtml
   ...
End Sub

Private Sub btnCheck_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCheck.Click
   '連到目標網頁()
   wbBrowser.Navigate(tbUrl.Text)

   '等待網頁回應
   WaitForResponse()

   '將值填入目標控制項
   If InputControl("check", tbValue.Text) = True Then
      '送出 Form
      SubmitForm()
   End If
   '如果瀏覽器還在轉址狀態,就繼續讓瀏覽器處理
   While WebNavigating
      Application.DoEvents()
   End While
End Sub

2010年12月20日 星期一

SQL Server 2005 自動識別欄位檢視表

今天查了一下 SQL Server 2005 的自動識別欄位
發現每個 DB 下都有個系統 View 可以查詢

SELECT * FROM sys.identity_columns

name 代表欄位名稱
seed_value 代表初始值
increment_value 代表遞增值
last_value 代表最終值

參考 TechNet

2010年8月31日 星期二

ASP 操作 Excel 簡單範例 (三)

補充一些小東東

<%
   '// A1~C1 合併放入 "Header" 字樣
   Set HeaderRange = xlSheet.Range("A1:C1")
   HeaderRange.MergeCells = true
   xlSheet.Cells(1,1) = "Header"

   '// 設定A1背景色 (15=淺灰色)
   Set MergeHeaderRange = xlSheet.Range("A1")
   MergeHeaderRange.Interior.ColorIndex = 15

   '// 設定第一行為日期格式
   Set AColRange = xlSheet.Range("A:A")
   AColRange.NumberFormatLocal = "yyyy/mm/dd"

   '// 隱藏第四行
   Set DColRange = xlSheet.Range("D:D")
   DColRange.Columns.Hidden = true

   '// 將第一列凍結視窗
   xlSheet.Cells(2,1).Select
   xlApp.ActiveWindow.FreezePanes = true
%>

參考前篇:ASP 操作 Excel 簡單範例(二)

T-SQL Like 的小玩意兒

偶然發現 T-SQL Like 的一個小玩意兒
所以記錄一下

SELECT * FROM TableA
WHERE Col1 LIKE '[TB]est%' --查詢出來以 'Test' 開頭或 'Best' 開頭的資料

在一些情況下, 善用這個方式, 就不用一直 LIKE OR LIKE 了

2010年8月26日 星期四

ASP Function Variable

最近 ASP 自訂 Function 的結果不如預期
測了一下, 發現是 Variable 的問題
所以記錄一下

<%
   function BadFunction(a)
      Dim a1
      a1 = a
      a1 = a1 + 1
      BadFunction = a
   end function

   function GoodFunction(a)
      Dim a1
      a1 = a + 1
      GoodFunction = a1
   end function

   Variable_Bad = 2
   Variable_Good = 2
   response.write "Variable_Bad : " & Variable_Bad & "<br>"
   response.write "BadFunction : " & BadFunction(Variable_Bad) & "<br>"
   response.write "Variable_Bad : " & Variable_Bad & "<br>"
   response.write "Variable_Good : " & Variable_Good & "<br>"
   response.write "GoodFunction : " & GoodFunction(Variable_Good) & "<br>"
   response.write "Variable_Good : " & Variable_Good & "<br>"
%>

輸出如下:
Variable_Bad : 2
BadFunction : 3
Variable_Bad : 3                      ---> function 外的變數也被改變了
Variable_Good : 2
GoodFunction : 3
Variable_Good : 2

依結果看來
變數似乎是傳址 (Call by address), 而非傳值 (Call by value)
以致於如果 function 內直接對 input 變數做任何異動時
function 外的變數也會隨之改變

所以最好宣告另一個變數, 儲存 input 變數處理後的結果
不要直接處理 input 變數...

2010年8月24日 星期二

ASP.NET 以 Stream 方式下載 Excel

ASP.NET 轉存 Excel
可以先使用 Microsoft Office.Interop.Excel 元件產生並另存 Excel
再利用 Stream 方式將新建的 Excel 供使用者下載

下面是以 Stream 方式下載已存在的 Excel  的 Sample Code :
protected void OutputExcel(Excel_RelPath)
{
   string Excel_PhyPath = Server.MapPath(Excel_RelPath);
   FileInfo fi = new FileInfo(Excel_PhyPath );
   if (fi.Exists)
   {
      FileStream fs = new FileStream(ExcelName, FileMode.Open);
      long FileSize = fs.Length;

      // 將 Excel 內容以 Binary 方式存入 Buffer 變數
      byte[] Buffer = new byte[(int)FileSize];
      fs.Read(Buffer, 0, (int)FileSize);
      fs.Close();

      Response.AddHeader("Content-Disposition", "attachment;
         filename=" + fi.Name);
      Response.ContentType = "application/octet-stream";

      Response.BinaryWrite(Buffer);
      Response.Flush();
   }
}

2010年8月3日 星期二

ASP 操作 Excel 簡單範例 (二)

又遇到一些新東東
查得我死去活來
所以在這邊記錄一下

<%
   ' 建立圖表 left:10, top:10, width:640, height:320
   Set MyChart = xlApp.ActiveSheet.ChartObjects.Add(10,10,640,320)

   ' 圖表類型為資料標記折線圖
   MyChart.Chart.ChartType = 65

   ' /* 設定圖表資料來源 */
   ' [參數1]: 資料範圍
   ' [參數2]: 1代表以列取數列 / 2代表以欄取數列
   MyChart.Chart.SetSourceData xlSheet.Range("A1:D10"),2

   ' /* X軸文字以日期格式顯示, 字型大小8 */
   ' [參數]: XlAxisType, 1代表xlCategory(X軸) / 2代表xlValue(Y軸)
   Set XAxes = MyChart.Chart.Axes(1)
   XAxes.TickLabels.NumberFormat = "m/d"
   XAxes.TickLabels.Font.Size = 8

   ' Y軸文字字型大小8
   Set YAxes = MyChart.Chart.Axes(2)
   YAxes.TickLabels.Font.Size = 8

   ' /* 圖示置上, 字型大小8 */
   ' [Position參數]: XlLegendPosition
   MyChart.Chart.Legend.Position = -4160
   MyChart.Chart.Legend.Font.Size = 8

   ' 移除多餘的數列
   MyChart.Chart.SeriesCollection(3).Delete
   MyChart.Chart.SeriesCollection(1).Delete

   ' /* 設定數列顏色 */
   ' 設定數列線條為紅色(ColorIndex=3)
   MyChart.Chart.SeriesCollection(1).Border.ColorIndex=3
   ' 設定數列前景色為黑色(ColorIndex=1)
   MyChart.Chart.SeriesCollection(1).MarkerForegroundColorIndex=1
   ' 設定數列背景色為紅色(ColorIndex=3)
   MyChart.Chart.SeriesCollection(1).MarkerBackgroundColorIndex=3
%>

參考資料:
Chart Type Enumeration : Toolbox.com
XlAxisType Enumeration : MSDN
XlLegendPosition Enumeration : MSDN
ColorIndex : MSDN

參考前篇 : ASP 操作 Excel 簡單範例
參考下篇 : ASP 操作 Excel 簡單範例(三)

2010年7月29日 星期四

ASP FileSystemObject Sample

<%
   Set fs = Server.CreateObject("Scripting.FileSystemObject")

   ' Create new folder
   if fs.FolderExists("C:\Test2") = false then
      fs.CreateFolder "C:\Test2"
   end if

   ' Copy files
   Set SourceFolder = fs.GetFolder("C:\Test1")
   Set SourceFiles = SourceFolder.files
   if SourceFiles.Count > 0 then
      fs.CopyFile "C:\Test1\*.*", "C:\Test2"
   end if
   Set SourceFiles = nothing
   Set SourceFolder = nothing

   ' Show files name
   Set TargetFolder = fs.GetFolder("C:\Test2")
   for each x in TargetFolder.files
      response.write x.Name & "<br>"
   next
   Set TargetFolder = nothing

   ' Delete jpg files
   fs.DeleteFile("C:\Test2\*.jpg")

   Set fs = nothing
%>

參考 W3CSchools

2010年7月16日 星期五

SQL Server 的 BINARY_CHECKSUM

為了 Update data 的效能及減少 Log 檔大小
在 Update 之前都要先檢查資料是否有異動
一檢查可能就是十幾個欄位在做 Equal to 的比較

SQL Server 本身提供一個 BINARY_CHECKSUM 的 function
input 幾個欄位, 它就會算出這些欄位值的 Check Sum (整數)
所以只要比對 Check Sum 是否相等, 即可知道是否有異動

用法如下
SELECT * FROM TableA, TableB
WHERE TableA.ID = TableB.ID
AND BINARY_CHECKSUM(TableA.Col1,TableA.Col2) <>
BINARY_CHECKSUM(TableB.Col1,TableB.Col2)

參考 TechNet

2010年7月2日 星期五

取得SQL Sever 剛產生的自動編號

如果在SQL Server 中
使用自動編號欄位(int ,自動識別)當Pkey
常會遇到Insert Data 後,要再Update Data 時
不知道Pkey 是多少

剛好查到了一個方法可以使用
SELECT @@Identity

這個語法可以查出這次Connection 中最後產生的自動編號

2010年6月24日 星期四

新增/移除select內的option

在這邊記錄一下 Javascript 如何新增 / 移除 select 內的 option
<input type="text" id="myText">
<input type="button" value="Add text to select"
      onclick="AddText()">
<br>
<select id="mySelect"></select>
<br>
<input type="button" value="Remove text from select"
      onclick="RemoveOption()">

<script language="javascript">
   function AddText()
   {
      var myText = document.getElementById("myText");
      var mySelect = document.getElementById("mySelect");
      var NewOption = document.createElement("option");
      NewOption.text = myText.value;
      NewOption.value = myText.value;
      try {
         mySelect.add(NewOption,null); //其他瀏覽器
      }
      catch (ex) {
         mySelect.add(NewOption); //IE
      }
   }

   function RemoveOption()
   {
      var mySelect = document.getElementById("mySelect");
      for (i=mySelect.options.length-1; i>=0; i--)
      {   //倒過來移除 options
         if (mySelect.options[i].selected)
            mySelect.remove(i);
      }
   }
</script>

兩個複選下拉選單互相搬移 option 的 Sample
<table border="0">
   <tr>
      <td>
         <select id="LeftPool" multiple size="5">
            <option value="1">Line 1</option>
            <option value="2">Line 2</option>
            <option value="3">Line 3</option>
         </select>
      </td>
      <td align="center">
         <input type="button" value=" → "
            onclick="MoveOption('LeftPool', 'RightPool')">
         <br><br>
         <input type="button" value=" ← "
            onclick="MoveOption('RightPool', 'LeftPool')">
      </td>
      <td>
         <select id="RightPool" multiple size="5">
         </select>
      </td>
   </tr>
</table>

<script language="javascript">
   function MoveOption(FromPool, ToPool)
   {
      var FromPool = document.getElementById(FromPool);
      var ToPool = document.getElementById(ToPool);
      for (i=0; i<FromPool.options.length; i++)
      {
         if (FromPool.options[i].selected)
         {
            var NewOption = document.createElement("option");
            NewOption.text = FromPool.options[i].text;
            NewOption.value = FromPool.options[i].value;
            try {
               ToPool.add(NewOption,null);
            }
            catch (ex) {
               ToPool.add(NewOption);
            }
         }
      }
      for (i=FromPool.options.length-1; i>=0; i--)
      {
         if (FromPool.options[i].selected)
            FromPool.remove(i);
      }
   }
</script>

2010年6月15日 星期二

HtmlEncode 及 HtmlDecode

因為資料庫編碼的關係
有時候需要將資料先編碼後再存入
而取出來時, 則需將資料再解碼

所以記錄一下 .NET 的 Server.HtmlEncode() 及 HtmlDecode() 作用
   //寫入DB前,先將資料編碼
   string A = Server.HtmlEncode("は");
   //存入DB的資料為 '&#12399;'

   //讀出資料為'&#12399;',將資料解碼
   string A = Server.HtmlDecode(dt.rows[0][0].toString());
   //解碼後資料為'は'

[應用]
1.因為 Outlook 的 Email Subject 不會像 Email Body 一樣
   自動將編碼後的資料自動解碼為 Unicode 資料
   所以如果將編碼後的資料丟給 Outlook Email Subject,
   它就會原封不動的輸出, 以致於主旨會有 &#12399; 這種資料出現

2.Excel 也和 Outlook Email Subject 一樣
   並不會自動解碼, 所以在丟給 Excel 之前
   就要自行先將資料解碼

2010年6月14日 星期一

讓Checkbox 唯讀

因為Checkbox 沒辦法設定Readonly
如果將Checkbox 設定為Disabled , 則Server 又接不到Checkbox 的值
上網查了一下解決的方法
在此記錄一下
<input type="checkbox" checked onclick="return false;">必選選項

2010年6月1日 星期二

ClientScriptManager.RegisterStartupScript 無效

今天在 ASP.Net 網站中寫一個共用程式(common.cs)
想供各頁面引用
結果寫一個簡單的 Javascript Alert() function 就一直死不出來
在這邊記錄一下正確寫法
public void AlertMessage(System.Web.UI.Page page, string ScriptID, string Message)
{
   ClientScriptManager cs = page.ClientScript;
   if (!cs.IsStartupScriptRegistered(typeof(string), ScriptID))
   {
      string Script = "<script language=\"javascript\">";
      Script += " alert(\"" + Message + "\");";
      Script += "</script>"

      sc.RegisterStartupScript(typeof(string), ScriptID, Script);
   }
}

之前是死在我自行宣告的 page 物件
因為 page 物件是我建構出來的
並不是呼叫頁面的 page
RegisterStartupScript 加入的是我自行宣告的 page 物件中
而非原呼叫頁面
所以原呼叫頁面完全沒有這段 script 內容

原錯誤程式如下:
public void AlertMessage(string ScriptID, string Message)
{
   System.Web.UI.Page page = new System.Web.UI.Page();
   ClientScriptManager cs = page.ClientScript;
   if (!cs.IsStartupScriptRegistered(typeof(string), ScriptID))
   {
      string Script = "<script language=\"javascript\">";
      Script += " alert(\"" + Message + "\");";
      Script += "</script>"

      sc.RegisterStartupScript(typeof(string), ScriptID, Script);
   }
}

ASP 操作 Excel 簡單範例

.Net , ASP 操作 Excel 的方式都有些不同
所以在這記錄一下

<%
   ' 建立 Excel 應用程式
   Set xlApp=Server.CreateObject("Excel.Application")
   ' 建立 WorkBook
   Set xlBook = xlApp.Workbooks.Add
   ' 建立 WorkSheet
   Set xlSheet = xlBook.Worksheets.Add

   ' 給儲存格值
   xlSheet.Cells(1,1)="A1"
   xlSheet.Cells(1,2)="B1"

   ' 範圍文字變粗體
   xlSheet.Range("A1:B1").Font.Bold = true
   ' 範圍儲存格設框線
   xlSheet.Range(xlSheet.Cells(1,1),
         xlSheet.Cells(1,2)).Borders.Weight = 2
   ' WorkSheet 自動欄寬
   xlSheet.Columns.Autofit()

   ' 存檔
   xlBook.SaveAs "c:\test.xls"
   xlBook.Close
   xlApp.Quit

   Set xlApp = Nothing
   Set xlBook = Nothing
%>

參考下篇 : ASP 操作 Excel 簡單範例 (二)

2010年5月25日 星期二

ASP 頁面編碼造成自動 Refresh

今天遇到一個超怪的問題
我在ASP前面幾行讀取前頁submit過來的資料
將資料更新回DB

發現更新完成的訊息居然會重複alert 2次

查了好久的網路才查到一點眉目
可能是因為頁面編碼(Charset)的問題

我在HTML head中有寫一行
<meta http-equiv="Content-Type" content="text/html; charset=big5">
但其實這行的意義是指
此頁的表單資料要用什麼編碼方式submit出去
並非是指這頁要用什麼編碼方式顯示
詳見保哥寫的一篇[關於各瀏覽器對網頁與文字編碼的處理規則研究整理]

想要設定本頁要用什麼編碼方式顯示
在ASP中,要使用
<%response.charset = "big5"%>
加上這行,我的ASP就一切正常了

個人推測此次的原因為:

一開始沒有設定本頁顯示的編碼
所以一開始預設用utf-8編碼來顯示本頁資料
直到程式開始讀取DB的資料時
發現DB是用big5編碼儲存資料的
所以瀏覽器自動refresh本頁,改變編碼為big5

而更新DB的程式段剛好又在讀取DB資料之前
造成一開始用utf-8編碼顯示頁面時,進行更新,並alert更新完成的訊息
後來遇到程式讀取DB資料,自動refresh本頁後,不會再次更新,但會再alert更新完成的訊息

以此推論 :
因資料與頁面的編碼不符時
僅會refresh client端頁面資料 (並沒有對server再次發出request)
所以ASP程式段不會重複執行
但是client端的javascript全都會重複執行

但我剛好也有另一支程式也是用這種結構寫的
卻沒有這個問題
所以詳細原因還要在釐清...

另外補充一下 :
在 HTML head 中的程式段
好像不會依改變編碼而重新執行
<html>
   <head>
     <script language="javascript">
        alert("Hello World!");
     </script>
   </head>
   <body>

   </body>
</html>

2010年5月21日 星期五

ASP 讀取網站資料夾下檔案

用 ASP 讀取網站資料夾下所有檔案名稱 (包含子資料夾下的檔案)
function  : GetFiles
input 1 : 網站相對路徑
input 2 : 0 (int)
output : 2D Array
             (0, n) : 檔案的 FullName (包含網站相對路徑)
             (1, n) : 檔案的 Name

<%
   dim TemporaryFiles()
   function GetFiles(Path, FileCount)
      set fs = Server.CreateObject("Scripting.FileSystemObject")
      realfilepath = Server.Mappath(Path)
      if fs.FolderExists(realfilepath) = true then
         set folder = fs.GetFolder(realfilepath)
         ' 將目前資料夾下的檔案名稱放入陣列
         for each f in folder.files
            redim preserve TemporaryFiles(2, FileCount+1)
            TemporaryFiles(0, FileCount) = Path & "/" & f.Name
            TemporaryFiles(1, FileCount) = f.Name
            FileCount = FileCount + 1
         next
         ' 繼續找有沒有子資料夾, 有的話, 遞迴掃裡面的檔案和資料夾
         for each subfolder in folder.SubFolders
            call GetFiles(Path & "/" & subfolder.Name, FileCount)
         next
         set folder = nothing
      else
         redim TemporaryFiles(2, 1)
         TemporaryFiles(0, 0) = ""
         TemporaryFiles(1, 0) = "The path is not exist !"
      end if
      set fs = nothing
      GetFiles = TemporaryFiles
   end function
%>

<%
   ' 呼叫 function
   FileArray = GetFiles("UserUpload", 0)
   for i = 0 to ubound(FileArray,2)
      response.write FileArray(0,i) & <br>
      response.write FileArray(1,i) & <br>
   next
%>

HTML/CSS/Javascript 設定 Table 背景色

常搞不清楚 HTML , CSS , Javascript 設定 Table 背景色的語法
特別在這邊記錄一下

[ HTML ]
使用 bgcolor (table / tr / td 都適用)
範例:
   <table bgcolor="#FF0000" border="1">
      <tr><td>Line 1</td></tr>
      <tr><td>Line 2</td></tr>
   </table>
結果:
Line 1
Line 2


[ CSS ]
使用 background-color (table / tr / td 都適用)
範例:
   <table border="1">
      <tr style="background-color:#00FF00"><td>Line 1</td></tr>
      <tr><td>Line 2</td></tr>
   </table>
結果:
Line 1
Line 2


[ Javascript ]
使用 obj.style.backgroundColor (table / tr / td 都適用)
範例:
   <table border="1">
      <tr><td>Line 1</td></tr>
      <tr><td onmouseover="this.style.backgroundColor='#0000FF'"
                  onmouseout="this.style.backgroundColor=''">
            Line 2
      </td></tr>
   </table>
結果:
Line 1
Line 2

2010年5月18日 星期二

正規表達式彙整

順便整理一下 javascript / vbscript (ASP) / C#
三者的正規表達式使用方式

javascript
宣告var RegObj = /pattern/attribute;
屬性i: case-insensitive / g: global / m: multiline matching
比對RegObj.test(target_string);
return true / false
取出
符合文字
var Result = RegObj.exec(target_string);
搭配g, 可以重複使用exec(), 依序取出符合文字
取代
符合文字
target_string.replace(RegObj,replace_string);
return取代後的文字
搭配Global, 可以將所有符合的文字取代
參考 W3CSchools

vbscript (ASP)
宣告Set RegObj = new regexp
RegObj.Pattern = pattern
屬性RegObj.IgnoreCase = true | false
RegObj.Global = true | false
比對RegObj.test(target_string)
return true / false
取出
符合文字
Set Result = RegObj.execute(target_string)
return一個Collection, 以Result(0) 方式讀取
搭配Global, 可以取出所有符合的文字Collection
取代
符合文字
RegObj.replace(target_string,replace_string)
return取代後的文字
搭配Global, 可以將所有符合的文字取代
參考 MSDN

C#
宣告Regex RegObj = new Regex(pattern[,attribute]);
屬性RegexOptions.IgnoreCase / RegexOptions.Multiline ...
比對RegObj.IsMatch(target_string);
return true / false
取代
符合文字
RegObj.Replace(target_string,replace_string);
return取代後的文字
參考 MSDN, mikesdotnetting

ASP 正規表達式

前面寫了篇 Javascript 正規表達式
這邊當然也要補上一篇 ASP 正規表達式的用法

範例 :
<%
   Pwd = "9901"

   Set RegPwd = new regexp
   RegPwd.Pattern = "^\d{6,8}$"
   RegPwd.IgnoreCase = true  '// 忽視大小寫
  
   if RegPwd.Test(Pwd)=false then
      response.write "Password is error !" & "<br>"
   else
      response.write "Welcome !" & "<br>"
   end if
  
   TestStr = "Welcome 16547 to the show!"
  
   Set RegStr = new regexp
   RegStr.Pattern = "\d"
  
   RegStr.Global = true
   '//true:整個字串進行比對, false:只找出符合的第一個   
   '//Default 為false
  
   Set MatchObj = RegStr.Execute(TestStr)
   For each obj in MatchObj
      response.write obj & "<br>"
   Next
  
   response.write RegStr.Replace(TestStr,"") & "<br>"
  
%>

ASP 動態增加陣列長度

前面寫了篇 Javascript 動態增加陣列長度
這邊順便記錄一下 ASP 動態陣列的使用方式

一般 vbscript 宣告陣列是 dim Arr(10)
要使用動態陣列有 2個步驟

1. dim Arr()  <-- 這邊不要給陣列長度
2. redim [preserve] Arr(a)  <-- 利用 redim 重新定義陣列長度

ps.1 原先用 dim Arr(f) 方式宣告陣列, f 必須為常數, 也就是 1,2,3,...
  而 redim Arr(a) 方式宣告陣列, a 可以是變數, a = 5, redim Arr(a)

ps.2 preserve 是 option, 代表是否要保留原本陣列中的資料
  如果是多維陣列, 設了 preserve 後, 只能變動最後一維的長度
  (如果 redim 後的陣列長度小於原先長度, 超出長度的資料會消失)

範例 :
<%
   dim MyArray()
   for i=1 to 9
      redim preserve MyArray(i)
      MyArray(i-1) = i*5
   next
   ' 陣列最後長度是10 (0~9)
   ' 所存資料有9個, 依序為5,10,15,...,45
%>

CSS Hack

現在寫網頁最討厭的就是瀏覽器不同
CSS 顯示的效果也不同
所以這邊記錄一下各瀏覽器支援的 CSS Hack 寫法

p=property / v=value
p:v;p:v \9;*p:v;_p:v;p:v !important;
Firefox
IE6
IE7
IE8

範例 :
<style type="text/css">
   #container {
      width:200px; /* for Firefox */
      width:205px \9; /* for IE8 */
      *width:210px; /* for IE7 */
      _width:215px; /* for IE6 */
   }
</style>

2010年5月17日 星期一

Javascript 更新畫面

前面寫了一篇 子頁更新母頁畫面(showModalDialog)
這邊來寫一下一般的更新畫面方式

[更新自己這頁]
<script language="javascript">
   //第一種方法 : history.go()
   history.go(0);
   //第二種方法 : window.location.reload()
   window.location.reload();
   //第三種方法 : window.location.href
   window.location.href = window.location.href;
</script>

[更新父頁]
<script language="javascript">
   /* 以window.open開出來的新視窗 */
   /* 父頁就是window.opener */
   window.opener.history.go(0);
   window.opener.location.reload();
   window.opener.location.href = window.opener.location.href;

   /* 以window.showModalDialog開出來的新視窗 */
   /* 父頁就是window.dialogArguments */
   /* (父頁的window.showModalDialog()第2個參數要傳入window) */
   window.dialogArguments.history.go(0);
   window.dialogArguments.location.reload();
   window.dialogArguments.location.href =
                  window.dialogArguments.location.href;
   //其中,IE8針對showModalDialog好像只支援location.href的方式
</script>

Javascript 正規表達式

常常用到正規表達式
所以記錄一下在 Javascript 中的用法

<script language="javascript">
   var str = "46 Ladys and Gentleman~\nWelcome 12 to the show !";
   document.write("Test string : <br>" + str.replace("\n","<br>") + "<br><br>");
 
   var RegStr_NoGlobal = /\d/;
   /* 使用g(Global)參數時,RegExp在做test()或exec()時 */
   /* 會保存一個指標lastIndex,記錄上次查詢結束的位置。 */
   /* 第一次test()後,lastIndex就指向字串結尾 */
   /* 第二次test()由結尾開始查,啥都查不到,就傳回false,*/
   /* 然後再把lastIndex重設為0。 */
   var RegStr_Global = /\d/g;
   var RegStr_NoIgnoreCase = /wel/;
   var RegStr_IgnoreCase = /wel/i;
   var RegStr_NoMultiLine = /^Wel/;
   var RegStr_MultiLine = /^Wel/m;
   var RegStr_Variable = /[a-z]+([a-z]{2}) /gi;
 
   var result;
 
   result = RegStr_NoGlobal.exec(str);
   document.write("No-Global Round1 : " + result + "<br>");
   result = RegStr_NoGlobal.exec(str);
   document.write("No-Global Round2 : " + result + "<br>");
 
   result = RegStr_Global.exec(str);
   document.write ("Global Round1 : " + result + "<br>");
   result = RegStr_Global.exec(str);
   document.write ("Global Round2 : " + result + "<br><br>");
 
   result = RegStr_NoIgnoreCase.exec(str);
   document.write("No-IgnoreCase : " + result + "<br>");
 
   result = RegStr_IgnoreCase.exec(str);
   document.write("IgnoreCase : " + result + "<br><br>");
 
   result = RegStr_NoMultiLine.exec(str);
   document.write("No-MultiLine : " + result + "<br>");
 
   result = RegStr_MultiLine.exec(str);
   document.write("MultiLine : " + result + "<br><br>");
 
   result = RegStr_Variable.exec(str);
   document.write("Match string : " + result[0] + " , Match variable : " + result[1] + "<br>");
   result = RegStr_Variable.exec(str);
   document.write("Match string : " + result[0] + " , Match variable : " + result[1] + "<br>");
   result = RegStr_Variable.exec(str);
   document.write("Match string : " + result[0] + " , Match variable : " + result[1] + "<br>");
   result = RegStr_Variable.exec(str);
   document.write("Match string : " + result[0] + " , Match variable : " + result[1] + "<br>");
   result = RegStr_Variable.exec(str);
   document.write("Match string : " + result[0] + " , Match variable : " + result[1] + "<br>");
</script>

Javascript 動態增加陣列長度

記錄一下 Javascript 如何動態增加陣列長度
只要使用 splice function 就 ok 囉~

範例 :
<script language="javascript">
  /* Array.splice(要插入新元素的位置, */
  /*                     要刪除插入新元素位置後的舊元素個數, */
  /*                     新元素值1, */
  /*                     新元素值2, */
  /*                     ... )           */
   function Case1()
   {
       myArray = new Array(3);
       myArray[0] = "Row1";
       myArray[1] = "Row2";
       myArray[2] = "Row3";
       myArray.splice(myArray.length ,0 ,"Row4");
       /* result: Row1 Row2 Row3 Row4 */
   }

   function Case2()
   {
       myArray = new Array(3);
       myArray[0] = "Row1";
       myArray[1] = "Row2";
       myArray[2] = "Row3";
       myArray.splice(1 ,1 ,"Row4", "Row5");
       /* result: Row1 Row4 Row5 Row3 */
   }
</script>

Where條件區分大小寫(T-SQL)

最近查了一下 SQL Server 中如何區分文字(英文)資料的大小寫
所以記錄一下 :

  重點就是要在 Where 條件的欄位後面加上
  Collate SQL_Latin1_General_CP1_CS_AS
  (CS 代表 Case Sensitive)

範例 :
  SELECT * FROM (
   SELECT 'Test' AS Col1
  ) AS A
  WHERE Col1 Collate SQL_Latin1_General_CP1_CS_AS = 'test'

[參考TechNet]

2010年5月16日 星期日

子頁更新母頁畫面(showModalDialog)

最近頻繁地使用到 window.showModalDialog()
跳出子視窗新增 / 刪除資料, 再更新(Refresh)母視窗的畫面
所以這邊記錄一下當中做法

[showModalDialog 參數]
dialogHeightdialogHeight=150px;
dialogWidthdialogWidth=400px;
dialogLeftdialogLeft=100px;
dialogTopdialogTop=50px;
centercenter=yes;
helphelp=no;
resizableresizable=no;
statusstatus=no;
scrollscroll=yes;

子頁更新母頁:
[母頁.htm]
<script language="javascript">
   function OpenChild()
   {
      DialogParam = "dialogWidth=100px;dialogHeight=400px;";
      DialogParam += "status=no;resizable=no";
      window.showModalDialog("子頁.htm",window,DialogParam);
   }

   function RefreshPage()
   {
      var RefreshLink = document.getElementById("RefreshLink");
      RefreshLink.href = "母頁.htm";
      RefreshLink.click();
   }
</script>
<body>
   <a id="RefreshLink" style="display:none"></a>

[子頁.htm]
<script language="javascript">
   function RefreshParent()
   {
      window.dialogArguments.RefreshPage();
   }
</script>

ps.這種方式也適用於showModalDialog出來的視窗
再使用showModalDialog開新視窗
不過,第一個showModalDialog視窗頁面要加一行
<head>
   <base target="_self">
因為showModalDialog視窗預設所有Link都會另開視窗
加了這行後,點選更新畫面Link就會在自己這頁動作
不會另開視窗