Как вернуть детали обновленного ряда? - PullRequest
0 голосов
/ 19 марта 2020

У меня есть база данных в MS Access 2016, и я хочу выполнить запрос на обновление через Excel VBA - это работает. После этого я хочу вернуть детали обновленной строки (значения из двух столбцов - ID, Col1). Теперь у меня есть только количество затронутых строк. Как этого добиться?

Мой запрос:

UPDATE 
(SELECT TOP 1 ID, Col1, Update_time, Update_user 
FROM Table1 
WHERE Update_user Is Null 
ORDER BY Col2 DESC , ID)  AS U_ROW 
SET U_ROW.Update_time = Now(), U_ROW.Update_user = [username];

В Excel VBA я запускаю его через ADODB.Command:

    With baseRecordsetCommand
        .ActiveConnection = objectConnection
        .CommandType = adCmdStoredProc
        .CommandText = "qryTest"
        .NamedParameters = True
        .Parameters.Append .CreateParameter("@username", adVarChar, adParamInput, 255, LCase(Environ("Username")))
        .Execute recordsAffected
    End With

Ответы [ 2 ]

0 голосов
/ 19 марта 2020

Обычно этот вид операций входит в хранимую процедуру, но в Ms Acces / Excel вам нужно использовать VBA. Самый простой способ - получить идентификатор, который вы собираетесь обновить перед обновлением.

Итак, это на первом месте: сохраните его в переменной

SELECT TOP 1 ID
FROM Table1 
WHERE Update_user Is Null 
ORDER BY Col2 DESC , ID

И затем

update Table1
SET Table1.Update_time = Now(), Table1.Update_user = @username where Id = @idFromFirstQuery;

, за которым следует

select * from Table1 where Id = @idFromFirstQuery;

, таким образом, вы знаете, какой идентификатор, строку вы обновляете.

ИЛИ:

вы можете превратить now() также в параметр и указать временную метку в качестве параметра. например:

update (table selection ) set update_time = '2020-19-03 10:0=10:10', update_user = 'User1';

после обновления вы можете сделать что-то вроде: Select * from Table1 where update_user = 'User1' and update_time = '2020-19-03 10:0=10:10';

NOTE !! вы очень предполагаете, что отметка времени поставляем + имя пользователя уникально. Я лично не буду использовать этот метод.

0 голосов
/ 19 марта 2020

Не уверен в этом, но если у вас есть уникальный идентификатор, вы можете сделать что-то вроде этого. Это было сделано в Access, поэтому необходимо установить соединение, так как я считаю, что это нормально.

Function sqlret() As String

Dim c As ADODB.Connection
Dim s As String
Dim r As ADODB.Recordset
Dim l As Long

Set c = CurrentProject.Connection

c.Execute "insert into tblprojects(projecttitle) values ('code1')"
Set r = New ADODB.Recordset
r.Open "select @@identity", c, 1
l = r.Fields(0).Value
r.Close

r.Open "select * from tblprojects where [projectid]=" & l, c, 1
sqlret = r.GetString

End Function
...