Проблемы с обновлением соединения Excel OLE DB - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть книга Excel с двумя динамическими запросами OLE DB.У меня проблемы с обновлениями.

Для настройки у меня в качестве источника используется табличная функция SQL.Данные имеют вид ...

SGrp   SG_Desc   SKU   SKU_Desc   Server   Billed
1      Item 1    111   whatever    15        12
1      Item 2    222   some more   10         9
2      Item 3    333   zzz         10         8
3      Item 4    555   abc         20        18

На первом листе («Всего») у меня есть подключение для передачи данных, которое суммирует группы с текстом команды, динамически изменяемого одной кнопкой.

SELECT SGrp, SG_Desc, SUM(Served) AS Served, SUM(Billed) AS Billed FROM mySQLdb ('8/19/2018','8/25/2018') WHERE SGrp <> '' GROUP BY SGrp, SG_Desc ORDER BY SG_Desc

Затем у меня есть ячейка со списком проверки данных, которая выбирает группу и кнопку для запуска VBA для динамического изменения другого соединения.Также есть две ячейки с датой начала и окончания отчета для фильтрации.Когда я нажимаю кнопку «Сведения», запускается приведенный ниже код.

Private Sub RunDetail_Click()

Dim StartDate As Date
Dim EndDate As Date
Dim SGrp As String

Range("A1").Value = Range("G8").Value2

StartDate = Sheets("Overall").Range("H1").Value
EndDate = Sheets("Overall").Range("H2").Value
SGrp = Sheets("Overall").Range("A1").Value

SGrp = LTrim(RTrim(SGrp))

With ActiveWorkbook.Connections("CJP_DeliveryRecap_Detail").OLEDBConnection
    .CommandText = "SELECT SKU, SKU_Desc, Served, Billed FROM mySQLdb ('" & StartDate & "','" & EndDate & "') WHERE SG_Desc='" & SGrp & "'"
'    .Refresh
'    ActiveWorkbook.Connections("CJP_DeliveryRecap_Detail").Refresh
End With

'RefreshOLEDB
'ThisWorkbook.RefreshAll
ActiveWorkbook.Connections("CJP_DeliveryRecap_Detail").Refresh
'Application.CalculateUntilAsyncQueriesDone

Application.Wait (Now + TimeValue("0:00:03"))

Dim rc As Integer
Dim i As Integer

Worksheets("Detail").Activate

With Worksheets("Detail").Range("CJP_DeliveryRecap_Detail")
    rc = .Rows.Count
End With

With Worksheets("Detail").Range("E1048576")
    .Select
    .End(xlUp).Select
End With
i = Selection.Row

Worksheets("Detail").Range("E5").Select

Worksheets("Detail").Range("E5:G" & i).ClearContents

Worksheets("Detail").Range("E5").Value = 1
Worksheets("Detail").Range("F5").Value = "=+CJP_DeliveryRecap_Detail[@Served]*E5"
Worksheets("Detail").Range("G5").Value = "=+CJP_DeliveryRecap_Detail[@Billed]*E5"
Sheets("Detail").Range("E5:G5").Copy Sheets("Detail").Range("E6:E" & rc + 4)
Sheets("Detail").Range("F1").Value = ("=SUM(F5:F" & rc + 4 & ")")
Sheets("Detail").Range("G1").Value = ("=SUM(G5:G" & rc + 4 & ")")

End Sub

Итак, что он делает?Первая «странная» вещь заключается в том, что я иногда получаю ошибки в коде, по которым я должен продолжать.Много раз, но не все, он попадает в строку Application.Wait, затем в рабочую таблицу («Подробно»). Активируется строка, а иногда и строка, где я задаю значения или копирую данные.

Есть некоторыекомментарии, в которых я тестировал различные обновления и т. д. Проблема заключается в том, что когда код завершает работу, он правильно отображает данные, но расчеты размера результатов взяты из предыдущего набора.Если я нажму на кнопку второй раз, она рассчитывает их правильно.Я, конечно, предпочел бы не иметь произвольную задержку в 3 секунды, а просто запустить остальную часть кода после того, как будут получены результирующие записи.

Где я иду не так, как бью головой о стенус этим.Большая часть того, что я делаю, в Access, но Excel был подходящим инструментом в этом случае.

Я только что подумал, но не обрадовался, будет ли работать отдельный подпрограмма для обработки калибровок размера записи и ячейкизначения clear \ set и вызовите это с помощью нажатия кнопки или оно не будет сгенерировано до тех пор, пока не закончится исходное подпрограмма.

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

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Если хранимая процедура, вызываемая из Excel, не содержит «SET NOCOUNT ON», она не будет работать должным образом из Excel.У меня была та же проблема, и SET NOCOUNT ON не был включен в мой сохраненный процесс;второй раз, когда я добавил его, это сработало!

0 голосов
/ 26 сентября 2018

Вам нужно дождаться завершения запроса, прежде чем продолжить вычисления.
Вам нужно добавить .BackgroundQuery = False к вашему соединению до .refresh

With ActiveWorkbook.Connections("CJP_DeliveryRecap_Detail").OLEDBConnection
    .BackgroundQuery = False
    .CommandText = "SELECT SKU, SKU_Desc, Served, Billed FROM mySQLdb ......"
    .Refresh
End With

Это должно помочь

...