2015-06-30 3 views
0

Я знаю, что это было задано раньше, но вопросы, которые я смотрел, все немного разные. Я работаю над созданием временной таблицы, импортированием данных, размещением данных в существующей таблице и удалением таблицы temp. Вот мой код:Ошибка времени выполнения '3061' Слишком мало параметров. Ожидаемый 3

Dim db As Database 
Dim StrSql As String 
Dim rst As Recordset 

Set db = CurrentDb() 

If DCount("[Name]", "MSysObjects", "[Name] = 'tblInfoLink'") = 1 Then 
    DoCmd.DeleteObject acTable, "tblInfoLink" 
    StrSql = "SELECT tblStaff.LastName, tblStaff.FirstName, tblStaff.Rank, tblStaff.PriPhone, " _ 
      & " tblStaff.SecPhone, tblStaff.HireDate INTO tblInfoLink " _ 
      & " FROM [\\Server\BE.accdb].tblStaff " _ 
      & " WHERE (((tblInfo.LastName)=[tblInfo].[LastName]) AND ((tblInfo.FirstName)=[tblInfo].[FirstName]) AND ((tblInfo.HireDate)=[tblInfo].[HireDate]));" 
    db.Execute StrSql 
ElseIf DCount("[Name]", "MSysObjects", "[Name] = 'tblInfoLink'") = 0 Then 
    StrSql = "SELECT tblStaff.LastName, tblStaff.FirstName, tblStaff.Rank, tblStaff.PriPhone, " _ 
      & " tblStaff.SecPhone, tblStaff.HireDate INTO tblInfoLink " _ 
      & " FROM [\\Server\BE.accdb].tblStaff " _ 
      & " WHERE (((tblStaff.LastName)=[tblInfo].[LastName]) AND " _ 
      & " ((tblStaff.FirstName)=[tblInfo].[FirstName]) AND ((tblStaff.HireDate)=[tblInfo].[HireDate]));" 
    db.Execute StrSql 
End If 

StrSql = "Update tblInfo Set PriPhone = Null, SecPhone = Null" 
db.Execute StrSql 

StrSql = "INSERT Into tblInfo (PriPhone, SecPhone) " _ 
     & " SELECT tblInfoLink.PriPhone, tblInfoLink.SecPhone " _ 
     & " FROM tblInfoLink " _ 
     & " WHERE (((tblInfoLink.LastName)=[tblInfo].[LastName]) AND " _ 
      & " ((tblInfoLink.FirstName)=[tblInfo].[FirstName]) AND ((tblInfoLink.HireDate)=[tblInfo].[HireDate]));" 
db.Execute StrSql 

'Delete Linked Tables 
DoCmd.DeleteObject acTable, "tblInfoLink" 

Как только я пытаюсь запустить это, я получаю Ошибка выполнения «3061» Слишком мало параметров. Ожидаемый 3. Когда я ударил отладки highligthed зона:

db.Execute StrSql

Я знаю, что после End If, все работает. Это буквально самая важная часть этого, которая НЕ работает.

ЛЮБЫЕ идеи? Заранее спасибо!

+0

Попробуйте использовать 'Debug.Print StrSql' или' MsgBox StrSql' перед строкой для проверки запроса, я считаю, что вы обнаружите проблемы –

+0

Это просто показывает мне точный оператор SQL, который я делаю. 'SELECT LastName, FirstName, Rank, PriPhone, SecPhone, HireDate INTO tblOfcInfoLink FROM [\\ Server \ BE.accdb] .tblStaff WHERE (((tblStaff.LastName) = [tblInfo]. [LastName]) AND ((tblStaff .FirstName) = [tblInfo]. [FirstName]) AND ((tblStaff.HireDate) = [tblInfo]. [HireDate])); ' – S1naps1s

+0

вы использовали' Debug.Print StrSql'? –

ответ

0

Просто чтобы все знали, я НАКОНЕЦ получил.

Dim db As Database<br> 
Dim StrSql As String<br> 
Dim tblCount As Integer<br> 

Const cstrPrompt As String = "Are you sure you want to start the import process? Yes/No" 
If MsgBox(cstrPrompt, vbQuestion + vbYesNo) = vbYes Then 
    Set db = CurrentDb()` 

'Link to Lt's Database to retrieve Phone Numbers 

    StrSql = "UPDATE tblInfo SET PriPhone = Null, SecPhone = Null;" 
    db.Execute StrSql 

    On Error Resume Next 
    DoCmd.DeleteObject acTable, "tblPhone" 

    StrSql = "CREATE TABLE tblPhone " _ 
     & " (SSN CHAR, PriPhone CHAR (20), SecPhone CHAR(20));" 
     db.Execute StrSql 

    StrSql = "INSERT INTO tblPhone (SSN, PriPhone, SecPhone) " _ 
      & " SELECT ClockNbrId, PriPhone, SecPhone " _ 
      & " FROM [\\Server\BE.accdb].tblStaff; " 
    db.Execute StrSql 

StrSql = "UPDATE tblInfo INNER JOIN tblPhone ON tblInfo.SSN = tblPhone.SSN" _ 
    & " SET tblInfo.PriPhone = [tblPhone].[PriPhone], tblInfo.SecPhone = [tblPhone].[SecPhone] " _ 
    & " WHERE (((tblInfo.SSN)=[tblPhone].[SSN])); " 
    db.Execute StrSql 

    DoCmd.DeleteObject acTable, "tblPhone" 

Const cstrPrompt2 As String = "The import process is complete" 
If MsgBox(cstrPrompt2, vbOKOnly, "Import Complete!") = vbOK Then 
    Me.ImportDel.Enabled = False 
    Me.ImportDel.Caption = "Import Complete" 

Exit_SyncStaff: 
Set db = Nothing 

Else 
    Cancel = True 
End If 

End If` 

Благодарим всех вас за помощь. Я хотел опубликовать решение, поэтому, если в будущем есть проблемы, другие могут ссылаться на это. Казалось, что моя проблема была INNER JOIN. Спасибо за совет!

0

Хорошо, я сделал некоторые изменения за последние пару дней. Вот где я сейчас.

Dim db As Database Dim StrSql As String Dim rst As Recordset

Set db = CurrentDb() 

'Link to Database to retrieve Phone Numbers 
If DCount("[Name]", "MSysObjects", "[Name] = 'tblInfoLink'") = 1 Then 
    DoCmd.DeleteObject acTable, "tblInfoLink" 
    StrSql = "SELECT ClockNbrId, PriPhone, SecPhone INTO tblInfoLink " _ 
      & " FROM [\\Server\BE.accdb].tblStaff; " 
    Debug.Print StrSql 
    db.Execute StrSql 

ElseIf DCount("[Name]", "MSysObjects", "[Name] = 'tblInfoLink'") = 0 Then 
    StrSql = "SELECT ClockNbrId, PriPhone, SecPhone INTO tblInfoLink " _ 
      & " FROM [\\Server\BE.accdb].tblStaff; " 
    Debug.Print StrSql 
    db.Execute StrSql 
End If 

'Delete All Phone Numbers (Primary and Secondary) from tblInfo 
StrSql = "Update tblInfo Set PriPhone = Null, SecPhone = Null" 
db.Execute StrSql 

'Update Phone Numbers of Current Staff 
StrSql = "UPDATE tblInfo SET tblInfo.PriPhone = tblInfoLink.PriPhone" _ 
     & " WHERE tblInfoLink.ClockNbrId = tblInfo.SSN ; " 
Debug.Print StrSql 
db.Execute StrSql 

'Delete Linked Table 
DoCmd.DeleteObject acTable, "tblInfoLink" 

Exit_SyncStaff: Set db = Nothing

В основном это то, что я хочу, чтобы это произошло. Я запускаю команду, она обнуляет все текущие номера телефонов, подключается к базе данных на сервере, собирает все телефонные номера (первичные и вторичные) и вставляет их в строку, содержащую тот же SSN. Я смог начать использовать SSN как единственный критерий, необходимый для вставки в эту конкретную строку, а не имя, фамилию и дату найма. Я надеюсь в этом есть смысл.

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