2016-04-10 2 views
1

Я новичок в базе данных VBA в Access, следующий код пытается объединить два столбца в таблице_2, но одно из имен столбцов должно быть определено значением поля из Table_1, я попытался запустить код, но он возвращает «Ошибка обновления: Слишком мало параметров. Ожидаемый 1.» Я не уверен, где проблема.Acess VBA - Обновить переменную колонку (Слишком мало ошибок параметров)

Цените, если кто-то может помочь. Большое спасибо.

Function test() 
On Error Resume Next 
    Dim strSQL As String 
    Dim As String 
    Dim txtValue As String 
    txtValue = Table_1![Field_A] 

    Set ws = DBEngine.Workspaces(0) 
    Set db = ws.Databases(0) 

On Error GoTo Proc_Err 
    ws.BeginTrans 

    strSQL = "UPDATE Table_2 INNER JOIN Table_1 ON Table_2.id = Table_1.id SET Table_2.Field_Y = Table_2!txtValue & Table_2![Field_Z]" 
    db.Execute strSQL, dbFailOnError 

    ws.CommitTrans 

Proc_Exit: 
    Set ws = Nothing 
    Set db = Nothing 
    Exit Function 

Proc_Err: 
    ws.Rollback 
    MsgBox "Error updating: " & Err.Description 
    Resume Proc_Exit 
End Function 

UPDATE: следующие коды с реальными именами полей:

Function CombineVariableFields() 
On Error Resume Next 

    Dim ws As Workspace 
    Dim strSQL As String 
    Dim fieldname As String 
    fieldname = Table_1![SelectCombineField] 

    Set ws = DBEngine.Workspaces(0) 
    Set db = ws.Databases(0) 

On Error GoTo Proc_Err 
    ws.BeginTrans 

    strSQL = "UPDATE Table_2 INNER JOIN Table_1 ON Table_2.BookType = Table_1.BookType SET Table_2.CombinedField = [Table_2]!fieldname & [Table_2]![BookName]" 
    Debug.Print strSQL 
    db.Execute strSQL, dbFailOnError 

    ws.CommitTrans 

Proc_Exit: 
    Set ws = Nothing 
    Exit Function 

Proc_Err: 
    ws.Rollback 
    MsgBox "Error updating: " & Err.Description 
    Resume Proc_Exit 
End Function 

Ниже приведены скриншоты двух таблиц

enter image description here

enter image description here

+0

Вы уверены, что не пытаетесь сделать что-то подобное? "UPDATE Table_2 INNER JOIN Table_1 ON Table_2.id = Table_1.id SET Table_2.Field_Y =" & txtValue & "Table_2.Field_Z" –

+0

@HansUp Да, таблица_2 содержит поле с именем txtValue – Will

+0

@ davy-c, например, в таблице_2 библиотека хочет объединить [издатель] и [название книги], если тип книги является учебным пособием колледжа, и объединить [authur] и [название книги], если тип книги является новым. Какое поле используется для объединения с столбцом [book name], зависит от входного значения пользователя (txtValue) в таблице_1 для каждого типа книги. – Will

ответ

0

Как рекомендовал @ adam-silenko, я использовал функцию DLookup, а затем «Слишком мало ошибок параметров» исправлено. Вот коды, которые я использовал. Жесткий он исправил ошибку, но это порождает другую проблему, которую я поднял по другому вопросу here.

Function CombineVariableFields_NoLoop() 
On Error Resume Next 

    Dim ws As Workspace 
    Dim strSQL As String 
    Dim fieldname As String 

    fieldname = DLookup("[SelectCombineField]", "Table_1") 

    Set ws = DBEngine.Workspaces(0) 
    Set db = CurrentDb() 

On Error GoTo Proc_Err 
    ws.BeginTrans 

    strSQL = "UPDATE Table_2 INNER JOIN Table_1 ON Table_2.BookType = Table_1.BookType SET Table_2.CombinedField = [Table_2]![" & fieldname & "] & ' - ' & [Table_2]![BookName]" 
    db.Execute strSQL, dbFailOnError 

    ws.CommitTrans 

Proc_Exit: 
    Set ws = Nothing 
    Exit Function 

Proc_Err: 
    ws.Rollback 
    MsgBox "Error updating: " & Err.Description 
    Resume Proc_Exit 

End Function 
+0

Вы можете использовать 'DLookup', но с условием. Вы можете использовать его непосредственно в 'Update' –

1

попробуйте использовать DLookup Function и соедините результат с помощью строки обновления, чтобы получить ожидаемую команду.

Редактировать:
вы также можете открыть набор записей, создать динамическое обновление и выполнить его в цикле. Например:

Set rst = db.OpenRecordset("Select distinct SelectCombinetField FROM Table_1", dbOpenDynaset) 
with rst 
    do while not .eof 
    strSQL = "UPDATE Table_2 SET Table_2.[" & !SelectCombinetField & "] = (select txtValue from Table_1 where SelectCombinetField = '" & SelectCombinetField & "' and id = Table_2.id Where somting....)" 
    db.Execute strSQL, dbFailOnError 
    .MoveNext 
    Loop 
end with 

Если это только пример, потому что все ваше описание неясно для меня.

+0

Спасибо @ adam-silenko, я могу исправить ошибку «Слишком мало параметров» от DLookup.Он зафиксировал t, зафиксировал слишком мало ошибок параметров, и я немного поразмыслил о вашей идее для цикла, но я не могу это сделать, поскольку я новичок в VBA, и я поставил вопрос здесь: http: // stackoverflow .com/questions/36581104/access-vba-concatenate-dynamic-columns-and-execute-in-loop – Will

0

пример с DLookup:

strSQL = "UPDATE Table_2 " _ 
    & "SET Table_2.CombinedField = DLookup(" _ 
    & "DLookup(""[SelectCombineField]""" _ 
     & ", ""Table_1""" _ 
     & ", ""BookType = """""" & Table_2.BookType & """""""")" _ 
    & ", ""[Table_2]""" _ 
    & ", ""Table_2_ID = "" & Table_2.Table_2_ID)" _ 'you must replace Table_2_ID with proper value 
    & " & "" - "" & [Table_2]![BookName]" 
db.Execute strSQL, dbFailOnError 

Но это медленнее решение. Решение с Recordset лучше.

Смежные вопросы