как я могу контролировать порядок, в котором выполняются подключения к данным Excel?

Я настраиваю автоматизированное задание, которое перебирает стек данных SQL каждый раз, когда обновляются подключения к данным рабочего листа Excel, и сохраняет рабочий лист под динамически заданным именем. У меня есть 3 подключения к данным, которые указывают на хранимые процедуры SQL. С технической точки зрения все работает нормально, но теперь я понял, что порядок 3-х выполненных подключений к данным меняется непредсказуемо. Это приводит к тому, что данные не синхронизируются. Параметр цикла задается первой сохраненной прокудерой, поэтому она должна выполняться первой. Как я могу точно контролировать, в каком порядке выполняются эти соединения.

Записал порядок идентификаторов соединений при вызове хранимой процедуры: (3,2,1), (3,1,2), (1,3,2) - следующие 4 цикла не изменились

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

Мартин


person Barnabeck    schedule 14.11.2020    source источник
comment
Пожалуйста, покажите нам, как вы вызываете процедуры. Я предполагаю, что они вызываются с помощью цикла For ... Each, в котором не указана последовательность, и вам следует попробовать вызвать их по их порядковым номерам. С другой стороны, если вы вызываете их по порядковому номеру, они сохраняются методом For ... Each и должны быть идентифицированы по имени.   -  person Variatus    schedule 14.11.2020
comment
Я еще не дошел до программирования макроса. Я все еще вручную обновляю подключение для передачи данных с помощью кнопки: Обновить все подключения   -  person Barnabeck    schedule 14.11.2020
comment
#Вариатус Ок. Размышляя над вашим ответом, я понимаю, что могу вызвать соединение отдельно. Я очень простой пользователь Excel и всегда использовал команду UpdateAll в предыдущей версии этого файла Excel. Это звучит как возможный путь. Но вы должны согласиться с тем, что нажатие кнопки UpdateAll должно выполнять соединения в одном предсказуемом (алфавитном?) порядке.   -  person Barnabeck    schedule 14.11.2020
comment
Нет. Во многих случаях Excel создает индексы в зависимости от последовательности создания или загрузки. Какова, например, последовательность книг в памяти?   -  person Variatus    schedule 14.11.2020
comment
@Variatus, извините, но я не понимаю вашего вопроса. У меня есть 1 соединение (1) на листе 1 и 2 на листе 2 (2 и 3). Оба соединения рабочего листа2 связаны с рабочим листом1. Последовательность загрузки описана выше. Я просто постоянно нажимаю кнопку UpdateAll. Какие индексы меняются? Для меня это выглядит как абсолютно стабильная повторяющаяся задача.   -  person Barnabeck    schedule 14.11.2020
comment
Извините, это был риторический вопрос, призванный показать, что соединения могут иметь последовательность в памяти, отличную от алфавитной по имени. Все соединения сгруппированы в Collection, который представляет собой программную конструкцию, в которой каждый член имеет порядковый номер. Однако я не знаю, когда Collection, на который вы ссылаетесь, создается внутри. Это может быть в момент нажатия кнопки. В этом случае последовательность будет зависеть от хранилища в другом месте, где соединения хранятся и индексируются в той последовательности, в которой они были созданы.   -  person Variatus    schedule 14.11.2020
comment
@Variatus Хорошо, как угодно. Спасибо за подсказки и информацию, теперь я знаю, как обойти проблему, вызвав 3 соединения по отдельности. Но я решу это, скорее всего, в SQL, введя отдельные счетчики циклов для 3 соединений. В конце концов, это все еще выглядит как ошибочное поведение для меня.   -  person Barnabeck    schedule 14.11.2020


Ответы (1)


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

введите здесь описание изображения

Затем в коде, который вы запускаете с помощью кнопки, укажите обновление каждого отдельного запроса в нужной последовательности и (просто для ясности) используйте параметр BackgroundQuery:=False, чтобы каждый запрос завершался до начала следующего.

Sheet1.QueryTables("QueryName1").Refresh BackgroundQuery:=False
Sheet2.QueryTables("QueryName2").Refresh BackgroundQuery:=False
Sheet2.QueryTables("QueryName3").Refresh BackgroundQuery:=False
person user9601310    schedule 15.11.2020
comment
Интересный момент! Да, на самом деле можно управлять порядком в макроскрипте. НО тот факт, что нажатие кнопки «Обновить все» приводит к тому, что соединение выполняется в последовательности порядка, которая постоянно меняется, настолько сильно разочаровывает и содержит ошибки, что я изменил свои запросы таким образом, что порядок больше не имеет значения. Мы с Excel никогда не будем друзьями. Последнее разочаровывающее открытие, которое мне придется исследовать: мой запрос работает с динамическим SQL, который возвращает заголовки столбцов на основе языка, связанного с этим набором данных, который может отличаться при каждом обновлении... и Excel не переваривает это - person Barnabeck; 15.11.2020