2026年3月25日 星期三

營利事業統一編號檢查碼邏輯修正

 營利事業統一編號檢查碼邏輯修正

--

舊版的統一編號邏輯檢查已經不適用囉!


趕緊修正一下




   Public Shared Function NEW_ValidateTaxID(ByVal vstrTaxID As String) As Boolean


        '空值或非8碼或非純數字


        If String.IsNullOrEmpty(vstrTaxID) OrElse vstrTaxID.Trim().Length <> 8 OrElse Not Integer.TryParse(vstrTaxID, Nothing) Then


            Return False


        End If




        Dim TaxID_7 As Boolean = (vstrTaxID.Substring(6, 1) = "7")


        Dim logics As Integer() = New Integer() {1, 2, 1, 2, 1, 2, 4, 1} '邏輯乘數


        Dim Z As Integer = 0 '垂直乘積之和 全部加總


        Dim Z1 As Integer = 0


        Dim Z2 As Integer = 0




        '邏輯乘數的數量與統編長度8碼一致


        For i As Integer = 0 To logics.Length - 1


            Dim num As Integer = Convert.ToInt32(vstrTaxID.Substring(i, 1)) '統編單一數字拆解


            Dim j As Integer = num * logics(i) '乘積直寫並上下相加


            Dim SumXX As Integer = (j \ 10) + (j Mod 10) '垂直乘積之和(上下數字相加)




            If TaxID_7 AndAlso i = 6 Then '統編第7位數字是"7" && 走訪到統編第7位數字時


                '"乘積之和"為"10",但政府文件要我們取"0或1"兩種情況(不是10)來相加。


                Z1 += 0


                Z2 += 1


                'Z 不理它


            Else


                Z += SumXX


                Z1 += SumXX


                Z2 += SumXX


            End If


        Next 'end for




        'int old_checkNum = 10; '2023年以前的舊版


        Dim checkNum As Integer = 5




        If TaxID_7 Then


            If (Z1 Mod checkNum = 0) OrElse (Z2 Mod checkNum = 0) Then


                Return True


            End If


        ElseIf Z Mod checkNum = 0 Then


            Return True


        End If




        Return False


    End Function

2026年3月18日 星期三

MS-SQL 分頁

引用來源: [MSSQL]分頁

---

方法一 : 使用ROW_NUMBER()搭配OVER(ORDER BY Field)(SQL Server 2008 開始)

ROW_NUMBER()

ROW_NUMBER ( )

    OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause )

先用ROW_NUMBER()替每筆資料設定編號,再根據條件取得分頁內容(ROW_NUMBER從1開始)

DECLARE @PageIndex INT = 1, @PageSize INT = 25


SELECT * FROM

(

    SELECT

        *, ROW_NUMBER() OVER (ORDER BY FieldA DESC) as RowId

    FROM

        TableA

    WHERE

        Conditions

) AS vw

WHERE

    RowId BETWEEN (@PageIndex - 1) * @PageSize + 1 AND @PageIndex * @PageSize

方法二 : 使用OFFSET搭配FETCH(SQL Server 2012 開始)

OFFSET FETCH


OFFSET - FETCH 是 ORDER BY 子句的延伸功能。


FETCH

          [ [ NEXT | PRIOR | FIRST | LAST

                    | ABSOLUTE { n | @nvar }

                    | RELATIVE { n | @nvar }

               ]

               FROM

          ]

{ { [ GLOBAL ] cursor_name } | @cursor_variable_name }

[ INTO @variable_name [ ,...n ] ]

可以指定跳過的行數,指定要取回的資料列筆數(要從跳過 0 ROW開始)

DECLARE @PageIndex INT = 1, @PageSize INT = 25


SELECT

    *

FROM

    TableA

ORDER BY

    FieldA DESC

OFFSET (@PageIndex - 1)*@PageSize ROWS

FETCH NEXT @PageSize ROWS ONLY;

FETCH 寫法效能比 ROW_NUMBER() 快很多


2026年1月22日 星期四

MS-SQL 找尋 約束

 /*顯示資料內所有約束*/

SELECT * FROM sys.default_constraints WHERE parent_object_id = OBJECT_ID('A_TMP')

/*找詢約束*/

if (SELECT count(name) FROM sys.default_constraints WHERE parent_object_id = OBJECT_ID('A_TMP') and name='A_prod_name')>0

begin

   print '1'

end 

else

begin

   print '0'

end