2012年8月22日 星期三

從 A table 複製整筆 Row 到 B table

紀錄一下,將整筆 Row 從 A table 複製到 B table 的新方法。

以前的話:
        '建立新的DataSet
        Dim P2_table As New DataSet

        '將  Rental 的結構放進 P2_table 中
        P2_table.Tables.Add(Rental.Clone)

        '執行迴圈
        For y As Integer = 0 To Rental.Rows.Count - 1
            '逐筆判斷 Rental 中的資料,是否有修改。
            If Rental.Rows(y).RowState = DataRowState.Modified Then
                '將修改後的資料,從 Rental 複製到 P2_table
                Dim dr As DataRow
                dr = P2_table.Tables(0).NewRow
                dr.BeginEdit()
                dr(0) = Rental.Rows(y).Item(0)
                dr(1) = Rental.Rows(y).Item(1)
                dr(2) = Rental.Rows(y).Item(2)
                dr(3) = Rental.Rows(y).Item(3)
                dr(4) = Rental.Rows(y).Item(4)

                dr.EndEdit()
                P2_table.Tables(0).Rows.Add(dr)
            End If
        Next


現在:
        '建立新的DataSet
        Dim P2_table As New DataSet

        '將  Rental 的結構放進 P2_table 中
        P2_table.Tables.Add(Rental.Clone)

        '執行迴圈
        For y As Integer = 0 To Rental.Rows.Count - 1
            '逐筆判斷 Rental 中的資料,是否有修改。
            If Rental.Rows(y).RowState = DataRowState.Modified Then
                '將修改後的資料,從 Rental 複製到 P2_table
                Dim dr As DataRow
                dr = P2_table.Tables(0).NewRow
                dr.ItemArray = Rental.Rows(y).ItemArray
                P2_table.Tables(0).Rows.Add(dr)
            End If
        Next



唉!笨了好幾年,沒想到可以直接複製整個陣列...

2012年8月14日 星期二

控制Textbox可以輸入的英、數字

 Private Sub t_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles t.KeyPress
       
        REM 控制可輸入的字每為數字或英文字每
        REM 若反白的長度等於欄位內文字的長度,允許全部空白。
        If CType(sender, TextBox).SelectedText.Length = CType(sender, TextBox).Text.Length Then CType(sender, TextBox).Text = ""

        REM Backspace
        If e.KeyChar = Chr(8) Then e.Handled = False : Exit Sub
        REM Delete
        If e.KeyChar = Chr(46) Then e.Handled = False : Exit Sub
        REM A to Z
        If CType(sender, TextBox).Text.Length = 0 And (e.KeyChar >= Chr(65) And e.KeyChar <= Chr(90)) Then e.Handled = False : Exit Sub
        REM a to z
        If CType(sender, TextBox).Text.Length = 0 And (e.KeyChar >= Chr(97) And e.KeyChar <= Chr(122)) Then e.Handled = False : Exit Sub
        REM Zero to nine
        If CType(sender, TextBox).Text.Length >= 1 And e.KeyChar >= Chr(48) And e.KeyChar <= Chr(57) Then e.Handled = False : Exit Sub

        REM 若上述比對皆不符,也就是第一碼不等於英文,後九碼不等於數字就...不允許輸入
        e.Handled = True REM 

    End Sub

跟SQL有關的

記錄用過的SQL語法:
  • 將日期轉換成星期。
'星期別'=(datepart(weekday,售票日期)-1)

備註:製作年曆檔時用到的。


  • 換成中文星期:
'星期別'=
CASE (datepart(weekday,[日期欄位])-1)
WHEN 1 THEN '一'
WHEN 2 THEN '二'
WHEN 3 THEN '三'
WHEN 4 THEN '四'
WHEN 5 THEN '五'
WHEN 6 THEN '六'
ELSE '日' END)

備註:製作年曆檔時用到的。


  • 取整數:傳回不含小數、不大於其引數值的最大數字。
SELECT FLOOR(123.45), FLOOR(-123.45), FLOOR($123.45)


  • 無條件進整:傳回大於或等於指定數值運算式的最小整數。
SELECT CEILING($123.45), CEILING($-123.45), CEILING($0.0)

  • 四捨五入:傳回最接近引數且去掉小數部份的數字。
ROUND([數值],[四捨五入位數])
SELECT ROUND(100.05,-2)


  • ROW_Number():傳回結果集資料分割內某資料列的序號,序號從 1 開始,每個資料分割第一個資料列的序號是 1。

SELECT *
      ,ROW_Number() OVER (Order By [任一欄位])
  FROM FIM01

備註:
在欄位內填入數值,由一開始。
搭配寫檔時,可以作為流水號。
在分頁時,可以做為分頁的依據。


  • 重新虛擬一個新的資料表的方法
方法一:

WITH [New Table Name] AS ( 撈取出來的資料表)
Select * from [New Table Name] where …

with方法,只能夠虛擬一個,若是有兩個with會互相牴觸,無法執行。

方法二:

SELECT *
  FROM (SELECT * FROM FIM01 WHERE 單位代號='10') [T1]
 WHERE TICKET > 20

這個方法應用比較不受限制,可以取出多個資料表,再彙整成一個新的資料表。