|
v8: Соединение среза цен номенклатуры и цен документа | ☑ | ||
---|---|---|---|---|
0
Coldboy
24.07.14
✎
09:59
|
Здравствуйте. Проблема такова. Выбираю количество и цену с документа, где нет цены, хочу взять из регистра сведений цены номенклатуры. Но результат задваивается, на количество стрчоек в регистр сведений. Вот собственно запрос, что не так?
ВЫБРАТЬ РАЗЛИЧНЫЕ ИнвентаризацияТоваровНаСкладеТовары.Ссылка.Склад, ИнвентаризацияТоваровНаСкладеТовары.Номенклатура, ИнвентаризацияТоваровНаСкладеТовары.СчетУчета, ИнвентаризацияТоваровНаСкладеТовары.Номенклатура.Код КАК Код, ИнвентаризацияТоваровНаСкладеТовары.ЕдиницаИзмерения, ВЫБОР КОГДА ИнвентаризацияТоваровНаСкладеТовары.Количество - ИнвентаризацияТоваровНаСкладеТовары.КоличествоУчет > 0 ТОГДА ИнвентаризацияТоваровНаСкладеТовары.Количество - ИнвентаризацияТоваровНаСкладеТовары.КоличествоУчет ИНАЧЕ 0 КОНЕЦ КАК КоличествоИзлишек, ВЫБОР КОГДА ИнвентаризацияТоваровНаСкладеТовары.Количество - ИнвентаризацияТоваровНаСкладеТовары.КоличествоУчет < 0 ТОГДА ИнвентаризацияТоваровНаСкладеТовары.КоличествоУчет - ИнвентаризацияТоваровНаСкладеТовары.Количество ИНАЧЕ 0 КОНЕЦ КАК КоличествоНедостача, МЕСЯЦ(ИнвентаризацияТоваровНаСкладеТовары.Ссылка.Дата) КАК Месяц, ИнвентаризацияТоваровНаСкладеТовары.Ссылка.Дата, ВЫБОР КОГДА ИнвентаризацияТоваровНаСкладеТовары.Количество - ИнвентаризацияТоваровНаСкладеТовары.КоличествоУчет > 0 ТОГДА ВЫБОР КОГДА ИнвентаризацияТоваровНаСкладеТовары.Цена > 0 ТОГДА ИнвентаризацияТоваровНаСкладеТовары.Цена * (ИнвентаризацияТоваровНаСкладеТовары.Количество - ИнвентаризацияТоваровНаСкладеТовары.КоличествоУчет) ИНАЧЕ ЦеныНоменклатуры.Цена * (ИнвентаризацияТоваровНаСкладеТовары.Количество - ИнвентаризацияТоваровНаСкладеТовары.КоличествоУчет) КОНЕЦ ИНАЧЕ 0 КОНЕЦ КАК СуммаИзлишка, ВЫБОР КОГДА ИнвентаризацияТоваровНаСкладеТовары.Количество - ИнвентаризацияТоваровНаСкладеТовары.КоличествоУчет < 0 ТОГДА ВЫБОР КОГДА ИнвентаризацияТоваровНаСкладеТовары.Цена > 0 ТОГДА ИнвентаризацияТоваровНаСкладеТовары.Цена * (ИнвентаризацияТоваровНаСкладеТовары.КоличествоУчет - ИнвентаризацияТоваровНаСкладеТовары.Количество) ИНАЧЕ ЦеныНоменклатуры.Цена * (ИнвентаризацияТоваровНаСкладеТовары.КоличествоУчет - ИнвентаризацияТоваровНаСкладеТовары.Количество) КОНЕЦ ИНАЧЕ 0 КОНЕЦ КАК СуммаНедостачи ИЗ Документ.ИнвентаризацияТоваровНаСкладе.Товары КАК ИнвентаризацияТоваровНаСкладеТовары ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры ПО ИнвентаризацияТоваровНаСкладеТовары.Номенклатура = ЦеныНоменклатуры.Номенклатура И ИнвентаризацияТоваровНаСкладеТовары.Ссылка.Дата >= ЦеныНоменклатуры.Период ГДЕ ИнвентаризацияТоваровНаСкладеТовары.Ссылка.ПометкаУдаления = ЛОЖЬ И ИнвентаризацияТоваровНаСкладеТовары.Ссылка.Дата МЕЖДУ &НачДата И &КонДата И ЦеныНоменклатуры.ТипЦен = &ТипЦен |
|||
1
Cube
24.07.14
✎
10:02
|
(0) Используй срез последних для цен номенклатуры...
|
|||
2
Бешеная Нога
24.07.14
✎
10:02
|
1. Используй срез последних
2. В срезе последних ставь условие по типу цены |
|||
3
Бешеная Нога
24.07.14
✎
10:03
|
и по хорошему порядок такой:
1. получаешь таблицу товаров из документа 2. получаешь срез последних с условием по типу цены и условием Номенклатура В (Выбрать ТаблицаТоваров) 3. Соединить Таблицу товаров и таблицу цен |
|||
4
Coldboy
24.07.14
✎
10:20
|
(1) я бы рад, если бы знать как условие передать в запросе. делаю отчет в СКД, там выбираю цену из регпистра, если в документа она равна 0, а количество есть.
не знаю как все это увязать. |
|||
5
Cube
24.07.14
✎
10:24
|
(4) Мда...
Ну вот, давай на пальцах: Запрос к полной таблице цен: ВЫБРАТЬ ЦеныНоменклатуры.Номенклатура, ЦеныНоменклатуры.ТипЦен, ЦеныНоменклатуры.Цена ИЗ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры Запрос к срезу последних: ВЫБРАТЬ ЦеныНоменклатурыСрезПоследних.Номенклатура, ЦеныНоменклатурыСрезПоследних.ТипЦен, ЦеныНоменклатурыСрезПоследних.Цена ИЗ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ) КАК ЦеныНоменклатурыСрезПоследних Запрос к срезу последних с указанием даты среза и типа цен: ВЫБРАТЬ ЦеныНоменклатурыСрезПоследних.Номенклатура, ЦеныНоменклатурыСрезПоследних.ТипЦен, ЦеныНоменклатурыСрезПоследних.Цена ИЗ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних Дальше сам осилишь? |
|||
6
Coldboy
24.07.14
✎
10:39
|
(5) это я знаю не знаю как в запросе параметр &Период, &Номенклатура передать к временной таблице.
|
|||
7
Enders
24.07.14
✎
10:46
|
(6) Переведи, а то ничего не понятно
|
|||
8
Cube
24.07.14
✎
10:46
|
(6) Запрос.УстановитьПараметр("Период", ТекущаяДата());
|
|||
9
Coldboy
24.07.14
✎
11:04
|
(8) мне нужно на дату документа, а не текущую. и это в запросе.
|
|||
10
Cube
24.07.14
✎
11:07
|
||||
11
Coldboy
24.07.14
✎
11:10
|
http://kb.mista.ru/article.php?id=92 вот тут не берут сред последних.
|
|||
12
Coldboy
24.07.14
✎
11:13
|
и мне нужно только 1 цену а не каждый день брать вот.
|
|||
13
Cube
24.07.14
✎
11:15
|
(12) То есть, ты считаешь мой совет бессмысленным? :)
|
|||
14
Coldboy
24.07.14
✎
11:17
|
(13) ваш совет я считаю самым оптимальным решением, вирутальная таблицА, срез последних, я не знаю как передать параметры документа, такие как &Дата = Регистратор.Дата и &Номенклатура в запрос к срезу последних в 1 запросе.
|
|||
15
el-gamberro
24.07.14
✎
11:18
|
По логике надо взять цену на дату документа. А это уже более хитрый запрос.
1. Сформировать таблицу цен с интервалами (Начало действия цены, конец действия цены или &Конец) 2. Документ соединить с этой таблицей. |
|||
16
Coldboy
24.07.14
✎
11:20
|
(15) пример можно
|
|||
17
el-gamberro
24.07.14
✎
11:20
|
(14) Если исходите исключительно из последний цены, то нет смысла передавать дату документа. Даже документ от 1990 года вы соедините с последний ценой. Так что... соединять только по Номенклатура.
|
|||
18
hhhh
24.07.14
✎
11:21
|
(16) пример в (11)
|
|||
19
Cube
24.07.14
✎
11:21
|
(14) Так не получится. У тебя два варианта:
1. Связывать таблицу инвентаризаций с таблицей цен на каждую дату. 2. (предпочтительней) Связать таблицу инвентаризаций с полной таблицей цен, найти последнюю дату для каждой номенклатуры и связать с полной таблицей цен ещё раз, чтобы получить цену по рассчитанной дате. |
|||
20
Enders
24.07.14
✎
11:22
|
(14) Делай свой срез, в чём проблема?
Выбрать
очень примерный пример;) |
|||
21
Coldboy
24.07.14
✎
11:28
|
(18) либо я очень глуп, либо я что-то не знаю там везде передаю параметр &Дата в нужном мне варианте, а где его указываю в запросе я не увидел.
|
|||
22
el-gamberro
24.07.14
✎
11:29
|
(20)Хороший пример. Только конец улетит и будет глюк.
|
|||
23
Coldboy
24.07.14
✎
11:29
|
(19) мне нужна цена только на одну дату, на дату моего документа, зачем лишние данные?
|
|||
24
Enders
24.07.14
✎
11:32
|
(22) Какой конец, не очень понял?
В идеале, там ещё оптимизировать и оптимизировать, но для понятия алгоритма этого хватит) |
|||
25
el-gamberro
24.07.14
✎
11:35
|
(24) Например цена ставилась 01.01.14. документ от 24.07.14
В таблицу ВтДатыЦен это не попадет по условию "Вт.Дата<=Цены.Период" |
|||
26
Cube
24.07.14
✎
11:43
|
(23) Опиши задачу. Хватит уже запутывать всех. Давай изначально, что требуется сделать и где это будет использовано.
|
|||
27
Enders
24.07.14
✎
11:44
|
(25) Точно, я не правильно указал условия соединения)))
Там надо "Вт.Дата>=Цены.Период" и период не в минимум, а в максимум. |
|||
28
Coldboy
24.07.14
✎
11:45
|
(26) на дату документа, если есть количество, но нет суммы, взять цену закупки и получить сумму, либо просто брать цену, если есть сумма в документе.
|
|||
29
el-gamberro
24.07.14
✎
11:51
|
(27) верно :) тогда остается вопрос начала. Если товар продают, а цены еще нет :) Но это уже административный барьер, а не программистский :)
|
|||
30
Cube
24.07.14
✎
11:52
|
(28) Отличная постановка задачи. Чтоб клиенты тебе так объясняли...
http://risovach.ru/upload/2013/12/mem/klichko_37366386_orig_.png а сегодня в завтрашний день не все могут смотреть... Вернее смотреть могут не только лишь все, мало кто может это делать |
|||
31
Coldboy
24.07.14
✎
12:19
|
(30) еще раз.
Есть документ инвентаризация. С него я беру учетное количество, количество, и учетную сумму по какой-то номенклатурной позиции.. Если учетное количество >0 и Учетная сумма отлична от нуля, то все хорошо, я могу рассчитать цена, как учет.сумма/учет.количество. Но если вдруг оказалось, учетное количество есть, а суммы нет, мне нужно рассчиту эту сумму, путем выборки из регистра сведений актуальной цены закупки на дату документа инвентаризации, соответственно здесь у меня и возникла проблема, как вытащить эту актуальную цену срезом. В моем запросе в (0) есть вероятность, задвоения записей, из за того, что цен на текущую дату несколько. |
|||
32
el-gamberro
24.07.14
✎
12:23
|
Пример с таблицей интервалов для реальной конфы "Бух 3.0":
ВЫБРАТЬ ЦеныНоменклатуры.Период КАК Начало, ЦеныНоменклатуры.Номенклатура КАК Номенклатура, МИНИМУМ(ЕСТЬNULL(ЦеныНоменклатуры1.Период, ДАТАВРЕМЯ(2014, 7, 24))) КАК Конец, ЦеныНоменклатуры2.Цена ИЗ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры1 ПО ЦеныНоменклатуры.ТипЦен = ЦеныНоменклатуры1.ТипЦен И ЦеныНоменклатуры.Номенклатура = ЦеныНоменклатуры1.Номенклатура И ЦеныНоменклатуры.Период < ЦеныНоменклатуры1.Период ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры2 ПО ЦеныНоменклатуры.ТипЦен = ЦеныНоменклатуры2.ТипЦен И ЦеныНоменклатуры.Номенклатура = ЦеныНоменклатуры2.Номенклатура И ЦеныНоменклатуры.Период = ЦеныНоменклатуры2.Период ГДЕ ЦеныНоменклатуры.ТипЦен = &ТипЦен СГРУППИРОВАТЬ ПО ЦеныНоменклатуры.Период, ЦеныНоменклатуры.Номенклатура, ЦеныНоменклатуры2.Цена УПОРЯДОЧИТЬ ПО Номенклатура |
|||
33
Cube
24.07.14
✎
12:23
|
(31) Да мля, в твоем запросе из (0) ты вибираешь все документы инвентаризаций из диапазона дат. Сейчас ты лепишь про один документ.
Для чего это всё делается - одному ежику в тумане известно.... |
|||
34
el-gamberro
24.07.14
✎
12:28
|
Подправленный вариант в (20) тоже верный. Но я в этом случае не люблю ВТ по привычке. Такие вещи писал в MS SQL, а темп таблицу делать некомильфо. Лучше верно написать единый запрос.
|
|||
35
Coldboy
24.07.14
✎
12:39
|
(33) ну все это в разрере складов идет, какая разница, что 1 документ, что их несколько в разрезе складов же данные выводятся.
|
|||
36
Cube
24.07.14
✎
12:44
|
(35) Да, конечно, никакой. Удачи. Я пытался как мог...
|
|||
37
Enders
24.07.14
✎
12:53
|
(35) для вашей задачи уже предоставлено два варианта решения:
в (20)+ исправления в (27) и в(32). Вам надо их осмыслить и переписать под себя. Готовый код вам тут никто не напишет) |
|||
38
Coldboy
24.07.14
✎
13:06
|
(37) я поднимаю, в 32 не могу понять, куда документ засунуть.
|
|||
39
el-gamberro
24.07.14
✎
13:25
|
(38) засунь в подзапрос
выбрать док.*, ИнтервалыЦен.* из Доки.Инвентаризация как док левое соединение (запрос в 32 без упорядочить) как ИнтервалыЦен по ИнтервалыЦен.Номенклатура = док.Номенклатура и док.Дата >= ИнтервалыЦен.Начало И док.Дата < ИнтервалыЦен.Конец |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |