2015-10-08 3 views
0

Я начал разработку достаточно простого проекта доступа. БД и запросы были построены через приложение, и у меня есть код, который будет проходить через таблицу и заполнять другую таблицу на основе содержимого. Это работало нормально, пока я не добавил дополнительное поле (AsOfDate) к одной из таблиц, и теперь я получаю ошибку 3061 при запросе таблицы. Если я удалю новое поле из SQL, он отлично работает. Итак, я посмотрел на объект таблицы при отладке - не вижу новое поле, а также заметил, что другой запрос Query I также не перечислит.Ошибка доступа к времени 2013 г. 3061, Слишком мало параметров. Ожидаемые 1 и другие странности

Есть ли что-то, что мне не хватает в отношении того, что я делаю в интерфейсном приложении, и того, что мне нужно делать в VBA?

Код прост (до сих пор), но я включу его для ознакомления.

Public Sub PopulateBillingRecords() 

'Quick and dirty attempt to replicate desk billing 

Dim wrkSpace As Workspace 
Dim dbThisDB As DAO.Database 
Dim tblUsers As TableDef 
Dim tblPermissions As TableDef 
Dim tblTrades As TableDef 
Dim tblBilling As TableDef 
Dim rsUsers As Recordset 
Dim rsPermissions As Recordset 
Dim rsTrades As Recordset 
Dim rsBilling As DAO.Recordset 
Dim qryBilling As DAO.QueryDef 
Dim strBillingSQL As String 
Dim qryUsers As QueryDef 
Dim strUsersSQL As String 
Dim rowUser As Variant 
Dim datAsOfDate As Date 
Dim qryTemp As QueryDef 
Dim fldThisField As Field 
Dim flsAllFields As Fields 
Dim strTempField As String 

Set wrkSpace = CreateWorkspace("GVUsers", "admin", "", dbUseJet) 


Set dbThisDB = wrkSpace.OpenDatabase("GV User Analysis.accdb") 

Set tblUsers = dbThisDB.TableDefs("Users") 
Set tblPermissions = dbThisDB.TableDefs("MarketPermissions") 
Set tblTrades = dbThisDB.TableDefs("Trades") 
Set tblBilling = dbThisDB.TableDefs("Billing") 

tblBilling.Fields.Refresh 
dbThisDB.TableDefs.Refresh 

datAsOfDate = Date 


'Assuming existing tables populate by import *code import routine later* 

'Clear out any existing billing records 'in future allow data to persist and prompt to either clear down data for current billing period if it exists or append 

Set rsBilling = Nothing 

strBillingSQL = "SELECT Billing.ID, Billing.CompanyCode, Billing.CompanyName, Billing.TraderName, Billing.TraderID, Billing.ConnectionType," _ 
& "Billing.IsDisabled, Billing.SetupDate, Billing.TPLogCount, Billing.HasConcession, Billing.IsBillable, Billing.BillingPeriod, Billing.DeskByOrdersTrades," _ 
& "Billing.DeskByPermissions, Billing.OverallDeskAllocation, Billing.HasGasPermissions, Billing.HasPowerPermissions, Billing.HasCoalPermissions, Billing.TradesCount," _ 
& "Billing.OrdersCount, Billing.AllocationGas, Billing.AllocationPower, Billing.AllocationCoal, Billing.AllocationMethod,Billing.AsOfDate" _ 
& " FROM Billing;" 


Set rsBilling = dbThisDB.OpenRecordset(strBillingSQL, dbOpenDynaset) '<---- 3061 error is returned here 

Я схожу с ума, пытаясь понять, что происходит, и думаю, что начать с того, что это не решение!

Заранее спасибо

+0

Я не очень много работал с TableDef, но мне кажется (не уверен, но стоит попробовать), что вам, вероятно, понадобится переделать свой объект TableDef при доступе после изменения таблицы. –

+0

Дважды проверьте имя поля в таблице. Эта ошибка обычно указывает, что вы пытаетесь использовать параметр в VBA, доступ к которому не нравится. Поскольку у вас нет инструкции Where, она, скорее всего, не может найти «Billing.AsOfDate» и считает, что это параметр. Можете ли вы разместить таблицу биллинга в представлении «Дизайн»? (обязательно включите AsOfDate – Gene

+0

Также .. Если вы используете только одну таблицу в своем запросе, нет необходимости указывать «Биллинг» перед каждым полем. – Gene

ответ

1

Он может быть сокращен до этого:

Dim wrkSpace As Workspace 
Dim dbThisDB As DAO.Database 
Dim rsBilling As DAO.Recordset 
Dim strBillingSQL As String 

Set wrkSpace = CreateWorkspace("GVUsers", "admin", "", dbUseJet) 
Set dbThisDB = wrkSpace.OpenDatabase("GV User Analysis.accdb") 

strBillingSQL = "SELECT Billing.ID, Billing.CompanyCode, Billing.CompanyName, Billing.TraderName, Billing.TraderID, Billing.ConnectionType," _ 
& "Billing.IsDisabled, Billing.SetupDate, Billing.TPLogCount, Billing.HasConcession, Billing.IsBillable, Billing.BillingPeriod, Billing.DeskByOrdersTrades," _ 
& "Billing.DeskByPermissions, Billing.OverallDeskAllocation, Billing.HasGasPermissions, Billing.HasPowerPermissions, Billing.HasCoalPermissions, Billing.TradesCount," _ 
& "Billing.OrdersCount, Billing.AllocationGas, Billing.AllocationPower, Billing.AllocationCoal, Billing.AllocationMethod,Billing.AsOfDate" _ 
& " FROM Billing;" 

Set rsBilling = dbThisDB.OpenRecordset(strBillingSQL, dbOpenDynaset) '<---- 3061 error is returned here 

Эта ошибка указывает на то, что поле в strBillingSQL написано с ошибками или не существует в таблице.

+0

Спасибо Gustav. SQL в коде был скопирован из рабочего запроса, встроенного в FE и имена не изменены и т. д. (поэтому полям предшествует имя таблицы – GazG

+0

Добавьте 'Debug.Print strBillingSQL' (в строке перед' Set rsBilling') код, который Gustav дал вам и запустил. Перейдите в окно Immediate (С trl + g возьмет вас туда) и скопируйте текст инструкции. Затем откройте 'GV User Analysis.accdb' в Access, создайте новый запрос в конструкторе запросов, переключите его на SQL View и вставьте в текст.Когда вы запускаете этот запрос, каково имя параметра, для которого Access просит вас указать значение? (Независимо от того, что имя, Access не находит соответствующее имя поля в этой версии таблицы 'Billing'.) – HansUp

+0

Я всегда думал, что вам нужно использовать« & - »в конце строк, а не« - & »(замените тире подчеркиванием, по какой-то причине подчеркивания не появлялись)? –

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