|
Советы по написанию запроса. | ☑ | ||
---|---|---|---|---|
0
dns-omsk
11.06.13
✎
09:20
|
Начало было тут http://www.forum.mista.ru/topic.php?id=668426
Выслушал ваши советы, переделал. Выскажете мнение пожалуйста, что так, что не так. Процедура ДокументыВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка) // Заполнение таблицы документов дополнительных расходов ТаблДокументовДопРасходов.Очистить(); Запрос = Новый Запрос("ВЫБРАТЬ | СвязанныеДокументы.Ссылка |ИЗ | КритерийОтбора.СвязанныеДокументы(&Док) КАК СвязанныеДокументы"); Запрос.УстановитьПараметр("Док", ВыбраннаяСтрока.Документ); РезДок = Запрос.Выполнить().Выбрать(); Пока РезДок.Следующий() Цикл Стр = ТаблДокументовДопРасходов.Добавить(); Стр.Контрагент = РезДок.Ссылка.Контрагент; Стр.Документ = РезДок.Ссылка; Стр.Сумма = Формат(РезДок.Ссылка.Сумма, "ЧДЦ=2; ЧРД=."); Стр.Валюта = "р." КонецЦикла; //Заполнение таблицы номенклатуры ТаблОсновная.Очистить(); Запрос.Текст = "ВЫБРАТЬ | ПоступлениеТоваровУслугТовары.Номенклатура, | ЦеныНоменклатурыСрезПоследних.Цена КАК ЦенаНаша, | ПоступлениеТоваровУслугТовары.Цена КАК ЦенаПоступление, | ПартииТоваровНаСкладахОстаткиИОбороты.КоличествоПриход, | ПартииТоваровНаСкладахОстаткиИОбороты.СтоимостьПриход, | ПоступлениеТоваровУслугТовары.НомерСтроки КАК НомерСтроки, | ПоступлениеТоваровУслугТовары.ЕдиницаИзмерения, | ПоступлениеТоваровУслугТовары.Номенклатура.Код, | ПоступлениеТоваровУслугТовары.Номенклатура.Артикул, | ПоступлениеТоваровУслугТовары.Количество |ИЗ | Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних | ПО ПоступлениеТоваровУслугТовары.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг | ПО ПоступлениеТоваровУслугТовары.Ссылка = ПоступлениеТоваровУслуг.Ссылка | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.ОстаткиИОбороты КАК ПартииТоваровНаСкладахОстаткиИОбороты | ПО ПоступлениеТоваровУслугТовары.Номенклатура = ПартииТоваровНаСкладахОстаткиИОбороты.Номенклатура |ГДЕ | ЦеныНоменклатурыСрезПоследних.ТипЦен = &ТипЦен | И ПоступлениеТоваровУслуг.Ссылка = &Ссылка | И ПартииТоваровНаСкладахОстаткиИОбороты.ДокументОприходования = &Ссылка | |УПОРЯДОЧИТЬ ПО | НомерСтроки"; Запрос.УстановитьПараметр("Период", ТекущаяДата()); Запрос.УстановитьПараметр("Ссылка", ВыбраннаяСтрока.Документ); Запрос.УстановитьПараметр("ТипЦен", Розничная); РезОсн = Запрос.Выполнить().Выбрать(); Пока РезОсн.Следующий() Цикл Стр = ТаблОсновная.Добавить(); Стр.НомерПП = РезОсн.НомерСтроки; Стр.Код = РезОсн.Номенклатура.Код; Стр.Артикул = РезОсн.Номенклатура.Артикул; Стр.Название = РезОсн.Номенклатура; Стр.Колво = РезОсн.Количество; Стр.Ед = РезОсн.ЕдиницаИзмерения; Стр.ЦенаНаша = Формат(РезОсн.ЦенаНаша, "ЧДЦ=2"); Стр.ЦенаПост = Строка(Формат(РезОсн.ЦенаПоступление, "ЧДЦ=2")); Стр.ЦенаПостПлюс = Строка(Формат(РезОсн.СтоимостьПриход / РезОсн.КоличествоПриход, "ЧДЦ=2")); //Наценка = (РезПартия.СтоимостьПриход - Поз.Сумма) / РезПартия.КоличествоПриход Стр.Процент = Строка(Формат((РезОсн.ЦенаНаша / (РезОсн.СтоимостьПриход / РезОсн.КоличествоПриход) - 1)*100, "ЧДЦ=2")) + "%"; КонецЦикла; КонецПроцедуры Заранее, благодарю. |
|||
1
Maxus43
11.06.13
✎
09:23
|
ГДЕ
ЦеныНоменклатурыСрезПоследних.ТипЦен = &ТипЦен это в параметры ЦеныНоменклатурыСрезПоследних |
|||
2
H A D G E H O G s
11.06.13
✎
09:25
|
Все не так
|
|||
3
H A D G E H O G s
11.06.13
✎
09:25
|
(1) типа
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.ОстаткиИОбороты КАК ПартииТоваровНаСкладахОстаткиИОбороты это нормально? |
|||
4
Галахад
гуру
11.06.13
✎
09:25
|
А зачем два внутренних и левое к поступлениям же?
|
|||
5
Maxus43
11.06.13
✎
09:29
|
(3) я типа всё не успел поглядеть, кофе пью, а тут глаза режет Срез
|
|||
6
dns-omsk
11.06.13
✎
09:35
|
(3) Это не я, это конструктор сам придумал.
|
|||
7
Maxus43
11.06.13
✎
09:35
|
(3) ты лучше скажи, скачал мой цфник то с подписками на клиенте? работает?
|
|||
8
Maxus43
11.06.13
✎
09:36
|
(6) конструктор сам нчего не придумывает, на закладке Связи ты так поставил галки
|
|||
9
Irbis
11.06.13
✎
09:36
|
(6) Конструктор думать не умеет
|
|||
10
H A D G E H O G s
11.06.13
✎
09:36
|
(7) Да. Я признал это в той ветке
|
|||
11
Maxus43
11.06.13
✎
09:39
|
(10) да я не всмысле ткнуть носом) а всмысле что работет иногда неожиданно)
|
|||
12
dns-omsk
11.06.13
✎
10:03
|
(4) Ну а как еще я смог бы тянуть инфу из 3 разных таблиц?
|
|||
13
Maxus43
11.06.13
✎
10:09
|
(12) сначала разберись что такое Соединение, и в его видах
|
|||
14
dns-omsk
11.06.13
✎
12:56
|
Блин, ну не могу понять и все тут.
Maxus43, если время есть, измени мой запрос как бы ты сделал или кидани, пожалуйста, ссылочку на примерчик подобный. |
|||
15
dns-omsk
11.06.13
✎
19:23
|
Только так, больше не могу додуматься, да и то, в выборку не попадают значение с null. Почему, не пойму.
Запрос.Текст = "ВЫБРАТЬ | ПоступлениеТоваровУслугТовары.Номенклатура, | ЦеныНоменклатурыСрезПоследних.Цена КАК ЦенаНаша, | ПоступлениеТоваровУслугТовары.Цена КАК ЦенаПоступление, | ПартииТоваровНаСкладахОстаткиИОбороты.КоличествоПриход, | ПартииТоваровНаСкладахОстаткиИОбороты.СтоимостьПриход, | ПоступлениеТоваровУслугТовары.НомерСтроки КАК НомерСтроки, | ПоступлениеТоваровУслугТовары.ЕдиницаИзмерения, | ПоступлениеТоваровУслугТовары.Номенклатура.Код, | ПоступлениеТоваровУслугТовары.Номенклатура.Артикул, | ПоступлениеТоваровУслугТовары.Количество |ИЗ | Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних | ПО ПоступлениеТоваровУслугТовары.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг | ПО ПоступлениеТоваровУслугТовары.Ссылка = ПоступлениеТоваровУслуг.Ссылка | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.ОстаткиИОбороты КАК ПартииТоваровНаСкладахОстаткиИОбороты | ПО ПоступлениеТоваровУслугТовары.Номенклатура = ПартииТоваровНаСкладахОстаткиИОбороты.Номенклатура |ГДЕ | ЦеныНоменклатурыСрезПоследних.ТипЦен = &ТипЦен | И ПоступлениеТоваровУслуг.Ссылка = &Ссылка | И ПартииТоваровНаСкладахОстаткиИОбороты.ДокументОприходования = &Ссылка | |УПОРЯДОЧИТЬ ПО | НомерСтроки"; |
|||
16
dns-omsk
11.06.13
✎
19:24
|
Опс, не то запостил. Вот правильно
Запрос.Текст = "ВЫБРАТЬ | ПоступлениеТоваровУслугТовары.Номенклатура, | ЦеныНоменклатурыСрезПоследних.Цена КАК ЦенаНаша, | ПоступлениеТоваровУслугТовары.Цена КАК ЦенаПоступление, | ПартииТоваровНаСкладахОстаткиИОбороты.КоличествоПриход, | ПартииТоваровНаСкладахОстаткиИОбороты.СтоимостьПриход, | ПоступлениеТоваровУслугТовары.НомерСтроки КАК НомерСтроки, | ПоступлениеТоваровУслугТовары.ЕдиницаИзмерения, | ПоступлениеТоваровУслугТовары.Номенклатура.Код, | ПоступлениеТоваровУслугТовары.Номенклатура.Артикул, | ПоступлениеТоваровУслугТовары.Количество |ИЗ | Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары | ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг | ПО ПоступлениеТоваровУслугТовары.Ссылка = ПоступлениеТоваровУслуг.Ссылка | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.ОстаткиИОбороты КАК ПартииТоваровНаСкладахОстаткиИОбороты | ПО ПоступлениеТоваровУслугТовары.Номенклатура = ПартииТоваровНаСкладахОстаткиИОбороты.Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних | ПО ПоступлениеТоваровУслугТовары.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура |ГДЕ | ЦеныНоменклатурыСрезПоследних.ТипЦен = &ТипЦен | И ПоступлениеТоваровУслуг.Ссылка = &Ссылка | И ПартииТоваровНаСкладахОстаткиИОбороты.ДокументОприходования = &Ссылка | |УПОРЯДОЧИТЬ ПО | НомерСтроки"; Запрос.УстановитьПараметр("Период", ТекущаяДата()); Запрос.УстановитьПараметр("Ссылка", ВыбраннаяСтрока.Документ); Запрос.УстановитьПараметр("ТипЦен", Розничная); |
|||
17
H A D G E H O G s
11.06.13
✎
19:25
|
Бида.
|
|||
18
dns-omsk
11.06.13
✎
19:40
|
Понял ошибку, почему не выходили NULL записи
Убрал ЦеныНоменклатурыСрезПоследних.ТипЦен = &ТипЦен Добавил ЕСТЬNULL, все заработало как я и хотел. Но все таки интересно,чем плох мой подход. Лучше бы показал кто-нибудь как оптимальней. |
|||
19
Серго62
11.06.13
✎
19:42
|
(16) Напиши сначала простыми русскими словами что нужно получить. Потом переведи это на язык запроса.
|
|||
20
hhhh
11.06.13
✎
19:46
|
(18) твой подход в 500 раз медленнее
|
|||
21
EvgeniuXP
11.06.13
✎
20:07
|
(180) посмотри курсы от 1Специалист-а, там запросы на SQL разбирают и про оптимизацию говорят - очень много примеров.
|
|||
22
Alexprimer
12.06.13
✎
11:47
|
вот примерно направление
ВЫБРАТЬ ПоступлениеТоваровУслугТовары.Номенклатура, ПоступлениеТоваровУслугТовары.Цена КАК ЦенаПоступление, ПоступлениеТоваровУслугТовары.НомерСтроки КАК НомерСтроки, ПоступлениеТоваровУслугТовары.ЕдиницаИзмерения, ПоступлениеТоваровУслугТовары.Номенклатура.Код, ПоступлениеТоваровУслугТовары.Номенклатура.Артикул, ПоступлениеТоваровУслугТовары.Количество ПОМЕСТИТЬ ДокументПоступления ИЗ Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары ГДЕ ПоступлениеТоваровУслугТовары.Ссылка = &Ссылка ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ПартииТоваровНаСкладахОстаткиИОбороты.Номенклатура, ПартииТоваровНаСкладахОстаткиИОбороты.КоличествоПриход, ПартииТоваровНаСкладахОстаткиИОбороты.СтоимостьПриход ПОМЕСТИТЬ ПартииТоваров ИЗ РегистрНакопления.ПартииТоваровНаСкладах.ОстаткиИОбороты( , , , , Номенклатура В (ВЫБРАТЬ ДокументПоступления.Номенклатура ИЗ ДокументПоступления)) КАК ПартииТоваровНаСкладахОстаткиИОбороты ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ДокументПоступления.Номенклатура, ДокументПоступления.ЦенаПоступление, ДокументПоступления.НомерСтроки, ДокументПоступления.ЕдиницаИзмерения, ДокументПоступления.НоменклатураКод, ДокументПоступления.НоменклатураАртикул, ДокументПоступления.Количество, ПартииТоваров.КоличествоПриход, ПартииТоваров.СтоимостьПриход ИЗ ДокументПоступления КАК ДокументПоступления ЛЕВОЕ СОЕДИНЕНИЕ ПартииТоваров КАК ПартииТоваров ПО ДокументПоступления.Номенклатура = ПартииТоваров.Номенклатура ну или как минимум наложи условия на виртуальные таблицы РегистрНакопления.ПартииТоваровНаСкладах.ОстаткиИОбороты (тут период, который анализируешь наверно нужен) и РегистрСведений.ЦеныНоменклатуры.СрезПоследних |
|||
23
sttt
12.06.13
✎
12:37
|
это тоже ненормально:
Стр.Контрагент = РезДок.Ссылка.Контрагент; в запросе получай нужные поля |
|||
24
Зойч
12.06.13
✎
13:00
|
зачем
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг |
|||
25
dns-omsk
13.06.13
✎
13:12
|
Бодрого дня.
Скажите, правильно ли я вас понял? Запрос из (16) превратился в такой: Запрос.Текст = "ВЫБРАТЬ | ПоступлениеТоваровУслугТовары.Номенклатура, | ПоступлениеТоваровУслугТовары.Цена КАК ЦенаПоступление, | ПоступлениеТоваровУслугТовары.НомерСтроки КАК НомерСтроки, | ПоступлениеТоваровУслугТовары.ЕдиницаИзмерения, | ПоступлениеТоваровУслугТовары.Номенклатура.Код, | ПоступлениеТоваровУслугТовары.Номенклатура.Артикул, | ПоступлениеТоваровУслугТовары.Количество |ПОМЕСТИТЬ ДокументыПоступления |ИЗ | Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары | ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг | ПО ПоступлениеТоваровУслугТовары.Ссылка = ПоступлениеТоваровУслуг.Ссылка |ГДЕ | ПоступлениеТоваровУслуг.Ссылка = &Ссылка |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ПартииТоваровНаСкладахОстаткиИОбороты.КоличествоПриход, | ПартииТоваровНаСкладахОстаткиИОбороты.СтоимостьПриход, | ДокументыПоступления.Номенклатура, | ДокументыПоступления.ЦенаПоступление, | ДокументыПоступления.НомерСтроки, | ДокументыПоступления.ЕдиницаИзмерения, | ДокументыПоступления.Номенклатура.Код, | ДокументыПоступления.Номенклатура.Артикул, | ДокументыПоступления.Количество |ПОМЕСТИТЬ ПартииТоваров |ИЗ | ДокументыПоступления КАК ДокументыПоступления | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.ОстаткиИОбороты КАК ПартииТоваровНаСкладахОстаткиИОбороты | ПО (ПартииТоваровНаСкладахОстаткиИОбороты.Номенклатура = ДокументыПоступления.Номенклатура) |ГДЕ | ПартииТоваровНаСкладахОстаткиИОбороты.ДокументОприходования = &Ссылка |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ПартииТоваров.КоличествоПриход, | ПартииТоваров.СтоимостьПриход, | ПартииТоваров.Номенклатура, | ПартииТоваров.ЦенаПоступление, | ПартииТоваров.НомерСтроки, | ПартииТоваров.ЕдиницаИзмерения, | ПартииТоваров.Номенклатура.Код, | ПартииТоваров.Номенклатура.Артикул, | ПартииТоваров.Количество, | ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК ЦенаНаша |ИЗ | ПартииТоваров КАК ПартииТоваров | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних | ПО ПартииТоваров.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура"; Запрос.УстановитьПараметр("Ссылка", ВыбраннаяСтрока.Документ); |
|||
26
dns-omsk
13.06.13
✎
13:22
|
(19) А суть было в том, на входе в запрос есть документ
Запрос.УстановитьПараметр("Ссылка", ВыбраннаяСтрока.Документ); Получаю сначала табличную часть документа, затем количество и сумму партии, затем цену Розничную в текущий момент времени. |
|||
27
dns-omsk
13.06.13
✎
13:23
|
Честно говоря, я взял небольшой документ, около 20 строк, вставил запросы поочередно в цикл (30 раз), замерил время и не получил выигрыша ни на одну секунду.
|
|||
28
ptiz
13.06.13
✎
13:25
|
(25) Если остатки тебе не нужны, то используй таблицу .Обороты(), а не .ОстаткиИОбороты()
Во-вторых, см. (22) |
|||
29
ptiz
13.06.13
✎
13:26
|
(27) Франчи так же работают, сделают доработку, работает, клиент подписывает акт.
А через год: "Помогите! Тормозит!". И платят двойную сумму за исправление. |
|||
30
dns-omsk
13.06.13
✎
13:34
|
(28) Я читал пример Alexprimer и сделал именно так, как он и рекомендовал. Так же читал весь день мануалы по запросам. Многие товарищи пишут, что вложенный запрос - не есть гуд, поэтому я его выкинул.
|
|||
31
dns-omsk
13.06.13
✎
13:36
|
И еще, заметье, я пишу просто небольшую удобняшку для собственных нужд, денег на нее не выделено, поэтому приходиться осваивать запросы самостоятельно с полного нуля.
|
|||
32
ptiz
13.06.13
✎
13:50
|
(31) Любой запрос может быть и гуд, и бад.
Делай на основе кода Alexprimer и осмысливай почему именно так. Использование виртуальных таблиц без параметров - гарантированные тормоза. ОстаткиИОбороты - самая тяжелая таблица, которая только может быть. |
|||
33
H A D G E H O G s
13.06.13
✎
13:52
|
(32)
ОстаткиИОбороты - самая тяжелая таблица, которая только может быть. Пфффф, ВТ РегБухгалтерии нежно похлопывают по плечу тебя, птиц. |
|||
34
dns-omsk
13.06.13
✎
13:54
|
(32) Чтож, завтра может сделаю как он рекомендовал, замерю производительность его варианта.
|
|||
35
dns-omsk
14.06.13
✎
07:10
|
ptiz: Использование виртуальных таблиц без параметров - гарантированные тормоза.
Почему так, не могу понять. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |