Вход | Регистрация



Периодический независимый РС. сравнение полей

Периодический независимый РС. сравнение полей
Я
   NordMad
 
21.08.18 - 16:42
В общем то нужно проверять перед записью МенеджерЗаписи на наличие аналогичной по всем измерениям записи в регистре, но с другим периодом. короче не записывать запись если уже есть такая же запись, но с другим периодом. периодичность - день. можно ли как то сделать без запроса с условием где будут все поля перечислены кроме периода?..
 
 
   saaken
 
1 - 21.08.18 - 16:45
какое-то патологическое неприятие запросов по темам прослеживается
   Михаил Козлов
 
2 - 21.08.18 - 16:47
А чем запрос плох?
Можно прочитать набор записей с нужными отборами и посмотреть в нем.
Выходит, что период Вам не нужен, тогда зачем периодичность в регистре?
   NordMad
 
3 - 21.08.18 - 16:47
(1) громоздко. может есть способ компактнее
   NordMad
 
4 - 21.08.18 - 16:48
(2) а если там 20 измерений. это будет условие на 20 сравнений по каждому. нужен, просто не нужно записывать каждый день одно и то же если остальные поля не изменны могут быть 20-30 дней.. а могут по каким то наборам каждый день меняться. я вот о чем
   NordMad
 
5 - 21.08.18 - 16:50
(2) хотел использовать
            ПроверкаЗапись.Прочитать();
            Если ПроверкаЗапись.Выбран() тогда
                продолжить;
            КонецЕсли;
это было бы компактно, но период так же ключевое поле, и такой вариант в моем случае не проходит.
   Вафель
 
6 - 21.08.18 - 16:55
ты просто еще не видел громоздкого кода
   Numerus Mikhail
 
7 - 21.08.18 - 16:57
(3) напиши запрос в одну строку
   NordMad
 
8 - 21.08.18 - 16:58
(6) в общем я правильно понимаю что это самый оптимальный вариант, делать запрос с условием по всем полям регистра кроме периода?
   unregistered
 
9 - 21.08.18 - 16:59
Альтернативы только две - запросом или методом ПолучитьПоследнее().
С точки зрения платформы разницы почти никакой т.к. метод будет точно так же делать запрос к БД. С точки зрения изящности кода, то ИМХО, запрос - понятнее и правильнее.
   Numerus Mikhail
 
10 - 21.08.18 - 16:59
(8) в (2) самый удобный и простой способ
 
 Рекламное место пустует
   NordMad
 
11 - 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
   unregistered
 
12 - 21.08.18 - 17:08
МетаданныеTEL_Transactions = Метаданные.РегистрыСведений.TEL_Transactions;
 Отбор = Новый Структура();
 Для Каждого Измерение Из МетаданныеTEL_Transactions.Измерения Цикл
   Отбор.Вставить(Измерение.Имя);
 КонецЦикла;
 ЗаполнитьЗначенияСвойств(Отбор, МенеджерЗаписи);
 СуществующиеДанные = РегистрыСведений.TEL_Transactions.ПоулчитьПоследнее(НужнаяДата, Отбор);
 Если ЗначениеЗаполнено(СуществующиеДанные.КакойНибудьИзРеквизитов КоторыйОбязательноДолженБытьНеПустымЕслиЗаписьСуществуетВБазе) Тогда
   Сообщить("Такая запись есть");
 КонецЕсли;
   Михаил Козлов
 
13 - 21.08.18 - 17:08
(4) Виноват, ступил насчет периодичности.
   unregistered
 
14 - 21.08.18 - 17:13
*(12) Поправка: "СуществующиеДанные.КакойНибудьИзРеквизитов КоторыйОбязательноДолженБытьНеПустымЕслиЗаписьСуществуетВБазе" читать как "СуществующиеДанные.КакойНибудьИзРесурсовКоторыйОбязательноДолженБытьНеПустымЕслиЗаписьСуществуетВБазе"
   NordMad
 
15 - 21.08.18 - 17:16
(14) спасибо. тоже конечно не пара строк типа Прочитать() и Выбран(). но определенно красивее такого запроса как я привел
   unregistered
 
16 - 21.08.18 - 17:18
А вообще я чего-то не понял саму постановку задачи...

Предположим есть запись от 1 января с определенными значениями ресурсов. И есть запись от 1 марта с такими же измерениями, но другими значениями ресурсов.
Мы пытаемся 1 августа загрузить еще одну запись всё с тем же набором измерений, но с третьим значением ресурсов.

Что должно произойти?
   Малыш Джон
 
17 - 21.08.18 - 17:20
(3) (15) то есть я правильно понимаю: приоритет - не скорость выполнения, а уложиться в минимальное количество строк?
   NordMad
 
18 - 21.08.18 - 17:20
(17) а запрос будет быстрее?
   NordMad
 
19 - 21.08.18 - 17:21
(16) там специфика в том что ресурс один, и он однозначно не поменяется сам по себе без изменениям измерений.
   NordMad
 
20 - 21.08.18 - 17:22
(16) а чисто теориетически да, будет жопа.. потеря данных
   Малыш Джон
 
21 - 21.08.18 - 17:25
(18) запрос прочитает один раз, а в (12) сначала ПолучитьПоследнее() прочитает регистр один раз, а потом ещё и менеджер записи перед записью тоже регистр разок прочитает.
Так что да, запрос + набор записей будет быстрее.
   Малыш Джон
 
22 - 21.08.18 - 17:27
+(21) даже без запроса.
чем не нравится завести набор записей, установить все отборы, по которым нужно проверить, прочитать, далее - если есть в наборе запись - работаешь с ними, нет - доавляешь свежую
   NordMad
 
23 - 21.08.18 - 17:30
(22) тем что если я не вобью туда период, он вернет мне пустой набор. я бы так и сделал изначально
   vde69
 
24 - 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)
   NordMad
 
28 - 21.08.18 - 17:41
(27)
            ЗаполнитьЗначенияСвойств(записьПроверка,НаборЗаписей);
            записьПроверка.Прочитать();
            если записьПроверка.Выбран() тогда
                продолжить;
            КонецЕсли;
            НаборЗаписей.Период = ТекущаяДата();
            попытка
                НаборЗаписей.Записать(ложь);
            исключение
                Сообщить(ОписаниеОшибки());
            КонецПопытки;

такая конструкция не работает. или ты не это имеешь ввиду?
   Sasha_H
 
29 - 21.08.18 - 17:45
(0) в упор не понимаю на кой Х регистр периодический и котролить запись по периоду!!!!
   Малыш Джон
 
30 - 21.08.18 - 17:48
(28) ёопамать...

НаборЗаписей = РегистрыСведений.ТвойРегистр.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Измерение1.Установить(Значение1);
НаборЗаписей.Отбор.Измерение2.Установить(Значение2);
// и т.д., можно для краткости как в (12) в цикле из какой-нибудь структуры отборы ставить

//...
НаборЗаписей.Прочитать()
Если НаборЗаписей.Количество()>0 Тогда
  НужнаяЗапись = НаборЗаписей[0];
  //ну или опять-таки в цикле перебирать, если их не одна

Иначе
  НужнаяЗапись = НаборЗаписей.Добавить();
  НужнаяЗапись.Измерение1 = Значение1;
  //и т.д.

КонецЕсли;
НаборЗаписей.Записать();
   NordMad
 
31 - 21.08.18 - 17:48
(29) ну данные прилетают ежедневно, в подавляющем большинстве они не меняются (скажем 80% позиций нет смысла писать) но какие то позы могут меняться каждый день. вот собственно хотел делать проверку, что писать, а что нет необходимости
   Бухгалтер76
 
32 - 21.08.18 - 17:49
(29) элементарно, чтобы лишние записи не плодить с одинаковыми значениями! ) здесь килобайт, тут килобайт, смотришь база не 100 гигов, а 99 к концу года
   Малыш Джон
 
33 - 21.08.18 - 17:50
(32) "Вот на эти 2 рубля они и живут" )))
 
 
   NordMad
 
34 - 21.08.18 - 17:50
(30) а чем тебе 
ЗаполнитьЗначенияСвойств(записьПроверка,НаборЗаписей);
не подходит то? вместо этого перебора то?
   unregistered
 
35 - 21.08.18 - 17:51
(19) > ресурс один, и он однозначно не поменяется сам по себе без изменениям измерений.

Тогда почему это ресурс, а не измерение?....
Какая-то мутная структура у вашего регистра и не совсем ясна суть периодичности.
   Малыш Джон
 
36 - 21.08.18 - 17:54
(34) если НаборЗаписей - это набор записей, то боюсь, что вот на это:

НаборЗаписей.Период = ТекущаяДата();

оно немножко поругается
   NordMad
 
37 - 21.08.18 - 17:54
(35) ну а куда ещё цену то пихать? в ресурс.. зачем она в измерении то нужна. да почему муть то? в один период могут по всем записям изменения пройтись скажем за неделю, и это всё надо фиксировать по дням, в другой период, скажем 2 неделе изменения коснутся только 20% записей. зачем мне остальные 80% каждый день дублировать? какой в этом стратегический смысл
   NordMad
 
38 - 21.08.18 - 17:55
(36) почему это? регистр то независимый. ставлю какой хочу период. зачем ругаться.. всё пишет как надо
   Малыш Джон
 
39 - 21.08.18 - 17:56
(38) у набора  записи нет периода, туда могут входит записи с разными периодами
   NordMad
 
40 - 21.08.18 - 17:57
(39) блин.. сорри... это название.. по факту это менеджер записи, просто этот кусок кода я не предоставил здесь, отсюда и путанница вышла.
   Малыш Джон
 
41 - 21.08.18 - 17:59
(38) но в принципе, я тебя понял, (39) - непринципиально, можно и записям набора период устанавливать

просто вместо НаборЗаписей.Прочитать();

ты делаешь ЗаполнитьЗначенияСвойств(МенеджерЗаписи, ЗаписьНабораЗаписей);
МенеджерЗАписи.Проверить();
   Малыш Джон
 
42 - 21.08.18 - 17:59
(40) я так и понял)
   NordMad
 
43 - 21.08.18 - 18:01
(41) да и вот в этом случае выдает пустую запись, а вот если перед прочитать указать конкретный период, то всё ок. но это же не то. яж не знаю какой период проверять. вот если бы он давал бы первую попавшуюся запись с каким то периодом, тогда подошел бы вариант и я бы и тему это не завел
   NordMad
 
44 - 21.08.18 - 18:02
в общем всем спасибо за содействие "странная задача" решена:)
   Sasha_H
 
45 - 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) Присоединяюсь: запросом получить значения измерений и ресурсов, которые нужно записать.
   dem0sphen
 
49 - 21.08.18 - 22:00
(0) ОтборСтруктура = Новый Структура("Измерение1, Измерение2", ЗначениеИзмерения1, ЗначениеИзмерения2);
ЗначенияРесурсов = Регистрысведений.КурсыВалют.ПолучитьПоследнее(ТекущаяДата(), ОтборСтруктура);
Если ЗначениеЗаполнено(ЗначенияРесурсов["ТвойРесурс"]) Тогда
    // отбой...

КонецЕсли;
 
 Рекламное место пустует


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует