2015年3月20日 星期五

ConnStr

引用

Public Module SQL
    Private ConnStr as string = "........."
    Public Function RunSQL(Byval SQL As String) As Integer
        Using Conn As new SqlConnection(ConnStr)
            Using Cmd = Conn.CreateCommand()
                Conn.Open()
                Cmd.CommandText = SQL
                Try
                   Return Cmd.ExecuteNonQuery
                Catch ex as Exception
                   '.....錯誤處理....
                Finally
                   Conn.Close()
                End Catch
            End Using
        End Using
    Edn Function

    'Public Function CreateTable(byval SQL as string) as DataTable
    'Public Function CreateDataReader(byval SQL as string) as SqlDataReader
End Module

'==外部呼叫===

SQL.RunSQL("Update MyTB Set A= '2'") '一行....


Private Sub 讀取程序(ByVal vSQL As String, Optional ByVal v資料表名稱 As String = Nothing)
    If v資料表名稱 = Nothing Then
        Dim v分割() As String = vSQL.Split(" ")
        v資料表名稱 = v分割(Array.IndexOf(v分割, "from") + 1) ' 識別資料表名稱
    End If
    If IsNothing(資料集.Tables(v資料表名稱)) = False Then 資料集.Tables(v資料表名稱).Clear()
    資料表配接器.SelectCommand = New OleDb.OleDbCommand(vSQL, SQL連線)
    資料表配接器.Fill(資料集, v資料表名稱)
End Sub
'===========================================================

Private Sub 列印_PrintPage(sender As System.Object, e As System.Drawing.Printing.PrintPageEventArgs) Handles 列印.PrintPage
    Dim v總資料() As String = v列印字串.Split(New String() {vbNewLine}, StringSplitOptions.None) ' 分割字串
    While v列印行數 < v一頁行數 * v頁數 And v列印行數 < v總資料.Length
        e.Graphics.DrawString(v總資料(v列印行數), v列印字型, Brushes.Black, 100, vY)
        vY += v列印字型.Height
        v列印行數 += 1
    End While
    If v列印行數 = v一頁行數 * v頁數 And v列印行數 < v總資料.Length Then
        e.HasMorePages = True
        vY = 0 : v頁數 += 1
    Else
        e.HasMorePages = False
    End If
End Sub

2015年3月19日 星期四

製作換頁數功能

引用

在沒有提供換頁能力的程式語言環境下,也是能照要做出換頁數的效果!
VBScript 製作換頁數功能
文章編寫: Tek (tek1e@netscape.net)
程式語言: VBscript (Visual Basic Script)
編寫日期: 5/9/2003



在許多網站上,大部份讀取資料庫網頁程式都有換頁數的能力‧ 例如ASP,做一個有換頁能力的網頁是再也簡單不過的事了! 但是,您曾是否想過如果程式本身沒有換頁的能力,那要怎麼做出換頁的功能呢? 這種情況也許用ASP讀資料庫的編寫者不會遇到,但是如果在VBScript上呢? 假設您寫了一個可以讀取資料庫的VBS,要如何照樣順利建立一個換頁功能呢? 也許您會說,VBScript因為功能被限制,我用其他的就可以了,所以這篇就甭看了‧ 如果您是ASP.Net愛好者,那麼當你在使用datalist control時,您會發現這種說法是錯.誤.的‧ 因為ASP.Net的Datalist control雖然有建立自己的template功能,卻沒有換頁的function‧ 而唯一的解決辦法,就是完全瞭解程式是怎麼自己做到分頁的能力的! 當您瞭解後,換頁就再也不是程式語言功能的專利了!
其實要做換頁功能的範圍很廣,基本上只要是與總資料數量控制的程式都可以用到換頁‧ 例如讀取一個文字檔並基於文字顯示的數量來做索引分頁、陣列顯示數量、寫IIS Log viewer等等... 而最常見的,則為從資料庫的資料索引換頁‧


在您要開始學習這篇文章時,如果您擁有以下條件,那麼在學習上會比較輕鬆:


1. 瞭解程式變數/常數意義,及完整使用方法,例:

a. 變數在子程式外的影響

2. 對VBScript大部份函式、功能等有基本的瞭解,例如:

a. mod 運算子
b. for...next 陳述式
c. Array 函數
d. cookie 使用
e. 對表單的控制
f. sub, function 程序的使用
g. if...then...else 陳述式
h. 更多...

3. 瞭解數學加減乘除,這樣子才可以瞭解:

a. 程式是如何算出總頁數的
b. 程式是如何控制每一頁所顯示的資料數量
c. 控制頁數
d. 更多...


如果您越接近以上的條件,那麼相對的您學習以下的教學將會越容易‧ 但是Tek 還是會盡量以最簡單的方式帶過說明! 如果是重要的,那我將會盡量以最簡單的方式讓您瞭解‧ 如果您有VBS的函式或類似的問題,那麼您可到msdn.microsoft.com來下載VBS 或 WSH的Html help 檔案來直接查詢功能的使用‧
【一切的開始】解剖換頁功能


要準備建立一個換頁功能,首先您必須先收集一些將會是您在網頁上控制換頁的關鍵資料‧ 包括有『總資料數量』、『每頁的資料數量』『目前的頁數』『餘數』『總頁數』‧ 其實這些並還沒真的講到到程式編寫上,只是普通的數學,所以先別嚇到了... 我現在就一一講解要如何求出這些資料,及為什麼需要他們‧

-總資料數量:
如果要從資料庫抓出總資料數量並不難,以ASP而言,有recordcount method來抓‧ 但在最後的範本,我用陣列當做資料庫使用‧ 所以要算出陣列的總資料,您可以用ubound() 來抓上限‧ 但注意陣列是第0比也會跟著算進去的,所以要顯示資料的話,可以在後面放個+1即可! (第0比不代表沒資料,而是陣列)
這非常重要,因為總頁數、餘數等都要靠它來算出其答案‧

-每頁的資料數量:
這其實不是算出來,而是設計者自定的‧ 這代表每一頁所將會顯示的資料的數量‧ 靠每頁的資料數量,您才可以算出總頁數、餘數、算索引(每頁應該所顯示的數量)、上下頁控制等‧

-目前的頁數:
基本上這算是使用者自己更動的部份‧ 預設從1開始算‧ 靠它,您可以算出索引、頁數控制等‧

-餘數:
餘數 = 將兩個數值相除,然後傳回其餘數。 您必須將總資料數量除每頁所要顯示的資料數量(浮點數會捨入為整數),並得到餘數‧ 在這邊,餘數是程式控制準確頁數的關鍵‧

假設,我有一個總資料為122,每一頁的顯示數量為10的話,那麼:
餘數:2
122 / 10 = 12 ,因為有餘數,所以總頁數再+1 = 13

再這邊,我寫一個小程式讓大家來自己算看看:


【VBS換頁的數學小技巧】換頁可能會用到的數學公式


求餘數 = 總資料數量 Mod 每一頁所要顯示的資料數量
算總頁數 = 總資料數量 / 每一頁所要顯示的資料數量(算整數但不四捨五入,如果有餘數則再加一)
算開始索引 = (目前的頁數 x 每一頁所要顯示的資料數量) - 每一頁所要顯示的資料數量
算結束索引 = (目前的頁數 x 每一頁所要顯示的資料數量) - 1
【換頁功能成功的關鍵】瞭解索引控制


為什麼我一直提到索引? 其實說換頁只是個幌子... 說換頁,事實上你只是在控制索引數量而已‧ 也就是說,你的目地只是要讓程式能自己判斷在第幾頁顯示第幾筆到第幾筆的資料,而並非真的程式會"換頁"‧ 要做索引,您必須要以兩部份分開來想‧ 一為開始,二為結束索引‧ 要算出這兩個,您必須將目前的頁數乘上每一頁顯示的數量! 如果說是要算開始的索引,則將剛得到的值減掉每一頁顯示的數量‧ 如果說是結束的索引,則減一‧

接著,拿著這兩個值放入迴圈中(for...next)就可以控制索引‧ 注意在迴圈裡,您必須要在開始處理要顯示的資料前判斷索引是否有超過資料數量範圍,如果超過則用Exit method離開迴圈即可‧ 為什麼要這樣? 因為當您遇到這種情況時,通常都會代表餘數不等於零‧ 也就是說,最後一頁不跟其他頁一樣有同樣的結束索引‧
【VBS有效的保持變數資料】使用Cookie

因為"目前的頁數"資料是您唯一讓使用者操控的,所以每次都必須更新此變數! 如果只是用Dim 陳述式來儲存變數的話,那麼瀏覽器在重新整理或離開去讀其他網頁時,目前停留的頁數就會消失‧ 挺囉嗦的,如果說有十幾頁的話不都要每一次回來都選的要死? 唯一解決的辦法,就是用Cookie來暫時保存資料‧ 以下為Cookie的使用辦法:



注意有一些網頁空間會在瀏覽者登入時就會自動製造Cookie, 有時可能會影響對Cookie的控制!
【實際範例】VBScript 有換頁功能的程式碼




 http-equiv="Content-Type" content="text/html; charset=big5">





 Border="0" cellspacing="1" cellpadding="0" width="400" bgcolor="#0066CC" height="77">

 Width="100%" Valign="middle" height="23">
 Class="program_title">VBScript 頁數處理 By Tek


 Width="100%" Valign="middle" bgcolor="#F6F6F6" Class="pageinfo" height="17">
資料數量: id="total_data_display"> | 頁數: id="current_page_display">/id="page_amount_display"> id="pagelistcomponent">



 Width="100%" Valign="Top" Bgcolor="White" Class="pagecontent" height="22">
 id="datalist">



 width="100%" valign="top" Class="mycomment" height="11">



2015年3月16日 星期一

Crystal Report

引用

在安裝完 Visual Studio 2010 後,你會發現找不到 Crystal Report 工具,如果需要使用 Crystal
Report 你可以直接到 SAP 網站免費下載,網址如下:

2015年3月11日 星期三

string get text get numeric

declare @data as varchar(50)
set @data='ciao335'


--get text
Select Left(@Data, PatIndex('%[0-9]%', @Data + '1') - 1)    ---->>ciao

--get numeric
Select right(@Data, len(@data) - (PatIndex('%[0-9]%', @Data )-1) )   ---->>335

2015年3月10日 星期二

使用 NET USE 連線網路磁碟機

net use 磁碟機代號: \\IP(or HostName)\資料夾名稱 /user:Domain\Account Password
ex:
如果是空密碼,用兩個雙引號就代表空密碼了
搭配XCOPY使用可以使用在排程備份網路磁碟機的資料。

刪除磁碟機:
net use z: /delete

若連線磁碟機失敗, 並且失敗原因為下列
"指定的網路資料夾目前使用其他用使者名稱和密碼連線。要使用其它使用者名稱和密碼連 
線,請先中斷任何到這個網路共用的連線。
"

CASE e WHEN null

SELECT CASE WHEN last_name is NULL THEN first_name ELSE first_name + ' ' + last_name

msSQL2008 update .. select ..

  MERGE INTO 二廠物料請購單 T
   USING 二廠物料請購單2 S
      ON T.[訂單編號] = S.[訂購單號]
WHEN MATCHED THEN
   UPDATE
      SET [需求根據]=s.[備註];

MERGE INTO YourTable T
   USING other_table S 
      ON T.id = S.id
         AND S.tsql = 'cool'
WHEN MATCHED THEN
   UPDATE 
      SET col1 = S.col1, 
          col2 = S.col2;
 MERGE INTO YourTable T
   USING (
          SELECT id, col1, col2 
            FROM other_table 
           WHERE tsql = 'cool'
         ) S
      ON T.id = S.id
WHEN MATCHED THEN
   UPDATE 
      SET col1 = S.col1, 
          col2 = S.col2;

CASE xx WHEN null

SELECT first_name + 
    CASE last_name WHEN null THEN 'Max' ELSE 'Peter' END AS Name
FROM dbo.person

2015年3月4日 星期三