|
Выгрузка данных по одному обращению к базе данных
|
|||
---|---|---|---|
#18+
Добрый вечер, Есть база данных, из которой нужно по определенным условиям выгрузить данные в excel в определенные ячейки. Пример во вложении. Подскажите, пожалуйста, можно ли решить эту задачу обратившись к базе данных всего один раз? Например, загрузив данные в recordset, и уже из recordset эти данные выгружать в ячейки. Запрос из которого выгружаются данные большой и если всегда к нему обращаться, то процедура будет выполняться долго. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.02.2016, 17:58 |
|
Выгрузка данных по одному обращению к базе данных
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
29.02.2016, 17:59 |
|
Выгрузка данных по одному обращению к базе данных
|
|||
---|---|---|---|
#18+
Конечно можно. Проблема то в чем? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.02.2016, 18:54 |
|
Выгрузка данных по одному обращению к базе данных
|
|||
---|---|---|---|
#18+
Как-то так можно, например: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.02.2016, 19:05 |
|
Выгрузка данных по одному обращению к базе данных
|
|||
---|---|---|---|
#18+
PredeclaredКонечно можно. Проблема то в чем? А подскажите, пожалуйста, как это можно сделать. Никак не могу сообразить как решить эту задачу ... |
|||
:
Нравится:
Не нравится:
|
|||
29.02.2016, 19:41 |
|
Выгрузка данных по одному обращению к базе данных
|
|||
---|---|---|---|
#18+
MrShin, В вашем примере, как я понимаю он будет копировать всю таблицу и выгружать ее в ексель. Но задача состоит в том, чтобы выгрузить не всю таблицу а из таблицы взять только определенные значения и их выгрузить в определенные ячейки в ексель. Т.е. нужно вместо "xlSheet.Range("A1").CopyFromRecordset rst" написать какой то алгоритм, который будет из рекордсета брать данные и разносить их по ячейкам. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.02.2016, 19:44 |
|
Выгрузка данных по одному обращению к базе данных
|
|||
---|---|---|---|
#18+
NovPal... написать какой то алгоритм, который будет из рекордсета брать данные и разносить их по ячейкам. ... Ну так напиши. Проблема в чем? Получить данные в рекордсет? Получить данные из рекордсета? Присвоить значение ячейке? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.02.2016, 19:51 |
|
Выгрузка данных по одному обращению к базе данных
|
|||
---|---|---|---|
#18+
Я могу данные записать в рекордсет, но как из рекордсета их потом выгружать, не обращаясь к базе данных у меня не получается. Либо их выгружать таблицей, как предложил MrShin, либо макрос будет обращаться еще раз к базе данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.02.2016, 20:08 |
|
Выгрузка данных по одному обращению к базе данных
|
|||
---|---|---|---|
#18+
NovPal, если Вам привычнее в екселе с массивом, то Вы можете записать рекордсет в массив и далее обращаться к нему совершенно произвольно. Пример записи рекордсета в массив с помощью GetRows в предположении, что рекордсет уже создан Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.02.2016, 21:21 |
|
Выгрузка данных по одному обращению к базе данных
|
|||
---|---|---|---|
#18+
Можно выгрузить таблицу на скрытый лист, а нужные данные растащить по основному листу формулами. Можно составить такой запрпрос к рекордсету, чтобы там появлялись в том числе и статические данные, необходимые для оформления, форматирование и валидацию можно скопировать позднее. Можно дергать один рекордсет с с разными фильтрами Можно наоткрывать кучу рекордсетов и использовать их на разных частях листа - правильно написанный рекордсет открывается мгновенно, результаты сложных медленных запросов можно записывать во временные таблицы для ускорения Вариантов масса, в приведенном примере показана, пожалуй, самая быстрая технология записи в шаблон Экселя ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 07:49 |
|
Выгрузка данных по одному обращению к базе данных
|
|||
---|---|---|---|
#18+
На скрытый лист выгружать, чтобы потом растаскивать формулами, не хочется, потому что файл большой, он и так тормозит а если еще будет 150 формул, работающих с массивами, то excel наверное вообще ляжет. И формулы могут сбиться, хотя это и поправимо Дергать рекордсет с фильтрами я пытался, но он, кажется, все равно обращается к базе данных, потому что получилось по времени столько же(очень долго), сколько если бы сразу обращаться к базе данных Рекордсет открывается долго (секунды 2-3), при 150 значений получится 300 сек (5 мин) Поэтому хочется всего один раз обратиться к рекордсету. Сейчас постараюсь сделать как предложил mds_world, записать рекордсет в массив и по нему уже раскидывать. Если нельзя работать с рекордсетом, то это значит самый правильный вариант. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 08:55 |
|
Выгрузка данных по одному обращению к базе данных
|
|||
---|---|---|---|
#18+
3 секунды на открытие рекордсета это очень долго. Либо проблема с индексами, либо с оптимизацией запроса, либо просто много данных и сложные преобразования. Запишите результаты во временную таблицу и дергайте рекордсет уже на эту таблицу сколько нужно - это будет работать мгновенно. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 09:16 |
|
Выгрузка данных по одному обращению к базе данных
|
|||
---|---|---|---|
#18+
NovPal, а какие проблемы при работе с рекордсетом? И какие преимущества у массива? Конкретно. Или просто жалуемся на жизнь? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 09:31 |
|
Выгрузка данных по одному обращению к базе данных
|
|||
---|---|---|---|
#18+
Запрос из которого берутся данные состоит из множество запросов, которые тоже состоят из запросов. Поэтому он открывается немгновенно, хотя может я что то неправильно сделал и этот запрос можно оптимизировать. Преимущество массива в том, что не нужно будет много раз обращаться к базе данных. Один раз обратившись к базе данных, запишим данные в массив и уже из массива будем брать данные и вставлять их в ячейки. Мне кажется, это должно получиться очень быстро. А что значит записать результат во временную таблицу? Вы имеете в виду создать clone и с ним работать? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 09:39 |
|
Выгрузка данных по одному обращению к базе данных
|
|||
---|---|---|---|
#18+
NovPalПреимущество массива в том, что не нужно будет много раз обращаться к базе данных. Один раз обратившись к базе данных, запишим данные в массив и уже из массива будем брать данные и вставлять их в ячейки. Мне кажется, это должно получиться очень быстро. А что мешает брать данные из рекордсета? Если просто читать данные, рекордсет никуда не обращается. Фильтровать рекордсет не стоит, проще и дешевле открывать заново. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 09:46 |
|
Выгрузка данных по одному обращению к базе данных
|
|||
---|---|---|---|
#18+
Если все время открывать рекордсет, то получится долго, поэтому его хотелось бы открыть всего один раз. И как можно брать данные из рекордсета если его не фильтровать? Рекордсет состоит из 5 столбцов и 200 строк(4 столбца условия, по которым отбирается значение и один столбец само значение), как можно без фильтрации выбрать нужную строку и из нее вставить значение? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 09:55 |
|
Выгрузка данных по одному обращению к базе данных
|
|||
---|---|---|---|
#18+
NovPal, посмотрел твой пример. Я бы сформировал дополнительное поле в запросе и создал "ключ" из критериев отбора. Таким образом можно было бы воспользоваться методом ADODB.Recordset.Find нашёл и расставил все нужные сочетания. Таки образом, рекордсет нужно открыть один раз. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 10:07 |
|
Выгрузка данных по одному обращению к базе данных
|
|||
---|---|---|---|
#18+
Вы имеете в виду, что нужно добавить столбец, который объеденит все критерии в один и по нему уже искать значение? Надо посмотреть метод ADODB.Recordset.Find может это выход из ситуации. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 10:29 |
|
Выгрузка данных по одному обращению к базе данных
|
|||
---|---|---|---|
#18+
А подскажите, пожалуйста, почему если я в коде добавляю clone, то код перестает работать? Я заменил всего лишь одну строчку Set rs = connDB.Execute("Select * from " & sTable) на две строки. Спасибо. Set rs1 = connDB.Execute("Select * from " & sTable) Set rs = rs1.Clone ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 12:41 |
|
Выгрузка данных по одному обращению к базе данных
|
|||
---|---|---|---|
#18+
NovPal, нинада так делать. И в первой строке, и во второй. В первой строке получаем набор данных только для чтения и только вперёд. Зачем копия это рекордсета понадобилась в разрезе первоначального вопроса? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 12:58 |
|
Выгрузка данных по одному обращению к базе данных
|
|||
---|---|---|---|
#18+
Хотел создать клона вместо временной таблицы, подумал, что так проще а работать будет одинаково. Сейчас тогда поизучаю как создавать временные таблицы и вносить туда данные из рекордсета) Мне кажется этот способ будет проще, чем создавать дополнительные поля с ключом. И пока нет уверенности, что find будет быстро работать. Мне кажется он все равно будет обращаться к базе данных ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 13:04 |
|
Выгрузка данных по одному обращению к базе данных
|
|||
---|---|---|---|
#18+
NovPal...Мне кажется он все равно будет обращаться к базе данных...В таких случаях тестируют, а не рассуждают. Там процедуру написать... NovPal...Сейчас тогда поизучаю как создавать временные таблицы и вносить туда данные... SELECT…INTO ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 13:20 |
|
Выгрузка данных по одному обращению к базе данных
|
|||
---|---|---|---|
#18+
Спасибо. Сейчас попытаюсь протестировать) просто это займет много времени и не хотелось его тратить в пустую. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 13:27 |
|
Выгрузка данных по одному обращению к базе данных
|
|||
---|---|---|---|
#18+
А подскажите, пожалуйста, в чем ошибка кода, в этом коде я хочу, чтобы при нахождении параметра в ячейку выводилось бы значение. sSq1 это параметр, который будет искаться в столбце key.Спасибо. sSq1 = a & B & Sheets("Sheet1").Range("K1") & Sheets("Sheet1").Range("N1") rs.Find "[key] = '" & sSq1 & "'" If Not rs.EOF Then Sheets("Sheet1").Cells(4 + i, 1 + i1) = rs.Fields("Value1") End If ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2016, 14:34 |
|
|
start [/forum/topic.php?fid=45&msg=39181870&tid=1613862]: |
0ms |
get settings: |
12ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
33ms |
get topic data: |
14ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
others: | 17ms |
total: | 163ms |
0 / 0 |