2013-09-16 2 views
2

У меня есть сводный запрос. Мне нужно прокрутить и добавить в другую временную таблицу. Сводный запрос представляет собой сумму найденных различных статусов. Статусы являются Early, Late и Своевременное. На основании того, что пользователь выбирает, не все статусы присутствуют. Поэтому, когда я запускаю следующее:Проверьте, существует ли столбец в сводном запросе

Set rs1 = CurrentDb.OpenRecordset("MyReceivingOnTimeDeliverySummary", dbOpenDynaset) 
Set rs = CurrentDb.OpenRecordset("TRANSFORM Sum(recvqty) AS SumOfrecvqty " & _ 
           "SELECT supname, Sum(recvqty) AS TotalReceivedQty " & _ 
           "FROM MyReceivingOnTimeDeliveryDetail " & _ 
           "GROUP BY supname " & _ 
           "PIVOT Status", dbOpenDynaset) 
If (rs.RecordCount <> 0) Then 
    rs.MoveFirst 
    Do While rs.EOF <> True 
     rs1.AddNew 
     rs1.Fields("[supname]").value = rs.Fields("[supname]").value 
     rs1.Fields("[TotalReceivedQty]").value = rs.Fields("[TotalReceivedQty]").value 
     rs1.Fields("[Early]").value = rs.Fields("[Early]").value 
     rs1.Fields("[Late]").value = rs.Fields("[Late]").value 
     rs1.Fields("[OnTime]").value = rs.Fields("[On-Time]").value 
     rs1.Update 
     rs.MoveNext 
    Loop 
End If 

Если один из статусов не в результатах запроса, то я получаю сообщение об ошибке, когда я добавляю, что значение в MyReceivingOnTimeDeliverySummary таблицы.

Как проверить для каждого состояния, а если нет, то добавить как 0?

ответ

1

Установите значение по умолчанию для нуля для любого из полей MyReceivingOnTimeDeliverySummary, которые могут отсутствовать в сводном запросе.

Затем проведите по полям в наборе записей сводных запросов и добавьте эти значения полей в соответствующие поля в другом наборе записей.

Dim fld As DAO.Field 
If Not (rs.BOF And rs.EOF) Then 
    rs.MoveFirst 
    Do While Not rs.EOF 
     rs1.AddNew 
     For Each fld In rs.Fields 
      rs1.Fields(fld.Name).value = rs.Fields(fld.Name).value 
     Next 
     rs1.Update 
     rs.MoveNext 
    Loop 
End If 

Кстати, вы также можете найти код работает быстрее, если вы заменяете dbAppendOnly для dbOpenDynaset здесь:

OpenRecordset("MyReceivingOnTimeDeliverySummary", dbOpenDynaset) 

Я не уверен, сколько из воздействия, что изменение будет. Это не изменяет логики того, что вы пытаетесь выполнить. И, возможно, любое влияние скорости было бы незначительным. Но это не будет стоить вам многого, чтобы узнать. :-)

+0

Работал как очарование. Я попробовал dbAppendOnly vs dbOpenDynaset и не заметил различий в производительности между ними. –

1

Вы должны избегать наборов записей для простых операций, таких как копирование с небольшими равномерными изменениями в этом случае. Но хорошие новости: все упростилось!

Во-первых, используйте инструкцию SQL, которую вы уже должны создать запрос.

Dim db As Database 
Set db= CurrentDb 
db.CreateQueryDef "qry1", "sqltext" 

Затем, из этого запроса, ВЫБРАТЬ В (или ВСТАВИТЬ В) свою сводную таблицу.

db.Execute "SELECT * INTO MyReceivingOnTimeDeliverySummary FROM qry1" 

Тогда вы можете добавить поля, если их там нет.

On Error Resume Next: db.Execute "ALTER TABLE MyReceivingOnTimeDeliverySummary ADD COLUMN Early NUMBER": Err.Clear: On Error GoTo 0 
On Error Resume Next: db.Execute "ALTER TABLE MyReceivingOnTimeDeliverySummary ADD COLUMN Late NUMBER": Err.Clear: On Error GoTo 0 
On Error Resume Next: db.Execute "ALTER TABLE MyReceivingOnTimeDeliverySummary ADD COLUMN OnTime NUMBER": Err.Clear: On Error GoTo 0 

Наконец, исправьте нули до нуля.

db.Execute "UPDATE [MyReceivingOnTimeDeliverySummary] SET [Early] = Nz([Early],0)" 
db.Execute "UPDATE [MyReceivingOnTimeDeliverySummary] SET [Late] = Nz([Late],0)" 
db.Execute "UPDATE [MyReceivingOnTimeDeliverySummary] SET [OnTime] = Nz([OnTime],0)" 

Почему так? По моему опыту, SQL намного быстрее, чем наборы записей.

+0

Это было бы хорошим способом обработки, однако, если статус не найден в Pivot-запросе, тогда оператор execute здесь не создает это поле в таблице MyReceivingOnTimeDeliverySummary. Итак, следующая инструкция обновления вы имеете ошибки, потому что такого поля нет. –

+0

«Исходя из того, что пользователь выбирает, не все статусы присутствуют». Упс, пропустил это предложение и полностью неверно истолковал этот вопрос. Ну, вы определенно можете просто изменить запрос, чтобы при необходимости добавлять пустые поля.Я собираюсь подумать о том, как это сделать, потому что я по-прежнему считаю, что это лучшее (и более элегантное) решение вашей проблемы. – Ben

+0

Woot! Исправлена ​​работа для ваших нужд. Узнал кое-что на этом пути. (Было бы проще, если бы Access имел DEFAULT в DAO.) – Ben

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