|
v7: 1c++: Порционное получение результата запроса | ☑ | ||
---|---|---|---|---|
0
Franchiser
гуру
30.08.17
✎
12:06
|
В результате более миллиона строк, как можно получить результат запроса порциями по 50000 с ссылками на объекты 1с?
|
|||
1
Ёпрст
30.08.17
✎
12:10
|
обходить через рекорсет
|
|||
2
МихаилМ
30.08.17
✎
12:12
|
выгрузить в вт
из вт читать порциями |
|||
3
Franchiser
гуру
30.08.17
✎
12:14
|
(1) при обходи через рекордсет если появляется ссылка то появляется ошибка "1C++: Connection is busy with results for another hstmt"
как я понял это из-за того, что в процессе фетча идет дополнительные запросы к базе. |
|||
4
Ёпрст
30.08.17
✎
12:16
|
(3) Там всего лишь нужно Открыть() + пока ВыборкаОткрыта +След
|
|||
5
Ёпрст
30.08.17
✎
12:16
|
так делаешь хоть ?
|
|||
6
Franchiser
гуру
30.08.17
✎
12:19
|
(4) да именно так
Но если есть в запросе айдишники которые должны быть преобразованы в ссылки, то идет ошибка на этапе добавления строк в ТЗ или по Сообщить(). Пробовал и в запросе описывать типизацию и после запроса исползьовать объект MetaDataWorks. На других форумах пишут есть 2 варианта: 1. Дофетчить выборку 2. Включить MARS на сервере. Как можно сделать не прибегая ко 2-му варианту? |
|||
7
Franchiser
гуру
30.08.17
✎
12:22
|
У меня идея следующая: минуя ТЗ вывести результат сразу в табличный документ (вроде как там может быть больше строк чем в ТЗ), но я на текущий момент не могу показать ссылки.
|
|||
8
Ёпрст
30.08.17
✎
12:24
|
(7) не угадал. Моксель жрёт еще больше памяти, чем тз.
В ИТЗ не пробовал сразу выгружать ? |
|||
9
Ёпрст
30.08.17
✎
12:25
|
или, в дбф/xls, например ?
|
|||
10
Franchiser
гуру
30.08.17
✎
12:26
|
Нет, не пробовал. В крайнем случае на 10 документов разбить (не знаю будут ли они все в оперативной памяти сразу).
Мне потом еще по этим данным нужно делать корректирующие документы. |
|||
11
Franchiser
гуру
30.08.17
✎
12:27
|
ТЗ валит программу примерно уже на 400000
|
|||
12
Franchiser
гуру
30.08.17
✎
12:29
|
как выгрузить в ИТЗ из SQL?
|
|||
13
Ёпрст
30.08.17
✎
12:31
|
(12) ВыполнитьИнструкцию же..там в параметр передаешь ИТЗ
|
|||
14
Franchiser
гуру
30.08.17
✎
12:31
|
Есть разница в использовании памяти ИТЗ и ТЗ?
|
|||
15
Ёпрст
30.08.17
✎
12:31
|
||||
16
Ёпрст
30.08.17
✎
12:32
|
(14) есть, итз, по-крайней мере, оптимизировали
|
|||
17
Ёпрст
30.08.17
✎
12:32
|
и это, попытка не пытка :)
|
|||
18
Franchiser
гуру
30.08.17
✎
12:32
|
ИТЗ на форму можно положить?
|
|||
19
Ёпрст
30.08.17
✎
12:33
|
если не поможет, то (2)
|
|||
20
Ёпрст
30.08.17
✎
12:33
|
(18) да. табличное поле же есть.
Можешь, и свой запрос поставщиком сделать.. |
|||
21
Franchiser
гуру
30.08.17
✎
12:34
|
(19) Да я думал сделать поле identity и читать из ВТ 10-ю запросами
|
|||
22
Franchiser
гуру
30.08.17
✎
12:34
|
"Можешь, и свой запрос поставщиком сделать.." не понял
|
|||
23
Ёпрст
30.08.17
✎
12:36
|
(22) поставщиком данных для табличного поля на форме.
Тебе этот результат в миллионы строк.. зачем вообще ? |
|||
24
Franchiser
гуру
30.08.17
✎
12:37
|
1. Пользователь запросил такой отчет
2. Потом по нему нужно создать корректирующие документы. Я получаю около 700000 строк из oracle закидываю в sql, сравниваю и получаю расхождения которые требуется откорректировать. |
|||
25
Franchiser
гуру
30.08.17
✎
12:38
|
(23) есть где то пример как привязать табличное поле к индексированной таблице, сделать поставщиком и тд?
|
|||
26
Ёпрст
30.08.17
✎
12:51
|
(25)
Процедура ПослеСозданияФормы() _Форма = СоздатьОбъект("Форма"); _Форма.УстановитьФорму(Форма); ТП = _Форма.СоздатьЭлементУправления("ТабличноеПоле", "ТП"); Колонка = ТП.Колонки.Добавить("Контрагент"); Колонка.Заголовок = "Контрагент"; Колонка.Данные = "Контрагент"; ТП.ПоставщикДанных = СоздатьОбъект("ПоставщикДанныхТЗ"); ТЗ = СоздатьОбъект("ИндексированнаяТаблица"); ТЗ.НоваяКолонка("Контрагент"); ТП.ПоставщикДанных.ТаблицаЗначений = ТЗ; КонецПроцедуры |
|||
27
Franchiser
гуру
30.08.17
✎
12:53
|
Проверил с использованием индексированной таблицы:
ошибка "Error: Cannot allocate memory" |
|||
28
Franchiser
гуру
30.08.17
✎
13:00
|
ПослеСозданияФормы() это предопределенная процедура?
Почему не попадает в отладчике ни в ПослеСозданияФормы() ни в ПослеОткрытия() |
|||
29
Franchiser
гуру
30.08.17
✎
13:01
|
На форму нужно закидывать табличное поле?
|
|||
30
Ёпрст
30.08.17
✎
13:03
|
(27) тогда , только несколько запросов лепить
|
|||
31
Ёпрст
30.08.17
✎
13:04
|
(29) кнопку или текст с идентификатором ТП
|
|||
32
Franchiser
гуру
30.08.17
✎
13:05
|
Это код для formex?
|
|||
33
Ёпрст
30.08.17
✎
13:05
|
(28) да. Должен быть загружен 1cpp перед этим.
Только не помню, чьё событие, возможно, формекса. Тогда и его загрузи |
|||
34
Ёпрст
30.08.17
✎
13:05
|
(32) итд и табл поле - это всё 1cpp
|
|||
35
Ёпрст
30.08.17
✎
13:06
|
*ИТЗ
|
|||
36
Franchiser
гуру
30.08.17
✎
13:11
|
Ошибка "Неудачная попытка создания ЭУ 'ТабличноеПоле'."
|
|||
37
Franchiser
гуру
30.08.17
✎
13:13
|
С кнопкой прокатило)
|
|||
38
toypaul
гуру
30.08.17
✎
13:38
|
не знаю как в 1С++ в ToySQL пока не обращаешься к реквизитам выборки через точки никаких доп запросов не делается. если нужны такие запросы, то выборка идет через доп. соединение, а все запрос от 1С через собственное. и все чики-пуки.
|
|||
39
toypaul
гуру
30.08.17
✎
13:42
|
если пользователь запросил отчет, то значит нужен вывод в таб документ. не знаю что будет с ним при 700 тыр строк, но можно в самой выборке разбивать таб док на части, сохранять его и потом показывать по частям.
|
|||
40
АЛьФ
30.08.17
✎
14:12
|
Хрм... И сколько понадобится пользователю времени, чтобы хотя бы просмотреть такой объем данных? Подозреваю, что их не нужно выводить, надо сразу по ним некие действия производить. А тогда можно тупо ставить ТОР 10. И в цикле запрос крутить, по десятку обрабатывая (это если отработанные потом в запрос не попадают).
|
|||
41
Franchiser
гуру
30.08.17
✎
17:21
|
(41) Ну понятно что пользователю такой объем может и не к чему, но почему не реализовано работа с обходом результата запороса с проставлением ссылок через доп. соединение в 1с++?
Раньше никто не получал ссылки с обходом выборки без использования выгрузки в ТЗ? |
|||
42
Franchiser
гуру
30.08.17
✎
17:26
|
еще нашел косяк в 1С++:
Если я помещаю внешние данные в 1 ВТ в SQL методомВыполнитьSQLИЗТЗ(), например по 50000 и строк не кратно 50000 (к примеру, 230000), то будет передано 230000, а 250000. Последние 20000 будут добиты. Обход ошибки: при передачи хвоста (30000) нужно заново подготовить запрос и отправлять результат на сервер. |
|||
43
Ёпрст
30.08.17
✎
17:28
|
(42) не делай sqlизТз, делай тупо insert
|
|||
44
Sserj
30.08.17
✎
17:48
|
(0) Ну вообще то можно просто и получать данные из запроса порциями
select top 50000 .... что то поделал, когда надо следующие select top 50000 where key > ПоследнийКлючПредыдущегоЗапроса. |
|||
45
Franchiser
гуру
30.08.17
✎
18:30
|
(44) для этого нужные уникальные (неповторяющиеся) ключи.
|
|||
46
Franchiser
гуру
30.08.17
✎
18:31
|
у меня запрос с конструкцией With RollUP
|
|||
47
Sserj
30.08.17
✎
21:18
|
(45) Дэк ты запрос не забирай сразу. Создай временную таблицу в скуле с ключом. Запрос свой туда инсертом впихай и из нее уже бери потихоньку.
|
|||
48
Franchiser
гуру
31.08.17
✎
00:31
|
(47) ок, так и реализовал
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |