|
Как понять что запрос работает правильно? | ☑ | ||
---|---|---|---|---|
0
Kris_Tina7252
23.01.15
✎
22:38
|
Процедура ОбработкаПроведения(Отказ, Режим)
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СписаниеТоваровТовары.Номенклатура, | СписаниеТоваровТовары.Количество, | ОстаткиТоваровНаСкладахОстатки.КоличествоОстаток КАК КоличествоНаСкладе |ИЗ | Документ.СписаниеТоваров.Товары КАК СписаниеТоваровТовары | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваровНаСкладах.Остатки( | &МоментВремени, | Номенклатура В (&СписокНоменклатурыДокумента) | И Склад = &СкладВДокументе) КАК ОстаткиТоваровНаСкладахОстатки | ПО СписаниеТоваровТовары.Номенклатура = ОстаткиТоваровНаСкладахОстатки.Номенклатура |ГДЕ | СписаниеТоваровТовары.Номенклатура.Ссылка = &Ссылка"; Запрос.УстановитьПараметр("СкладВДокументе", Склад); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("СписокНоменклатурыДокумента", Товары.ВыгрузитьКолонку("Номенклатура")); Запрос.УстановитьПараметр("Ссылка", Ссылка); ВыборкаРезультатаЗапроса = Запрос.Выполнить().Выбрать(); Сообщить("10"); Сообщить(ВыборкаРезультатаЗапроса.Количество); Сообщить (ВыборкаРезультатаЗапроса.КоличествоНаСкладе); Пока ВыборкаРезультатаЗапроса.Следующий() Цикл Остаток = ?(ВыборкаРезультатаЗапроса.КоличествоНаСкладе = Null, 0, ВыборкаРезультатаЗапроса.КоличествоНаСкладе); Сообщить(Остаток); Если Остаток < ВыборкаРезультатаЗапроса.Количество Тогда Сообщить("Материала " + СокрЛП(ВыборкаРезультатаЗапроса.Номенклатура) + "имеется только" + Остаток); Отказ = Истина; Возврат; КонецЕсли; Для Каждого ТекСтрокаТовары Из Товары Цикл Движение = Движения.ОстаткиТоваровНаСкладах.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = ВыборкаРезультатаЗапроса.Номенклатура; Движение.Склад = Склад; Движение.Количество = ВыборкаРезультатаЗапроса.КоличествоНаСкладе; КонецЦикла; КонецЦикла; Движения.ОстаткиТоваровНаСкладах.Записать(); КонецПроцедуры |
|||
1
Kris_Tina7252
23.01.15
✎
22:39
|
по отладчику доходит до строки Пока ВыборкаРезультатаЗапроса.Следующий() Цикл
и сразу перескапивает на Движения.ОстаткиТоваровНаСкладах.Записать(); |
|||
2
Fragster
гуру
23.01.15
✎
22:41
|
неправильно. при оперативном перепроведении лажа.
ну и вообще через пердь... null какой-то, цикл в цикле... |
|||
3
Kris_Tina7252
23.01.15
✎
22:41
|
+ сообщения
Сообщить(ВыборкаРезультатаЗапроса.Количество); Сообщить (ВыборкаРезультатаЗапроса.КоличествоНаСкладе); просто пустые строки |
|||
4
Kris_Tina7252
23.01.15
✎
22:42
|
так мне нужно чтобы и при оперативном и при не оперативном не проводилось если нет товара
|
|||
5
Fragster
гуру
23.01.15
✎
22:42
|
(3) логично
|
|||
6
Fragster
гуру
23.01.15
✎
22:43
|
(4) сейчас в тренде - записываешь движения, потом проверяешь, что минусов не получилось...
|
|||
7
zulu_mix
23.01.15
✎
22:45
|
посмотреть как в типовых сделано не предлагать?
|
|||
8
Kris_Tina7252
23.01.15
✎
22:45
|
так а лажа хоть в том что в конструкторе запроса напортачила или в остальном??
|
|||
9
zulu_mix
23.01.15
✎
22:45
|
(6) это транзакция со всеми вытекающими
|
|||
10
Fragster
гуру
23.01.15
✎
22:47
|
(9) а? дяденька, я же не настоящий сварщик!
|
|||
11
zulu_mix
23.01.15
✎
22:55
|
(10) ну как словишь нежданчик при мгновенном обмене, так и заваришь
|
|||
12
Fragster
гуру
23.01.15
✎
23:05
|
(11) а что иль кто есть "мгновенный обмен", советник?
|
|||
13
Kris_Tina7252
23.01.15
✎
23:05
|
ну я брала за основу пример с другого форума, и там все работает. так у меняж блин слово в слово как там кроме текста из конструктора. вот текст
Процедура ОбработкаПроведения(Отказ, Режим) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяНоменклатура.Номенклатура, | РасходнаяНакладнаяНоменклатура.Коичество КАК Кои, | ОстаткиМатериаловОстатки.КоличествоОстаток, | СтоимостьМатериаловОстатки.СтоимостьОстаток, | ОстаткиМатериаловОстаткиНаСкладе.КоличествоОстаток КАК КоличествоОстатокНаСкладе, | РасходнаяНакладнаяНоменклатура.Сумма, | СтоимостьМатериаловОстатки.Номенклатура КАК Номенклатура1, | СтоимостьМатериаловОстатки.СтоимостьОстаток КАК СтоимостьОстаток1, | ОстаткиМатериаловОстаткиНаСкладе.КоличествоОстаток КАК КоличествоОстаток1 |ИЗ | Документ.РасходнаяНакладная.Номенклатура КАК РасходнаяНакладнаяНоменклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки( | &Дата, | Номенклатура В (&СписокНоменклатурыДокумента) | И Склад = &СкладВДокументе) КАК ОстаткиМатериаловОстаткиНаСкладе | ПО РасходнаяНакладнаяНоменклатура.Номенклатура = ОстаткиМатериаловОстаткиНаСкладе.Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки(&Дата, Номенклатура В (&СписокНоменклатурыДокумента)) КАК СтоимостьМатериаловОстатки | ПО РасходнаяНакладнаяНоменклатура.Номенклатура = СтоимостьМатериаловОстатки.Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(&Дата, Номенклатура В (&СписокНоменклатурыДокумента)) КАК ОстаткиМатериаловОстатки | ПО РасходнаяНакладнаяНоменклатура.Номенклатура = ОстаткиМатериаловОстатки.Номенклатура |ГДЕ | РасходнаяНакладнаяНоменклатура.Ссылка = &Ссылка | |ДЛЯ ИЗМЕНЕНИЯ | РегистрНакопления.СтоимостьМатериалов.Остатки, | РегистрНакопления.ОстаткиМатериалов.Остатки"; Запрос.УстановитьПараметр("СкладВДокументе",Склад); Запрос.УстановитьПараметр("Дата",Дата); Запрос.УстановитьПараметр("СписокНоменклатурыДокумента",Номенклатура.ВыгрузитьКолонку("Номенклатура")); Запрос.УстановитьПараметр("Ссылка",Ссылка); ВыборкаРезультатаЗапроса = Запрос.Выполнить().Выбрать(); Пока ВыборкаРезультатаЗапроса.Следующий() Цикл Остаток = ?(ВыборкаРезультатаЗапроса.КоличествоОстатокНаСкладе = Null,0,ВыборкаРезультатаЗапроса.КоличествоОстатокНаСкладе); Сообщить (Остаток); Если Остаток < ВыборкаРезультатаЗапроса.Кои Тогда Сообщить ("Материала "+ СокрЛП(ВыборкаРезультатаЗапроса.Номенклатура) + " имеется только "+ Остаток); Отказ = Истина; Возврат; КонецЕсли; Для Каждого ТекСтрокаНоменклатура Из Номенклатура Цикл Движение = Движения.ОстаткиМатериалов.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = ВыборкаРезультатаЗапроса.Номенклатура; Движение.Склад = Склад; Движение.Количество = ВыборкаРезультатаЗапроса.КоличествоОстатокНаСкладе; КонецЦикла; КонецЦикла; Движения.ОстаткиМатериалов.Записать(); КонецПроцедуры |
|||
14
zulu_mix
23.01.15
✎
23:07
|
(12) у всех по разному. некоторые на запись регистров вешают
|
|||
15
Fragster
гуру
23.01.15
✎
23:35
|
(14) да, есть много способов выстрелить себе в ногу. но подход из (6), например, позволяет переключить на управляемые блокировки вообще без дополнительного кода. а дятлы, которые на подписку у регистра вешают обмен - должны это учитывать.
|
|||
16
zulu_mix
23.01.15
✎
23:41
|
(15) ты это всегда проверяешь когда работу меняешь?
|
|||
17
Escander
24.01.15
✎
06:52
|
(6) уже хз как давно так в тренде
|
|||
18
GANR
24.01.15
✎
10:39
|
(0) Я сразу понимаю, что неправильно:
1. Что за СписаниеТоваровТовары.Номенклатура.Ссылка = &Ссылка? Такой запрос всегда вернет пустой результат, так как параметр Ссылка имеет тип ДокументСсылка.СписаниеТоваров, а фильтруемое поле СписаниеТоваровТовары.Номенклатура.Ссылка - номенклатура. 2. Нет группировки строк документа по номенклатуре с суммированием по полям "Сумма", "Количество", либо проверки на дубли. |
|||
19
Kris_Tina7252
28.01.15
✎
12:44
|
если кому интересно
строку СписаниеТоваровТовары.Номенклатура.Ссылка = &Ссылка"; нужно заменить на СписаниеТоваровТовары.Ссылка = &Ссылка"; Спасибо GANR навели на мысль из-за чего ошибка |
|||
20
H A D G E H O G s
28.01.15
✎
12:50
|
Никому не интересно
|
|||
21
Kris_Tina7252
28.01.15
✎
12:55
|
я за вас рада
|
|||
22
ktvladimir
28.01.15
✎
12:59
|
ну и до кучи если используете единицы измерения и коэффициенты не забудьте пересчитать количество в единицах хранения остатков
|
|||
23
ktvladimir
28.01.15
✎
13:02
|
Для Каждого ТекСтрокаТовары Из Товары Цикл
Движение = Движения.ОстаткиТоваровНаСкладах.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = ВыборкаРезультатаЗапроса.Номенклатура; Движение.Склад = Склад; Движение.Количество = ВыборкаРезультатаЗапроса.КоличествоНаСкладе; КонецЦикла и вот это совсем непонятно... те у вас N строк в ТЧ и соответсвенно на каждую запись будет по N движений.. зачем? |
|||
24
sapphire
28.01.15
✎
13:02
|
Жуть...
|
|||
25
ktvladimir
28.01.15
✎
13:05
|
Вместо Возврат ставьте Продолжить
а после завершения цикла Если Отказ Тогда Возврат; КонецЕсли; иначе будет такая лажа допустим у вас по 3 позициям не хватает остатка. Вы запускаете проведение прогамма Вам выдает, что нет остатка по товару 1 и завершает процедуру. Далее вы исправляете ТЧ нажимаете провести Программа дает не хватает остатка по товару 2 на N ом сообщении пользователь Вас порвет |
|||
26
ktvladimir
28.01.15
✎
13:06
|
Остаток = ?(ВыборкаРезультатаЗапроса.КоличествоНаСкладе = Null, 0, ВыборкаРезультатаЗапроса.КоличествоНаСкладе);
почему сразу в запросе не сделать? ЕстьNULL(ОстаткиТоваровНаСкладахОстатки.КоличествоОстаток,0) КАК КоличествоНаСкладе |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |