|
Периодический независимый РС. сравнение полей | ☑ | ||
---|---|---|---|---|
0
NordMad
21.08.18
✎
16:42
|
В общем то нужно проверять перед записью МенеджерЗаписи на наличие аналогичной по всем измерениям записи в регистре, но с другим периодом. короче не записывать запись если уже есть такая же запись, но с другим периодом. периодичность - день. можно ли как то сделать без запроса с условием где будут все поля перечислены кроме периода?..
|
|||
1
saaken
21.08.18
✎
16:45
|
какое-то патологическое неприятие запросов по темам прослеживается
|
|||
2
Михаил Козлов
21.08.18
✎
16:47
|
А чем запрос плох?
Можно прочитать набор записей с нужными отборами и посмотреть в нем. Выходит, что период Вам не нужен, тогда зачем периодичность в регистре? |
|||
3
NordMad
21.08.18
✎
16:47
|
(1) громоздко. может есть способ компактнее
|
|||
4
NordMad
21.08.18
✎
16:48
|
(2) а если там 20 измерений. это будет условие на 20 сравнений по каждому. нужен, просто не нужно записывать каждый день одно и то же если остальные поля не изменны могут быть 20-30 дней.. а могут по каким то наборам каждый день меняться. я вот о чем
|
|||
5
NordMad
21.08.18
✎
16:50
|
(2) хотел использовать
ПроверкаЗапись.Прочитать(); Если ПроверкаЗапись.Выбран() тогда продолжить; КонецЕсли; это было бы компактно, но период так же ключевое поле, и такой вариант в моем случае не проходит. |
|||
6
Вафель
21.08.18
✎
16:55
|
ты просто еще не видел громоздкого кода
|
|||
7
Numerus Mikhail
21.08.18
✎
16:57
|
(3) напиши запрос в одну строку
|
|||
8
NordMad
21.08.18
✎
16:58
|
(6) в общем я правильно понимаю что это самый оптимальный вариант, делать запрос с условием по всем полям регистра кроме периода?
|
|||
9
unregistered
21.08.18
✎
16:59
|
Альтернативы только две - запросом или методом ПолучитьПоследнее().
С точки зрения платформы разницы почти никакой т.к. метод будет точно так же делать запрос к БД. С точки зрения изящности кода, то ИМХО, запрос - понятнее и правильнее. |
|||
10
Numerus Mikhail
21.08.18
✎
16:59
|
(8) в (2) самый удобный и простой способ
|
|||
11
NordMad
21.08.18
✎
17:00
|
(10) примерно так получается:
ВЫБРАТЬ | TEL_Transactions.Период КАК Период, | TEL_Transactions.Customer КАК Customer, | TEL_Transactions.Supplier КАК Supplier, | TEL_Transactions.VersionId КАК VersionId, | TEL_Transactions.TransferCurrency КАК TransferCurrency, | TEL_Transactions.EXW КАК EXW, | TEL_Transactions.IsObsolete КАК IsObsolete, | TEL_Transactions.TransactionStatus КАК TransactionStatus, | TEL_Transactions.ArchivingDate КАК ArchivingDate, | TEL_Transactions.TransferPrice КАК TransferPrice |ИЗ | РегистрСведений.TEL_Transactions КАК TEL_Transactions |ГДЕ | TEL_Transactions.Customer = &Customer | И TEL_Transactions.Supplier = &Supplier | И TEL_Transactions.VersionId = &VersionId | И TEL_Transactions.TransferCurrency = &TransferCurrency | И TEL_Transactions.EXW = &EXW | И TEL_Transactions.IsObsolete = &IsObsolete | И TEL_Transactions.TransactionStatus = &TransactionStatus | И TEL_Transactions.ArchivingDate = &ArchivingDate |
|||
12
unregistered
21.08.18
✎
17:08
|
МетаданныеTEL_Transactions = Метаданные.РегистрыСведений.TEL_Transactions;
Отбор = Новый Структура(); Для Каждого Измерение Из МетаданныеTEL_Transactions.Измерения Цикл Отбор.Вставить(Измерение.Имя); КонецЦикла; ЗаполнитьЗначенияСвойств(Отбор, МенеджерЗаписи); СуществующиеДанные = РегистрыСведений.TEL_Transactions.ПоулчитьПоследнее(НужнаяДата, Отбор); Если ЗначениеЗаполнено(СуществующиеДанные.КакойНибудьИзРеквизитов КоторыйОбязательноДолженБытьНеПустымЕслиЗаписьСуществуетВБазе) Тогда Сообщить("Такая запись есть"); КонецЕсли; |
|||
13
Михаил Козлов
21.08.18
✎
17:08
|
(4) Виноват, ступил насчет периодичности.
|
|||
14
unregistered
21.08.18
✎
17:13
|
*(12) Поправка: "СуществующиеДанные.КакойНибудьИзРеквизитов КоторыйОбязательноДолженБытьНеПустымЕслиЗаписьСуществуетВБазе" читать как "СуществующиеДанные.КакойНибудьИзРесурсовКоторыйОбязательноДолженБытьНеПустымЕслиЗаписьСуществуетВБазе"
|
|||
15
NordMad
21.08.18
✎
17:16
|
(14) спасибо. тоже конечно не пара строк типа Прочитать() и Выбран(). но определенно красивее такого запроса как я привел
|
|||
16
unregistered
21.08.18
✎
17:18
|
А вообще я чего-то не понял саму постановку задачи...
Предположим есть запись от 1 января с определенными значениями ресурсов. И есть запись от 1 марта с такими же измерениями, но другими значениями ресурсов. Мы пытаемся 1 августа загрузить еще одну запись всё с тем же набором измерений, но с третьим значением ресурсов. Что должно произойти? |
|||
17
Малыш Джон
21.08.18
✎
17:20
|
(3) (15) то есть я правильно понимаю: приоритет - не скорость выполнения, а уложиться в минимальное количество строк?
|
|||
18
NordMad
21.08.18
✎
17:20
|
(17) а запрос будет быстрее?
|
|||
19
NordMad
21.08.18
✎
17:21
|
(16) там специфика в том что ресурс один, и он однозначно не поменяется сам по себе без изменениям измерений.
|
|||
20
NordMad
21.08.18
✎
17:22
|
(16) а чисто теориетически да, будет жопа.. потеря данных
|
|||
21
Малыш Джон
21.08.18
✎
17:25
|
(18) запрос прочитает один раз, а в (12) сначала ПолучитьПоследнее() прочитает регистр один раз, а потом ещё и менеджер записи перед записью тоже регистр разок прочитает.
Так что да, запрос + набор записей будет быстрее. |
|||
22
Малыш Джон
21.08.18
✎
17:27
|
+(21) даже без запроса.
чем не нравится завести набор записей, установить все отборы, по которым нужно проверить, прочитать, далее - если есть в наборе запись - работаешь с ними, нет - доавляешь свежую |
|||
23
NordMad
21.08.18
✎
17:30
|
(22) тем что если я не вобью туда период, он вернет мне пустой набор. я бы так и сделал изначально
|
|||
24
vde69
21.08.18
✎
17:35
|
(23) так тебе не нужен период в измерении, а нужна дата в реквизите?
|
|||
25
Малыш Джон
21.08.18
✎
17:36
|
(23) как это "вернет пустой набор"? если ты вобъешь все нужные измерения, то тебе вернуться все записи у которых значения измерений подходят под отбор. Не укажешь период - значит вернутся все нужные записи со всеми периодами.
|
|||
26
Малыш Джон
21.08.18
✎
17:38
|
+(25) "Не укажешь период - значит вернутся все нужные записи со всеми периодами." - т.е. если не установишь отбор по периоду, то в набор попадут все записи подходящие под отбор, независимо, какой у записи будет период
|
|||
27
Малыш Джон
21.08.18
✎
17:39
|
+(26) собственно, это будет идентично запросу из (11)
|
|||
28
NordMad
21.08.18
✎
17:41
|
(27)
ЗаполнитьЗначенияСвойств(записьПроверка,НаборЗаписей); записьПроверка.Прочитать(); если записьПроверка.Выбран() тогда продолжить; КонецЕсли; НаборЗаписей.Период = ТекущаяДата(); попытка НаборЗаписей.Записать(ложь); исключение Сообщить(ОписаниеОшибки()); КонецПопытки; такая конструкция не работает. или ты не это имеешь ввиду? |
|||
29
Sasha_H
21.08.18
✎
17:45
|
(0) в упор не понимаю на кой Х регистр периодический и котролить запись по периоду!!!!
|
|||
30
Малыш Джон
21.08.18
✎
17:48
|
(28) ёопамать...
НаборЗаписей = РегистрыСведений.ТвойРегистр.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Измерение1.Установить(Значение1); НаборЗаписей.Отбор.Измерение2.Установить(Значение2); // и т.д., можно для краткости как в (12) в цикле из какой-нибудь структуры отборы ставить //... НаборЗаписей.Прочитать() Если НаборЗаписей.Количество()>0 Тогда НужнаяЗапись = НаборЗаписей[0]; //ну или опять-таки в цикле перебирать, если их не одна Иначе НужнаяЗапись = НаборЗаписей.Добавить(); НужнаяЗапись.Измерение1 = Значение1; //и т.д. КонецЕсли; НаборЗаписей.Записать(); |
|||
31
NordMad
21.08.18
✎
17:48
|
(29) ну данные прилетают ежедневно, в подавляющем большинстве они не меняются (скажем 80% позиций нет смысла писать) но какие то позы могут меняться каждый день. вот собственно хотел делать проверку, что писать, а что нет необходимости
|
|||
32
Бухгалтер76
21.08.18
✎
17:49
|
(29) элементарно, чтобы лишние записи не плодить с одинаковыми значениями! ) здесь килобайт, тут килобайт, смотришь база не 100 гигов, а 99 к концу года
|
|||
33
Малыш Джон
21.08.18
✎
17:50
|
(32) "Вот на эти 2 рубля они и живут" )))
|
|||
34
NordMad
21.08.18
✎
17:50
|
(30) а чем тебе
ЗаполнитьЗначенияСвойств(записьПроверка,НаборЗаписей); не подходит то? вместо этого перебора то? |
|||
35
unregistered
21.08.18
✎
17:51
|
(19) > ресурс один, и он однозначно не поменяется сам по себе без изменениям измерений.
Тогда почему это ресурс, а не измерение?.... Какая-то мутная структура у вашего регистра и не совсем ясна суть периодичности. |
|||
36
Малыш Джон
21.08.18
✎
17:54
|
(34) если НаборЗаписей - это набор записей, то боюсь, что вот на это:
НаборЗаписей.Период = ТекущаяДата(); оно немножко поругается |
|||
37
NordMad
21.08.18
✎
17:54
|
(35) ну а куда ещё цену то пихать? в ресурс.. зачем она в измерении то нужна. да почему муть то? в один период могут по всем записям изменения пройтись скажем за неделю, и это всё надо фиксировать по дням, в другой период, скажем 2 неделе изменения коснутся только 20% записей. зачем мне остальные 80% каждый день дублировать? какой в этом стратегический смысл
|
|||
38
NordMad
21.08.18
✎
17:55
|
(36) почему это? регистр то независимый. ставлю какой хочу период. зачем ругаться.. всё пишет как надо
|
|||
39
Малыш Джон
21.08.18
✎
17:56
|
(38) у набора записи нет периода, туда могут входит записи с разными периодами
|
|||
40
NordMad
21.08.18
✎
17:57
|
(39) блин.. сорри... это название.. по факту это менеджер записи, просто этот кусок кода я не предоставил здесь, отсюда и путанница вышла.
|
|||
41
Малыш Джон
21.08.18
✎
17:59
|
(38) но в принципе, я тебя понял, (39) - непринципиально, можно и записям набора период устанавливать
просто вместо НаборЗаписей.Прочитать(); ты делаешь ЗаполнитьЗначенияСвойств(МенеджерЗаписи, ЗаписьНабораЗаписей); МенеджерЗАписи.Проверить(); |
|||
42
Малыш Джон
21.08.18
✎
17:59
|
(40) я так и понял)
|
|||
43
NordMad
21.08.18
✎
18:01
|
(41) да и вот в этом случае выдает пустую запись, а вот если перед прочитать указать конкретный период, то всё ок. но это же не то. яж не знаю какой период проверять. вот если бы он давал бы первую попавшуюся запись с каким то периодом, тогда подошел бы вариант и я бы и тему это не завел
|
|||
44
NordMad
21.08.18
✎
18:02
|
в общем всем спасибо за содействие "странная задача" решена:)
|
|||
45
Sasha_H
21.08.18
✎
18:02
|
круто если оно еще в цикле
|
|||
46
Малыш Джон
21.08.18
✎
18:09
|
(43) потому что это менеджер записи, он работает так
набор записей - работает по-другому Плюс, судя по "продолжить;" из (28) ты это ещё и в цикле делаешь... Тогда тут точно: по _всему массиву данных_ делается запрос, который выдает таблицу тех записей, которые _реально_ нужно добавить(т.е. которых нет независимо от того какой у них период) и тогда _только_ по ним делается цикл |
|||
47
Малыш Джон
21.08.18
✎
18:09
|
(46) ах, черт, здесь подчеркивание не работает, да?
|
|||
48
Михаил Козлов
21.08.18
✎
21:27
|
(46) Присоединяюсь: запросом получить значения измерений и ресурсов, которые нужно записать.
|
|||
49
dem0sphen
21.08.18
✎
22:00
|
(0) ОтборСтруктура = Новый Структура("Измерение1, Измерение2", ЗначениеИзмерения1, ЗначениеИзмерения2);
ЗначенияРесурсов = Регистрысведений.КурсыВалют.ПолучитьПоследнее(ТекущаяДата(), ОтборСтруктура); Если ЗначениеЗаполнено(ЗначенияРесурсов["ТвойРесурс"]) Тогда // отбой... КонецЕсли; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |