2012年8月23日 星期四

報表顯示Wafer_ID 縮寫

在 IC 設計業中,Wafer ID 從 Fab 廠出來一直到切割之前,都是以片(刻)號存在的,並配合著 Fab  廠出廠的時的批號,批號 + 刻號就是該片  Wafer 的唯一識別,幾乎不會有例外。

接到的需求為,因一個晶舟盒內滿批是 25片,Wafer 刻號是 1,2,3,4,5,.....,25 , 若顯示在報表中會太長而不好顯示,要顯示為 1-25 ,若刻號為 1,2,3,5,7,9,10,11 的話要顯示為 1-3,5,7,9-11
本來想要在 4gl 內寫程式調整完再輸出給 CR 用,但是 4gl 還是不大熟悉,寫到下班可能還寫不完,故就在 CR 的VisualBasic 編輯器內寫吧,包含Debug時間大約1.5小時,記得古早以前在前公司已經用 VB 寫過此 function並包裝起來,故就只會Call已經忘了邏輯了,當時還寫了半天才寫完,工作了那麼多年果然有進步...。

* 今天才知道陣列的用法,VB 和 CR 內建的VB 第一個索引是不一樣的,VB 陣列是從 0 開始,但 CR 的 VB 是從 1 開始,這個地方 try了好久才搞通....


修改後的畫面如下,


廢話不多說,把 Code 留下來,以後若有需要就可以直接拿起來用...


    Dim sWaferID As String
    Dim aWaferID() As String
    Dim sWaferIDOutput As String
    Dim sTemp As String
    Dim sCurr As String
    Dim sPre As String
    Dim sStartIndex As String
    Dim sEndIndex As String
    Dim i As Number  
    '輸入WaferId 為01,02,03,04.....
    '把 WaferID 的重排列過,若WafeID為 01,02,轉換為 1,2
    aWaferID = Split({csfr300.msg}, ",")
    For i = 1 To UBound(aWaferID)
        If sWaferID = "" Then
            if CDbl(aWaferID(i)) < 10 then
                sWaferID = Right(aWaferID(i),1)
            Else
                sWaferID = aWaferID(i)
            End If
        Else
            if CDbl(aWaferID(i)) < 10 then
                sWaferID = sWaferID & "," & Right(aWaferID(i),1)
            Else
                sWaferID = sWaferID & "," & aWaferID(i)
            End If
        End If
    Next i
 
    '開始 WaferID 縮寫作業
    sTemp = ""
    sWaferIDOutput = ""
    sStartIndex = ""
    sEndIndex = ""
 
    aWaferID = Split(sWaferID,",")
    For i = 1 To UBound(aWaferID)
        sCurr = aWaferID(i)
     
        sEndIndex = aWaferID(i)
     
        If sStartIndex = "" Then
            sStartIndex = aWaferID(i)
        End If
     
        If sTemp = "" Then
            sTemp = aWaferID(i)        
            sPre = aWaferID(i)
        Else
            If CDbl(sCurr) - CDbl(sPre) = 1 Then
             
                If CDbl(sEndIndex) - CDbl(sStartIndex) = 1 Then
                    sTemp = sStartIndex & "," & sEndIndex
                Else
                    sTemp = sStartIndex & "-" & sEndIndex
                End If
            Else
                If sWaferIDOutput = "" Then
                    sWaferIDOutput = sTemp
                Else
                    sWaferIDOutput = sWaferIDOutput & "," & sTemp
                End If
             
                sStartIndex = sCurr
                sEndIndex = sCurr
                sTemp = sCurr
            End If
         
            sPre = aWaferID(i)
        End If
     
 
    Next i
 
    If sWaferIDOutput = "" Then
        sWaferIDOutput = sTemp
    Else
        sWaferIDOutput = sWaferIDOutput & "," & sTemp
    End If
'
    formula = sWaferIDOutput