|
Подскажите правильный способ проверки и записи таблицы в РС. | ☑ | ||
---|---|---|---|---|
0
Doomer
02.01.13
✎
19:08
|
Есть у меня РС периодический. Есть Таблица значений. Задача проверить есть ли записи из этой таблицы в РС и записать в РС только те которых в РС нет. Пытаюсь придумать "правильный", "восьмерочный" способ выполнения этой задачи.
|
|||
1
Ахмадинежад
02.01.13
✎
19:11
|
Создать набор записей, проставить в качестве отборов значения из столбцов (списки значений) и прочитать - если набор будет пустой - значит нет таких записей... Плюс результирующий набор пробежаться перебором
|
|||
2
Doomer
02.01.13
✎
19:13
|
Пока придумал такой способ
1. Делаю запрос к РС, там тоже добавляю колонку типа будево "Есть в РС". Все записи устанавливаю в "Истину" 2. Левым соединением пристегиваю к ТЗ данные из РС. 3. Выполняю запрос. 4. Выгружают из Таблицы запроса записи у которых "Есть в РС" равно "Ложь". 5. Полученную таблицу пихаю в РС. |
|||
3
Doomer
02.01.13
✎
19:14
|
(1) Может быть такая ситуация в ТЗ 10 строк из них 2 есть в РС, остальные нужно туда записать.
|
|||
4
Doomer
02.01.13
✎
19:19
|
РС периодический. Данные могут быть записаны в разное время. Например 2 записи попали в РС 01.12.12, а потом 06.12.12 нужно туда записать 6 из них 2 были записаны 01.12.12. Нельзя трогать старые 2 записи.
|
|||
5
fisher
02.01.13
✎
19:20
|
(2) Нифига не понял.
По идее, достаточно одного запроса с полным соединением ТЗ и РС, чтобы вернуть записи, которых нет в РС и нет в ТЗ. Или речь только о небольших "догрузках" в громадный РС? |
|||
6
Doomer
02.01.13
✎
19:25
|
(5) Попробую подробнее
1. Через менеджер временных таблиц передаю в запрос ТЗ. 2. Делаю вложный запрос к РС, там тоже добавляю колонку типа будево "Есть в РС". Все записи устанавливаю в "Истину" 2. Левым соединением пристегиваю обединяю ТЗ с РС. 3. Выполняю запрос. 4. Выгружают из Таблицы запроса записи у которых "Есть в РС" равно "Ложь". 5. Полученную таблицу пихаю в РС. |
|||
7
Doomer
02.01.13
✎
19:25
|
(5) Я и сделал один запрос.
|
|||
8
Miss1C
02.01.13
✎
19:27
|
Для Каждого СтрокаТЗ Из ТаблицаЗначений Цикл
НЗ = РегистрыСведений.МойРегистр.СоздатьНаборЗаписей(); НЗ.Отбор.Контрагент.Установить(СтрокаТЗ.Контрагент"); НЗ.Отбор.Организация.Установить(СтрокаТЗ.Организация); НЗ.Прочитать; Если НЗ.Количество() = 0 Тогда Записываю данные КонецЕсли; КонецЦикла; |
|||
9
Doomer
02.01.13
✎
19:28
|
(5) Да есть громадный РС в него нужно дозаписывать данные.
|
|||
10
Miss1C
02.01.13
✎
19:29
|
(9) Отбор делай, будит тебе счастье
|
|||
11
zippygrill
02.01.13
✎
19:31
|
Записываю данные(), ошибка при выпонении. Процедура или функция с таким именем не найдена :):)
|
|||
12
Miss1C
02.01.13
✎
19:32
|
(11) ))
|
|||
14
Doomer
02.01.13
✎
19:33
|
(10) По моему не самое правильное решение накладывать отборы в РС и читать данные в цикле.
|
|||
15
Miss1C
02.01.13
✎
19:34
|
(14)Почему?
|
|||
16
Miss1C
02.01.13
✎
19:35
|
(14) По скорости лучше не сделаешь
|
|||
17
Doomer
02.01.13
✎
19:40
|
Я слабо представляю как 1С взаимодействует на уровне таблиц с СУБД, но по моему на каждой итерации вашего цикла будет производится выборка данных из БД и формироваться результирующая таблица, которая будет передаваться на клиенту. Если у меня в ТЗ 10000 строк, то мы получим 10000 обращений к БД которые она должна будет отработать. Не уверен, что это оптимально.
|
|||
18
Miss1C
02.01.13
✎
19:42
|
(17) Ну тогда выберите запросом эти 10000 строк получите ТЗ и сравнивайте со своей методом НайтиСтроки
|
|||
19
zippygrill
02.01.13
✎
19:47
|
Можно немножко уменьшить размер тз путем откидывании уже сушествуюших записей в РС, и потом просто в цикле по тз добавить записи.
|
|||
20
zippygrill
02.01.13
✎
19:49
|
Ну или как там мисс говорит
|
|||
21
Doomer
02.01.13
✎
20:10
|
Вот такой запрос накидал:
ВЫБРАТЬ | ЗапросКТЗ.Работы |ПОМЕСТИТЬ ТаблицаРабот |ИЗ | ТаблицаРабот КАК ЗапросКТЗ | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.УРВ_СостояниеРабот.СрезПервых КАК УРВ_СостояниеРаботСрезПервых | ПО ЗапросКТЗ.Работы = УРВ_СостояниеРаботСрезПервых.Работа |ГДЕ | (НЕ УРВ_СостояниеРаботСрезПервых.Работа = NULL) |
|||
22
XLife
02.01.13
✎
20:12
|
все не читал... про запрос уже было?
|
|||
23
Лефмихалыч
02.01.13
✎
21:27
|
(21) любое сравнение с NULL в запросе всегда возвращает ложь. Именно по этой причине были изобретены ЕСТЬNULL() и есть NULL.
Учи матчасть |
|||
24
ДенисЧ
02.01.13
✎
21:29
|
(21) "УРВ_СостояниеРаботСрезПервых.Работа = NULL"
мдя.... расстрелять. На 15 лет. Без права переписки. |
|||
25
Doomer
02.01.13
✎
21:29
|
(24) Да накосячил. Ну я без проверки писал. Только в конфигураторе накидал.
|
|||
26
Doomer
02.01.13
✎
21:32
|
+25 Поторопился что сказать.
|
|||
27
milan
02.01.13
✎
22:20
|
Зачем тебе срез? Временную таблицу левым соединением с таблицеей регистра по периоду и всем измерениям выбирай где таблица регистра есть null - вот готовая таблица для записи в регистр
|
|||
28
ILM
гуру
02.01.13
✎
22:35
|
(0) - (27) Не кошерно это...
Нужно по книжному: РегистрСведенийНаборЗаписей.<Имя регистра сведений> (InformationRegisterRecordSet.<Имя регистра сведений>) Записать (Write) Синтаксис: Записать(<Замещать>) Параметры: <Замещать> (необязательный) Тип: Булево. Определяет режим замещения существующей записи в соответствии с текущими установками отбора. Истина - перед записью существующие записи будут удалены. Ложь - записи будут дописаны к уже существующим в информационной базе записям Значение по умолчанию: Истина Описание: Записывает набор записей в базу данных. В зависимости от переданного параметра, может быть выполнено добавление записей или их замещение. Доступность: Сервер, толстый клиент, внешнее соединение. Примечание: Для регистров сведений, подчиненных регистратору, при вызове с параметром <Замещать> равным Ложь после записи в информационную базу набор записей очищается (удаляются записи из набора). Пример: НаборКурсов.Записать(); |
|||
29
ILM
гуру
02.01.13
✎
22:35
|
Если СП пропили, могу подарить...
|
|||
30
Doomer
03.01.13
✎
12:21
|
(28) Я может туплю, но в вашем случае будет производиться повторная запись всей таблицы.
|
|||
31
milan
03.01.13
✎
12:26
|
(28) клюшкистайл?
|
|||
32
ILM
гуру
03.01.13
✎
13:28
|
(30) (31) С какого бодуна?
В (0) вопрос: "как дописать?", в (28) ответ. Про отборы и т.д. вопросов не было... |
|||
33
sapphire
03.01.13
✎
13:32
|
(32) Если не указывать отбор по измерениям.
|
|||
34
ILM
гуру
03.01.13
✎
13:40
|
Если не указывать отбор и поставить строку
НЗ_РС.Записать(Ложь); то набор записей допишется в таблицу. Причем скорость записи будет зависеть от кол-ва измерений и кол-ва строк в наборе записей. |
|||
35
rozer76
03.01.13
✎
20:11
|
34)сэр, вы практикуете или просто знаток СП? При параметре="ложь" необходимо позаботиться о том, чтобы значения измерений добавляемых записей были уникальны для существующих записей в РС, иначе запись выполнена не будет и не важно есть отбор или нет. Т.е. сначала полюбому читать. В Вашем случае "прокатит" только разве что если обернуть в "Попытка..."
|
|||
36
ILM
гуру
03.01.13
✎
22:52
|
А я и читаю, это ТС не читает ))
|
|||
37
hhhh
03.01.13
✎
23:15
|
(35) регистр периодический. Поэтому значения измерений не должны быть так уж и уникальны.
|
|||
38
rozer76
03.01.13
✎
23:39
|
(37)дада, еще одно измерение РС но сути не меняет. Наверно оптимальнее делать запросом и в отсортированной выборке писать в пустой РС частичными наборами записей. В таком случае и уникальность будет при "Записать(ложь)" и не так тормознуто как в (8).
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |