Помогите составить запрос

1. user748795 18.05.21 15:50 Сейчас в теме
Всем привет! Помогите новичку составить запрос. В регистр сведений пишутся измерение Наименование и Ресурс Цена с типами строка и число соответственно. Из внешнего источника данных приходит таблица значений с теми же колонками Наименование и Цена. Нужно из регистра получить наименования у которых цена отличается от цены в ТЗ то есть нужно понять для каких элементов в ТЗ цена изменилась и ее надо обновлять в регистре. Извините, если не корректно составлен вопрос, я могу уточнить если надо.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. nomad_irk 76 18.05.21 15:54 Сейчас в теме
(1) и в чем именно сложность? какой участок текста запроса не получается?
6. user748795 18.05.21 15:59 Сейчас в теме
(2) Спам принцип нужен был.
7. nomad_irk 76 18.05.21 16:02 Сейчас в теме
(6)
1. Получить ТЗ из внешнего источника.
2. Получить Текущие данные ИБ
3. Соединением таблиц из п.1 и п.2 получить те записи, которые нужно обновить в ИБ
4. Обновить записи в ИБ по результату из п.3.
4. M_A_D 184 18.05.21 15:57 Сейчас в теме
(1)
Ну так.
На сколько понимаю Наименование = Номенклатура.Наименование.
Если это так, просто вытягивайте Номенклатура наименование из ТЗ, прикручивайте левым соедиенением к Регистру, получите список, отбирайте только строки с различиями, выгружайте в ТЗ, и в цикле перезаписывайте РС нужной информацией...
5. user748795 18.05.21 15:58 Сейчас в теме
(4) Вот! Вы написали то, что меня интересовало. Получается я добавляю ТЗ как виртуальную таблицу в запрос и делю с ней левое соединение? Спасибо, буду пробовать и отпишусь
8. ZergKRSK 129 19.05.21 03:40 Сейчас в теме
(5) на счет Левого соединения не уверен. Что делать если в ТЗ приехало наименование и цена которых просто ещё нет в регистре? Их надо записать в регистр? Если да то Левое соединение не прокатит.
10. M_A_D 184 19.05.21 07:56 Сейчас в теме
(8)
Хм... может я заблуждаюсь, но)))
Если к ТЗ ЛЕВЫМ соединением прикручивать регистр, и в регистре будет NULL по этому наименованию(нет записи), то, на сколько я знаю, мы получим запись типа:

Наименование | Цена | NULL

а в этом случае мы видим разницу, и можем сделать запись в регистре, разве нет?

Проблема будет только в том случае, если в ТЗ записи нет, а в регистре есть, тогда, если нужно обнулить цены, то левое соединение не подходит.

Тут скорее вопрос только в том, куда и что прикрутит ТС)))
11. ZergKRSK 129 19.05.21 09:27 Сейчас в теме
(10) я прочитал сообщение как "берем регистр и к нему левым соединением ТЗ". Если брать ТЗ и к нему левым Регистр то всё ок.
12. M_A_D 184 19.05.21 09:35 Сейчас в теме
(11)
Да, не зря говорят - программисты ленивые люди))
Я просто не стал все отшибки предусматривать описал лишь общую логику))))
3. ilnur75 18.05.21 15:55 Сейчас в теме
получите данные регистра у которых наименование в параметре наименование в ТЗ. и сравните их цены.
9. sinichenko_alex 179 19.05.21 04:01 Сейчас в теме
Сделайте как-то так:


ВЫБРАТЬ
	ВнешняяТаблица.Наименование КАК Наименование,
	ВнешняяТаблица.Цена
ПОМЕСТИТЬ ВнешняяТаблица
ИЗ
	&ВнешняяТаблица КАК ВнешняяТаблица

ИНДЕКСИРОВАТЬ ПО
	Наименование
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	РегистрЦен.Наименование,
	РегистрЦен.Цена
ПОМЕСТИТЬ РегистрСЦенами
ИЗ
	РегистрСведений.РегистрЦен КАК РегистрЦен
ГДЕ
	РегистрЦен.Наименование В
			(ВЫБРАТЬ
				ВнешняяТаблица.Наименование
			ИЗ
				ВнешняяТаблица)
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВнешняяТаблица.Наименование КАК Наименование
ПОМЕСТИТЬ ОдинаковыеЦены
ИЗ
	ВнешняяТаблица КАК ВнешняяТаблица
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСЦенами КАК РегистрСЦенами
		ПО ВнешняяТаблица.Наименование = РегистрСЦенами.Наименование
			И ВнешняяТаблица.Цена = РегистрСЦенами.Цена

ИНДЕКСИРОВАТЬ ПО
	Наименование
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	РегистрСЦенами.Наименование
ИЗ
	РегистрСЦенами КАК РегистрСЦенами
ГДЕ
	НЕ РегистрСЦенами.Наименование В
				(ВЫБРАТЬ
					ОдинаковыеЦены.Наименование
				ИЗ
					ОдинаковыеЦены)

Показать
user748795; +1 Ответить
13. user748795 19.05.21 17:19 Сейчас в теме
(9) Спасибо большое, это прям то что нужно! Немного подправил под свои задачи, получилось

Запрос.Текст = "ВЫБРАТЬ
               |	ВнешняяТаблица.Наименование КАК Наименование,
               |	ВнешняяТаблица.Цена КАК Цена,
               |	ВнешняяТаблица.ТипЦены КАК ТипЦены
               |ПОМЕСТИТЬ ВнешняяТаблица
               |ИЗ
               |	&ВнешняяТаблица КАК ВнешняяТаблица
               |
               |ИНДЕКСИРОВАТЬ ПО
               |	Наименование
               |;
               |
               |////////////////////////////////////////////////////////////­////////////////////
               |ВЫБРАТЬ
               |	ЦеныНоменклатуры.Наименование КАК Наименование,
               |	ЦеныНоменклатуры.Цена КАК Цена,
               |	ЦеныНоменклатуры.ТипЦены КАК ТипЦены
               |ПОМЕСТИТЬ ЦеныНоменклатуры
               |ИЗ
               |	РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
               |ГДЕ
               |	ЦеныНоменклатуры.Наименование В
               |			(ВЫБРАТЬ
               |				ВнешняяТаблица.Наименование
               |			ИЗ
               |				ВнешняяТаблица)
               |;
               |
               |////////////////////////////////////////////////////////////­////////////////////
               |ВЫБРАТЬ
               |	ВнешняяТаблица.Наименование КАК Наименование
               |ПОМЕСТИТЬ ОдинаковыеЦены
               |ИЗ
               |	ВнешняяТаблица КАК ВнешняяТаблица
               |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЦеныНоменклатуры КАК ЦеныНоменклатуры
               |		ПО ВнешняяТаблица.Наименование = ЦеныНоменклатуры.Наименование
               |			И ВнешняяТаблица.Цена <= ЦеныНоменклатуры.Цена
               |			И ВнешняяТаблица.ТипЦены = ЦеныНоменклатуры.ТипЦены
               |
               |ИНДЕКСИРОВАТЬ ПО
               |	Наименование
               |;
               |
               |////////////////////////////////////////////////////////////­////////////////////
               |ВЫБРАТЬ
               |	ВнешняяТаблица.Наименование КАК Наименование,
               |	ВнешняяТаблица.Цена КАК Цена,
               |	ВнешняяТаблица.ТипЦены КАК ТипЦены
               |ИЗ
               |	ВнешняяТаблица КАК ВнешняяТаблица
               |ГДЕ
               |	НЕ ВнешняяТаблица.Наименование В
               |				(ВЫБРАТЬ
               |					ОдинаковыеЦены.Наименование
               |				ИЗ
               |					ОдинаковыеЦены)"; 
Показать


При первой загрузке всё работает. Все данные записываются в регистр. Далее начинаю тестировать: изменяю во внешней таблице цену одного элемента на рубль и запускаю обновление цен, по логике у нас результатом запроса должна быть одна строка т.е. при выгрузке получаться ТЗ из одной строки с этой самой измененной ценой. Но запрос пустой, строк 0. Не подскажите в чем может быть дело?

p/s по условию если новая цена ниже то она считается прежней и не должна изменятся. Цену меняю разумеется в большую сторону.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот