powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Выгрузка данных по одному обращению к базе данных
24 сообщений из 24, страница 1 из 1
Выгрузка данных по одному обращению к базе данных
    #39181750
NovPal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер,

Есть база данных, из которой нужно по определенным условиям выгрузить данные в excel в определенные ячейки. Пример во вложении. Подскажите, пожалуйста, можно ли решить эту задачу обратившись к базе данных всего один раз? Например, загрузив данные в recordset, и уже из recordset эти данные выгружать в ячейки. Запрос из которого выгружаются данные большой и если всегда к нему обращаться, то процедура будет выполняться долго. Спасибо.
...
Рейтинг: 0 / 0
Выгрузка данных по одному обращению к базе данных
    #39181753
NovPal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Выгрузка данных по одному обращению к базе данных
    #39181829
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конечно можно.

Проблема то в чем?
...
Рейтинг: 0 / 0
Выгрузка данных по одному обращению к базе данных
    #39181846
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то так можно, например:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Set xlApp = CreateObject("Excel.Application")
xlApp.Visible = True
Set xlWork = xlApp.Workbooks.Open(strFileName)
Set xlSheet = xlWork.Sheets("Sheet1")

Set rst = CurrentDb.OpenRecordset("select * from MyTable")

xlSheet.Range("A1").CopyFromRecordset rst
...
Рейтинг: 0 / 0
Выгрузка данных по одному обращению к базе данных
    #39181867
NovPal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PredeclaredКонечно можно.

Проблема то в чем?

А подскажите, пожалуйста, как это можно сделать. Никак не могу сообразить как решить эту задачу
...
Рейтинг: 0 / 0
Выгрузка данных по одному обращению к базе данных
    #39181870
NovPal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MrShin,

В вашем примере, как я понимаю он будет копировать всю таблицу и выгружать ее в ексель. Но задача состоит в том, чтобы выгрузить не всю таблицу а из таблицы взять только определенные значения и их выгрузить в определенные ячейки в ексель. Т.е. нужно вместо "xlSheet.Range("A1").CopyFromRecordset rst" написать какой то алгоритм, который будет из рекордсета брать данные и разносить их по ячейкам. Спасибо.
...
Рейтинг: 0 / 0
Выгрузка данных по одному обращению к базе данных
    #39181872
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NovPal... написать какой то алгоритм, который будет из рекордсета брать данные и разносить их по ячейкам. ...
Ну так напиши.

Проблема в чем?

Получить данные в рекордсет?
Получить данные из рекордсета?
Присвоить значение ячейке?
...
Рейтинг: 0 / 0
Выгрузка данных по одному обращению к базе данных
    #39181882
NovPal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я могу данные записать в рекордсет, но как из рекордсета их потом выгружать, не обращаясь к базе данных у меня не получается. Либо их выгружать таблицей, как предложил MrShin, либо макрос будет обращаться еще раз к базе данных.
...
Рейтинг: 0 / 0
Выгрузка данных по одному обращению к базе данных
    #39181925
Фотография mds_world
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NovPal, если Вам привычнее в екселе с массивом, то Вы можете записать рекордсет в массив и далее обращаться к нему совершенно произвольно. Пример записи рекордсета в массив с помощью GetRows в предположении, что рекордсет уже создан
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Dim massv, int1, int2
rst.MoveLast: rst.MoveFirst
'Записываем рекордсет в массив massv
massv=rst.GetRows(rst.RecordCount)
'Определяем размерности массива
int1=UBound(massv, 1)
int2=UBound(massv, 2)
Debug.Print int1, int2
...
Рейтинг: 0 / 0
Выгрузка данных по одному обращению к базе данных
    #39182060
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно выгрузить таблицу на скрытый лист, а нужные данные растащить по основному листу формулами.

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

Можно дергать один рекордсет с с разными фильтрами

Можно наоткрывать кучу рекордсетов и использовать их на разных частях листа - правильно написанный рекордсет открывается мгновенно, результаты сложных медленных запросов можно записывать во временные таблицы для ускорения

Вариантов масса, в приведенном примере показана, пожалуй, самая быстрая технология записи в шаблон Экселя
...
Рейтинг: 0 / 0
Выгрузка данных по одному обращению к базе данных
    #39182079
NovPal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На скрытый лист выгружать, чтобы потом растаскивать формулами, не хочется, потому что файл большой, он и так тормозит а если еще будет 150 формул, работающих с массивами, то excel наверное вообще ляжет. И формулы могут сбиться, хотя это и поправимо

Дергать рекордсет с фильтрами я пытался, но он, кажется, все равно обращается к базе данных, потому что получилось по времени столько же(очень долго), сколько если бы сразу обращаться к базе данных

Рекордсет открывается долго (секунды 2-3), при 150 значений получится 300 сек (5 мин)

Поэтому хочется всего один раз обратиться к рекордсету. Сейчас постараюсь сделать как предложил mds_world, записать рекордсет в массив и по нему уже раскидывать. Если нельзя работать с рекордсетом, то это значит самый правильный вариант. Спасибо.
...
Рейтинг: 0 / 0
Выгрузка данных по одному обращению к базе данных
    #39182094
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
3 секунды на открытие рекордсета это очень долго. Либо проблема с индексами, либо с оптимизацией запроса, либо просто много данных и сложные преобразования. Запишите результаты во временную таблицу и дергайте рекордсет уже на эту таблицу сколько нужно - это будет работать мгновенно.
...
Рейтинг: 0 / 0
Выгрузка данных по одному обращению к базе данных
    #39182112
\\\\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NovPal, а какие проблемы при работе с рекордсетом? И какие преимущества у массива? Конкретно. Или просто жалуемся на жизнь?
...
Рейтинг: 0 / 0
Выгрузка данных по одному обращению к базе данных
    #39182117
NovPal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Запрос из которого берутся данные состоит из множество запросов, которые тоже состоят из запросов. Поэтому он открывается немгновенно, хотя может я что то неправильно сделал и этот запрос можно оптимизировать.
Преимущество массива в том, что не нужно будет много раз обращаться к базе данных. Один раз обратившись к базе данных, запишим данные в массив и уже из массива будем брать данные и вставлять их в ячейки. Мне кажется, это должно получиться очень быстро.
А что значит записать результат во временную таблицу? Вы имеете в виду создать clone и с ним работать?
...
Рейтинг: 0 / 0
Выгрузка данных по одному обращению к базе данных
    #39182124
\\\\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NovPalПреимущество массива в том, что не нужно будет много раз обращаться к базе данных. Один раз обратившись к базе данных, запишим данные в массив и уже из массива будем брать данные и вставлять их в ячейки. Мне кажется, это должно получиться очень быстро. А что мешает брать данные из рекордсета? Если просто читать данные, рекордсет никуда не обращается. Фильтровать рекордсет не стоит, проще и дешевле открывать заново.
...
Рейтинг: 0 / 0
Выгрузка данных по одному обращению к базе данных
    #39182131
NovPal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если все время открывать рекордсет, то получится долго, поэтому его хотелось бы открыть всего один раз. И как можно брать данные из рекордсета если его не фильтровать? Рекордсет состоит из 5 столбцов и 200 строк(4 столбца условия, по которым отбирается значение и один столбец само значение), как можно без фильтрации выбрать нужную строку и из нее вставить значение?
...
Рейтинг: 0 / 0
Выгрузка данных по одному обращению к базе данных
    #39182145
\\\\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NovPal, посмотрел твой пример. Я бы сформировал дополнительное поле в запросе и создал "ключ" из критериев отбора. Таким образом можно было бы воспользоваться методом ADODB.Recordset.Find нашёл и расставил все нужные сочетания. Таки образом, рекордсет нужно открыть один раз.
...
Рейтинг: 0 / 0
Выгрузка данных по одному обращению к базе данных
    #39182177
NovPal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вы имеете в виду, что нужно добавить столбец, который объеденит все критерии в один и по нему уже искать значение? Надо посмотреть метод ADODB.Recordset.Find может это выход из ситуации. Спасибо.
...
Рейтинг: 0 / 0
Выгрузка данных по одному обращению к базе данных
    #39182397
NovPal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А подскажите, пожалуйста, почему если я в коде добавляю clone, то код перестает работать? Я заменил всего лишь одну строчку Set rs = connDB.Execute("Select * from " & sTable) на две строки. Спасибо.

Set rs1 = connDB.Execute("Select * from " & sTable)
Set rs = rs1.Clone
...
Рейтинг: 0 / 0
Выгрузка данных по одному обращению к базе данных
    #39182439
\\\\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NovPal, нинада так делать. И в первой строке, и во второй. В первой строке получаем набор данных только для чтения и только вперёд. Зачем копия это рекордсета понадобилась в разрезе первоначального вопроса?
...
Рейтинг: 0 / 0
Выгрузка данных по одному обращению к базе данных
    #39182449
NovPal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотел создать клона вместо временной таблицы, подумал, что так проще а работать будет одинаково. Сейчас тогда поизучаю как создавать временные таблицы и вносить туда данные из рекордсета) Мне кажется этот способ будет проще, чем создавать дополнительные поля с ключом. И пока нет уверенности, что find будет быстро работать. Мне кажется он все равно будет обращаться к базе данных
...
Рейтинг: 0 / 0
Выгрузка данных по одному обращению к базе данных
    #39182467
\\\\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NovPal...Мне кажется он все равно будет обращаться к базе данных...В таких случаях тестируют, а не рассуждают. Там процедуру написать...

NovPal...Сейчас тогда поизучаю как создавать временные таблицы и вносить туда данные... SELECT…INTO
...
Рейтинг: 0 / 0
Выгрузка данных по одному обращению к базе данных
    #39182483
NovPal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо. Сейчас попытаюсь протестировать) просто это займет много времени и не хотелось его тратить в пустую.
...
Рейтинг: 0 / 0
Выгрузка данных по одному обращению к базе данных
    #39182588
NovPal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А подскажите, пожалуйста, в чем ошибка кода, в этом коде я хочу, чтобы при нахождении параметра в ячейку выводилось бы значение. 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
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Выгрузка данных по одному обращению к базе данных
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]