Воссоздать доступ к функции VBA в SQL или C # и SQL - PullRequest
0 голосов
/ 03 мая 2019

Итак, у меня есть приложение Access, которое имеет такую ​​функцию;

Function PutNum() As Boolean
On Error GoTo Err_PutNum
Dim t_ct As Integer, rst As ADODB.Recordset, Str As String
 
Set rst = New ADODB.Recordset
 
rst.Open "qrySelectUpdatePrior", CurrentProject.Connection, _
adOpenStatic, adLockOptimistic, adCmdTableDirect
 
t_ct = 49
With rst
     Str = .Fields("ssn")
     Do While Not .EOF
        If Str = .Fields("ssn") Then
            t_ct = t_ct + 1
            .Fields("PRIOR") = "0" & t_ct
        
        Else
            t_ct = 50
            .Fields("PRIOR") = "0" & t_ct
            Str = .Fields("ssn")
        End If
        .MoveNext
     Loop
    .Close
End With
Set rst = Nothing
PutNum = True
 
Exit_PutNum:
   
    Exit Function
Err_PutNum:
    MsgBox Error$
    PutNum = False
    Resume Exit_PutNum
 
End Function

Запрос для набора записей выглядит следующим образом;

SELECT DRS_FILE.SSN, DRS_FILE.PRIOR
FROM DRS_FILE
ORDER BY DRS_FILE.SSN, DRS_FILE.P1, DRS_FILE.P2;

Цель этой функции - получить набор записей, проанализировать номер социального страхования, чтобы определить, сколько раз номер социального страхования появляется в наборе записей, а затем обновить поле набора записей «ПРИОР».с результатами.Последовательность следующая:

1.При первом определении номера социального страхования поле «ПРИОР» обновляется с 050

2.Во второй раз, когда идентифицируется номер социального страхования, поле «ПРИОР» обновляется с 051

3.В третий раз, когда идентифицируется номер социального страхования, поле «ПРИОР» обновляется с 052

4.Etc…

Как вы можете видеть, есть образец.Теперь передо мной стоит задача воссоздать эту функциональность, но я не знаю, каков наилучший вариант, если я должен выполнить эту задачу только в SQL Server (хранимые процедуры и функции) или использовать C # в сочетании с SQL Server длязавершить эту задачу.Наборы записей составят более 100 тысяч записей, и я боюсь обрабатывать так много записей на стороне приложения, что передача данных между внешним интерфейсом приложения и SQL-сервером кажется мне очень сложной, но я могу ошибаться.Моя цель - не рисковать производительностью.

Если у кого-то есть какие-либо идеи о том, как выполнить эту задачу, пожалуйста, поделитесь, поскольку я уже некоторое время ломал голову.Если у вас есть пример кода для обмена, это также будет полезно.

1 Ответ

1 голос
/ 03 мая 2019

Если вы хотите перенести свой код в .NET / C # или .NET / VB, будет довольно легко воссоздать код построчно, так как вы, вероятно, все еще будете использовать ADO.У меня есть чистое решение MS Access SQL здесь.Но это требует временного создания таблицы:

шаг 1. создайте запрос, который вычисляет значения ПРИОР и вставит их в новую таблицу: [New_Prior_Tbl]

SELECT * INTO New_Prior_Tbl
FROM (SELECT 
      OuterTbl.ID AS LookUpKey, 
      "0" & 49 +(SELECT count(*) FROM DRS_FILE AS InnerTbl WHERE OuterTbl.ID >= InnerTbl.ID AND OuterTbl.SSN = InnerTbl.SSN  ) AS PRIOR 
     FROM DRS_FILE AS OuterTbl 
     ORDER BY OuterTbl.SSN, OuterTbl.P1, OuterTbl.P2) 
AS Temp;

шаг 2. Обновите поле ПРИОРв основной таблице:

UPDATE DRS_FILE AS DestTbl 
INNER JOIN New_Prior_Tbl AS SrcTbl 
ON DestTbl.ID = SrcTbl.LookUpKey 
SET DestTbl.PRIOR = SrcTbl.PRIOR;

шаг 3. удалить временную таблицу

DROP TABLE New_Prior_Tbl;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...