Karimk1 Ответов: 1

Используйте макрос, созданный в excel, и преобразуйте его в SQL


Мне нужна помощь для преобразования кода макроса Excel (VB) в операторы SQL...

Обычно я копирую 3 значения (ID1, ID2 и ID3) в рабочий лист excel и запускаю макрос, который создает "выход" (одна цифра между 0-9) и "код распознавания" (который представляет собой объединенное значение столбцов ID1, ID2, ID3 и Output). Ниже приведены то, что это такое:

1. ID1 может быть где угодно от 3 цифр до 8 цифр, а также может начинаться с # или буквы С "-" как 2 символа, поэтому формат требуется в выводе кода OCR.
2. ID2-это всегда только большое число, никаких символов и префикс с нулями, чтобы вывести в общей сложности 11 цифр.
3. ID3 представляет собой смесь букв и отформатирован так, чтобы иметь выход из 5 символов.
4. выходной столбец генерируется кодом, который выполняется в макросе (VB) , прикрепленном в excel.
5. OCR - код-это конечный результат, представляющий собой объединенную версию всех 4 столбцов данных.

ID1	ID2	ID3	Output	OCR Code
14368	123262891	E0473	6	0 00014368 00123262891 E0473 6
8-10704535	123214785	E0473	7	8 10704535 00123214785 E0473 7
231640	123258733	T571	3	0 00231640 00123258733 1T571 3


Ниже приведен код макроса, прикрепленный к рабочему листу excel. Я не знаю, как преобразовать это в T-SQL (в основном SQL-операторы), чтобы он работал так, как если бы я загрузил 3 значения в таблицу, и когда SQL запускается, я получаю вывод OCR-кода.


Sub Check_Digits()
    
    Dim iRow   As Long
    
    Dim strID1       As String
    Dim strID2       As String
    Dim strID3       As String
    
    Dim TitleLetter As String
    Dim ColumnLN  As Long
    Dim strDigit As Integer
    Dim STRnUM As String
   
    Dim i As Integer
    Dim iEven As Integer
    Dim iOdd As Integer
    Dim iTotal As Integer
    Dim strOneChar As String
    Dim iTemp As Integer
    
    Dim strID1OUT       As String
    Dim strID2OUT       As String
    Dim strID3OUT       As String
    Dim strID3OUT2      As String
   
    strDigit = 0
    iRow = 2: ColumnLN = 1
    strID1 = UCase(Trim(CStr(Worksheets(1).Cells(iRow, ColumnLN))))
    strID2 = UCase(Trim(CStr(Worksheets(1).Cells(iRow, ColumnLN + 1))))
    strID3 = UCase(Trim(CStr(Worksheets(1).Cells(iRow, ColumnLN + 2))))
     
    Do While (Trim(strID1) <> "")

        iEven = 0: iOdd = 0: iTotal = 0: strOneChar = "": iTemp = 0

        If Len(strID3) = 1 Then
            STRnUM = Right(("0000000000" & Trim(Replace(strID1, "-", ""))), 10) & _
                     Right("00000000000" & strID2, 11) & _
                     Right("00000" & strID3, 5)
        ElseIf Len(strID3) = 4 Then
            STRnUM = Right(("0000000000" & Trim(Replace(strID1, "-", ""))), 10) & _
                     Right("00000000000" & strID2, 11) & _
                     Right("11111" & strID3, 5)
        Else
            STRnUM = Right(("0000000000" & Trim(Replace(strID1, "-", ""))), 10) & _
                     Right("00000000000" & strID2, 11) & _
                     Right("11111" & strID3, 5)
        End If

        Debug.Print STRnUM & "   " & Len(STRnUM)

        ' Add digits in even ordinal positions
        ' starting from rightmost
        For i = Len(STRnUM) - 1 To 2 Step -2

            strOneChar = Mid$(STRnUM, i, 1)
                
            If IsNumeric(strOneChar) Then
                iEven = iEven + CInt(strOneChar)
            Else
                Select Case UCase(strOneChar)
                    Case "A", "K", "U"
                        iEven = iEven + 0
                    Case "B", "L", "V"
                        iEven = iEven + 1
                    Case "C", "M", "W"
                        iEven = iEven + 2
                    Case "D", "N", "X"
                        iEven = iEven + 3
                    Case "E", "O", "Y"
                        iEven = iEven + 4
                    Case "F", "P", "Z"
                        iEven = iEven + 5
                    Case "G", "Q"
                        iEven = iEven + 6
                    Case "H", "R"
                        iEven = iEven + 7
                    Case "I", "S"
                        iEven = iEven + 8
                    Case "J", "T"
                        iEven = iEven + 9
                End Select
            End If
            Debug.Print (strOneChar)
        Next i

        ' Process digits in odd ordinal positions
        ' starting from rightmost
        strOneChar = "": i = 0
        For i = Len(STRnUM) To 1 Step -2
            strOneChar = Mid$(STRnUM, i, 1)
            If IsNumeric(strOneChar) Then
                ' Double it
                iTemp = CInt(strOneChar) * 2
                If iTemp > 9 Then
                    ' Break the digits (e.g., 19 becomes 1+9)
                    iOdd = iOdd + (iTemp \ 10) + (iTemp - 10)
                Else
                    iOdd = iOdd + iTemp
                End If
            Else
                Select Case UCase(strOneChar)
                    Case "A", "K", "U"
                        iTemp = 0
                    Case "B", "L", "V"
                        iTemp = 1
                    Case "C", "M", "W"
                        iTemp = 2
                    Case "D", "N", "X"
                        iTemp = 3
                    Case "E", "O", "Y"
                        iTemp = 4
                    Case "F", "P", "Z"
                        iTemp = 5
                    Case "G", "Q"
                        iTemp = 6
                    Case "H", "R"
                        iTemp = 7
                    Case "I", "S"
                        iTemp = 8
                    Case "J", "T"
                        iTemp = 9
                End Select
                iTemp = iTemp * 2
                If iTemp > 9 Then
                    ' Break the digits (e.g., 19 becomes 1+9)
                    iOdd = iOdd + (iTemp \ 10) + (iTemp - 10)
                Else
                    iOdd = iOdd + iTemp
                End If
            End If
            Debug.Print iTemp & "  "; iOdd
        Next i

        ' Add even and odd
        iTotal = iEven + iOdd

        ' Return the 10's complement
        If iTotal Mod 10 = 0 Then
            CheckDigit = 0
        Else
            CheckDigit = 10 - (iTotal Mod 10)
        End If


        Sheet1.Cells(iRow, ColumnLN + 3) = CheckDigit
        
        If InStr(1, strID1, "-") > 0 Then
            strID1OUT = Right(("0000000000" & Trim(Replace(strID1, "-", " "))), 10)
        Else
            If InStr(1, strID1, "C") > 0 Then
                strID1OUT = "C " & Right(("00000000" & Trim(strID1)), 8)
            Else
                If InStr(1, strID1, "S") > 0 Then
                    strID1OUT = "S " & Right(("00000000" & Trim(strID1)), 8)
                Else
                    strID1OUT = "0 " & Right(("00000000" & Trim(strID1)), 8)
                End If
            End If
        End If
        strID2OUT = Right("00000000000" & strID2, 11)
        
        If Len(strID3) = 1 Then
            strID3OUT = Right("00000" & strID3, 5)
            strID3OUT2 = Right("0000" & strID3, 5)
        ElseIf Len(strID3) = 4 Then
            strID3OUT = Right("11111" & strID3, 5)
            strID3OUT2 = strID3
        Else
            strID3OUT = strID3
            strID3OUT2 = strID3
        End If
        
        Sheet1.Cells(iRow, ColumnLN + 5) = strID1OUT & " " & strID2OUT & " " & strID3OUT & " " & CheckDigit
    
        Sheet1.Cells(iRow, ColumnLN + 6) = strID1OUT & " " & strID2OUT & " " & strID3OUT2 & " " & CheckDigit
    
        iRow = iRow + 1
        strID1 = UCase(Trim(CStr(Worksheets(1).Cells(iRow, ColumnLN))))
        strID2 = UCase(Trim(CStr(Worksheets(1).Cells(iRow, ColumnLN + 1))))
        strID3 = UCase(Trim(CStr(Worksheets(1).Cells(iRow, ColumnLN + 2))))

    Loop
    Sheet1.Cells(1, ColumnLN + 3) = "Check_Digit"
    Sheet1.Cells(1, ColumnLN + 5) = "Output"
    MsgBox "Finished!", vbInformation + vbOKOnly
    
End Sub


Что я уже пробовал:

Пытался понять, но не смог .... Помогите !!!

1 Ответов

Рейтинг:
0

Garth J Lancaster

У вас есть код, который вы можете так же легко преобразовать в C++, а затем добавить его как внешнюю хранимую процедуру в соответствии с Добавление расширенной хранимой процедуры в SQL Server - SQL Server | Microsoft Docs[^]

кстати, это примерно то же самое, что вы в конечном итоге делаете в SQL Вычисление и проверка контрольных цифр в T-SQL - Simple Talk[^] - не невозможно