|
Непонятная выборка из регистра накопления. | ☑ | ||
---|---|---|---|---|
0
messulete
26.11.15
✎
15:58
|
Собственно задача получить цены покупных комплектующих из спецификации. После того как получаю список покупных комплектующих необходимо получить цены, а в случае если цены нет, то оставить номенклатуру.
В результате запроса, получаю список номенклатуры, которая есть и в тч и в регистре накопления, каким образом можно оставить данные из тч, если нету цен? // получим данные табличных частей Менеджер = Новый МенеджерВременныхТаблиц; Запрос = Новый Запрос; Запрос.МенеджерВременныхТаблиц = Менеджер; Запрос.Текст = "ВЫБРАТЬ | ТЧ.Номенклатура, | ТЧ.Количество, | ТЧ.Спецификация |ПОМЕСТИТЬ ТЧ |ИЗ | &ТЧ КАК ТЧ"; Запрос.УстановитьПараметр("ТЧ", РезультатРазузлования.ВыходныеИзделия); Запрос.Выполнить(); Запрос.Текст = "ВЫБРАТЬ | СпецификацииНоменклатурыИсходныеКомплектующие.Номенклатура КАК Номенклатура |ПОМЕСТИТЬ ПокупныеИзделия |ИЗ | ТЧ КАК ТЧ | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК СпецификацииНоменклатурыИсходныеКомплектующие | ПО ТЧ.Спецификация = СпецификацииНоменклатурыИсходныеКомплектующие.Ссылка |ГДЕ | СпецификацииНоменклатурыИсходныеКомплектующие.ВидВоспроизводства = &Покупка |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ПокупныеИзделия.Номенклатура, | ПартииТоваровНаСкладах.Период |ИЗ | ПокупныеИзделия КАК ПокупныеИзделия | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах | ПО ПокупныеИзделия.Номенклатура = ПартииТоваровНаСкладах.Номенклатура |ГДЕ | ПартииТоваровНаСкладах.Период МЕЖДУ &ДатаНачала И &ДатаОкончания"; Запрос.УстановитьПараметр("Покупка", Перечисления.ВидыВоспроизводстваНоменклатуры.Закупка); Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала); // тестовые даты Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания); // тестовые даты |
|||
1
SeraFim
26.11.15
✎
16:03
|
Есть Null
|
|||
2
anatoly
26.11.15
✎
16:06
|
цены откуда?
если из РС то можно внутреннее соединение по срезу последних. |
|||
3
messulete
26.11.15
✎
16:43
|
а можно ткнуть куда нужно поставить есть null? потому что была такая мысль, и пробовал разные варианты, но что - то не срослось.
нет, нужен РН. |
|||
4
Nuobu
26.11.15
✎
16:49
|
(3) В условие ГДЕ
|
|||
5
aleks_default
26.11.15
✎
17:18
|
(4)Тока ЕстьNULL() и в секцию ВЫБРАТЬ :)
|
|||
6
aleks_default
26.11.15
✎
17:20
|
(0) ты сначала допиши запрос, чтобы понятно стало откуда цены берешь
|
|||
7
messulete
27.11.15
✎
07:33
|
aleks_default: в смысле? запрос дописан, просто он под code.
попробовал с isnull, результат тот же. Менеджер = Новый МенеджерВременныхТаблиц; Запрос = Новый Запрос; Запрос.МенеджерВременныхТаблиц = Менеджер; Запрос.Текст = "ВЫБРАТЬ | ТЧ.Номенклатура, | ТЧ.Количество, | ТЧ.Спецификация |ПОМЕСТИТЬ ТЧ |ИЗ | &ТЧ КАК ТЧ"; Запрос.УстановитьПараметр("ТЧ", РезультатРазузлования.ВыходныеИзделия); Запрос.Выполнить(); Запрос.Текст = "ВЫБРАТЬ | СпецификацииНоменклатурыИсходныеКомплектующие.Номенклатура КАК Номенклатура |ПОМЕСТИТЬ ПокупныеИзделия |ИЗ | ТЧ КАК ТЧ | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК СпецификацииНоменклатурыИсходныеКомплектующие | ПО ТЧ.Спецификация = СпецификацииНоменклатурыИсходныеКомплектующие.Ссылка |ГДЕ | СпецификацииНоменклатурыИсходныеКомплектующие.ВидВоспроизводства = &Покупка |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ПокупныеИзделия.Номенклатура, | ПартииТоваровНаСкладах.Стоимость |ИЗ | ПокупныеИзделия КАК ПокупныеИзделия | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах | ПО ПокупныеИзделия.Номенклатура = ПартииТоваровНаСкладах.Номенклатура |ГДЕ | ЕСТЬNULL(ПартииТоваровНаСкладах.Период, ДАТАВРЕМЯ(1, 1, 1)) МЕЖДУ &ДатаНачала И &ДатаОкончания"; Запрос.УстановитьПараметр("Покупка", Перечисления.ВидыВоспроизводстваНоменклатуры.Закупка); Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала); // тестовые даты Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания); // тестовые даты |
|||
8
patria0muerte
27.11.15
✎
08:05
|
(7) Че хочешь то, не понятно. Говоришь про цену, но за цену в запросе ни слова.
Вообще - тебе не надо ставить отбор по периоду в секции ГДЕ, т.к. сначала у тебя джойнятся записи, а затем происходит отбор. Соответственно те записи к которым из РН Партий не прицепилось ничего отбрасываются по условию из ГДЕ. Варианта два: - либо запрос к партиям заворачивай в ВТ, там делай отбор по номенклатуре и периоду, а потом джойни к Покупным изделиям, либо используй Виртуальную таблицу РН Партии и там в условиях виртуальной таблицы ставь отбор по периоду. А еще лучше - и то и другое сделать. Обращение к реальной таблице РН - в основном не очень быстродейственный вариант |
|||
9
SeraFim
27.11.15
✎
08:06
|
Купи у ДенисЧ синтакс-помощник и узнай, что существует "ЕСТЬNULL()" и есть еще "ЕСТЬ NULL"
|
|||
10
patria0muerte
27.11.15
✎
08:07
|
(9) Да ЕСТЬNULL здесь не главная проблема. Хоть с ним, хоть без него у него останется только та номенклатура, которая в РН есть... а ему всю надо...
|
|||
11
Горогуля
27.11.15
✎
08:08
|
а что такое левое соединение?
|
|||
12
patria0muerte
27.11.15
✎
08:09
|
(11) Это когда левой рукой берешь... Для правого соответственно наоборот...
|
|||
13
Горогуля
27.11.15
✎
08:14
|
а при внутреннем чем берёшь?
|
|||
14
patria0muerte
27.11.15
✎
08:15
|
(13) Об этом в приличном обществе вслух говорить не принято...
|
|||
15
messulete
27.11.15
✎
08:41
|
Переделал на таблицу оборотов, отрабатывает как мне надо.
можно ткнуть почему в виртуальной отрабатывает с отбором по периоду, а в реальной нет? // получим данные табличных частей Менеджер = Новый МенеджерВременныхТаблиц; Запрос = Новый Запрос; Запрос.МенеджерВременныхТаблиц = Менеджер; Запрос.Текст = "ВЫБРАТЬ | ТЧ.Номенклатура, | ТЧ.Количество, | ТЧ.Спецификация |ПОМЕСТИТЬ ТЧ |ИЗ | &ТЧ КАК ТЧ"; Запрос.УстановитьПараметр("ТЧ", РезультатРазузлования.ВыходныеИзделия); Запрос.Выполнить(); Запрос.Текст = "ВЫБРАТЬ | СпецификацииНоменклатурыИсходныеКомплектующие.Номенклатура КАК Номенклатура |ПОМЕСТИТЬ ПокупныеИзделия |ИЗ | ТЧ КАК ТЧ | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК СпецификацииНоменклатурыИсходныеКомплектующие | ПО ТЧ.Спецификация = СпецификацииНоменклатурыИсходныеКомплектующие.Ссылка |ГДЕ | СпецификацииНоменклатурыИсходныеКомплектующие.ВидВоспроизводства = &Покупка |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ПокупныеИзделия.Номенклатура, | ПартииТоваровНаСкладахОбороты.СтоимостьПриход / ПартииТоваровНаСкладахОбороты.КоличествоПриход КАК Цена |ИЗ | ПокупныеИзделия КАК ПокупныеИзделия | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.Обороты(&ДатаНачала, &ДатаОкончания, , ) КАК ПартииТоваровНаСкладахОбороты | ПО ПокупныеИзделия.Номенклатура = ПартииТоваровНаСкладахОбороты.Номенклатура"; Запрос.УстановитьПараметр("Покупка", Перечисления.ВидыВоспроизводстваНоменклатуры.Закупка); Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала); // тестовые даты Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания); // тестовые даты |
|||
16
patria0muerte
27.11.15
✎
08:52
|
(15) см. (8)
В случае с параметрами в виртуальной таблице - сначала происходит отбор, потом соединение. В случае с отбором в ГДЕ - сначала соединение потом отбор... Про ЕСТЬNULL не забываем, гражданин... |
|||
17
messulete
27.11.15
✎
08:57
|
patria0muerte - спасибо большое за разъяснение.
поправил, так всё верно? Менеджер = Новый МенеджерВременныхТаблиц; Запрос = Новый Запрос; Запрос.МенеджерВременныхТаблиц = Менеджер; Запрос.Текст = "ВЫБРАТЬ | ТЧ.Номенклатура, | ТЧ.Количество, | ТЧ.Спецификация |ПОМЕСТИТЬ ТЧ |ИЗ | &ТЧ КАК ТЧ"; Запрос.УстановитьПараметр("ТЧ", РезультатРазузлования.ВыходныеИзделия); Запрос.Выполнить(); Запрос.Текст = "ВЫБРАТЬ | СпецификацииНоменклатурыИсходныеКомплектующие.Номенклатура КАК Номенклатура |ПОМЕСТИТЬ ПокупныеИзделия |ИЗ | ТЧ КАК ТЧ | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК СпецификацииНоменклатурыИсходныеКомплектующие | ПО ТЧ.Спецификация = СпецификацииНоменклатурыИсходныеКомплектующие.Ссылка |ГДЕ | СпецификацииНоменклатурыИсходныеКомплектующие.ВидВоспроизводства = &Покупка |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ПокупныеИзделия.Номенклатура, | ЕСТЬNULL(ПартииТоваровНаСкладахОбороты.СтоимостьПриход / ПартииТоваровНаСкладахОбороты.КоличествоПриход, 0) КАК Цена |ИЗ | ПокупныеИзделия КАК ПокупныеИзделия | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.Обороты(&ДатаНачала, &ДатаОкончания, , ) КАК ПартииТоваровНаСкладахОбороты | ПО ПокупныеИзделия.Номенклатура = ПартииТоваровНаСкладахОбороты.Номенклатура"; Запрос.УстановитьПараметр("Покупка", Перечисления.ВидыВоспроизводстваНоменклатуры.Закупка); Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала); // тестовые даты Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания); // тестовые даты |
|||
18
patria0muerte
27.11.15
✎
09:01
|
(17) Не совсем. Вместо:
ЕСТЬNULL(ПартииТоваровНаСкладахОбороты.СтоимостьПриход / ПартииТоваровНаСкладахОбороты.КоличествоПриход, 0) лучше ВЫБОР КОГДА ЕСТЬNULL(ПартииТоваровНаСкладахОбороты,0) = 0 ТОГДА 0 ИНАЧЕ ЕСТЬNULL(ПартииТоваровНаСкладахОбороты.СтоимостьПриход, 0) / ПартииТоваровНаСкладахОбороты.КоличествоПриход КОНЕЦ КАК Цена |
|||
19
patria0muerte
27.11.15
✎
09:02
|
+(18)
Ошибся: ВЫБОР КОГДА ЕСТЬNULL(ПартииТоваровНаСкладахОбороты.КоличествоПриход ,0) = 0 ТОГДА 0 ИНАЧЕ ЕСТЬNULL(ПартииТоваровНаСкладахОбороты.СтоимостьПриход, 0) / ПартииТоваровНаСкладахОбороты.КоличествоПриход КОНЕЦ КАК Цена |
|||
20
patria0muerte
27.11.15
✎
09:04
|
+(20) Даже лучше так:
ВЫБОР КОГДА ЕСТЬNULL(ПартииТоваровНаСкладахОбороты.КоличествоПриход ,0) = 0 ТОГДА 0 ИНАЧЕ ПартииТоваровНаСкладахОбороты.СтоимостьПриход / ПартииТоваровНаСкладахОбороты.КоличествоПриход КОНЕЦ КАК Цена т.к. если количествоПриход не NULL, то и СтоимостьПриход тоже... |
|||
21
aleks_default
27.11.15
✎
09:06
|
(15) еще в первом запросе(где ТЧ со спецификацией соединяешь) добавь ВЫБРАТЬ РАЗЛИЧНЫЕ
|
|||
22
messulete
27.11.15
✎
09:06
|
ok, ещё раз спасибо.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |