|
Не работает запрос | ☑ | ||
---|---|---|---|---|
0
Альбатрос
13.08.12
✎
07:06
|
Здрассьте!!! Задача: сделать запрос в нужный заказПоставщику в ТЧ по нужной номенклатуре. Сделал вот такой запрос:
Запрос = Новый Запрос; Запрос.текст = "ВЫБРАТЬ | ЗаказПоставщику.Товары.( | СУММА(Количество) КАК Колво | ) |ИЗ | Документ.ЗаказПоставщику КАК ЗаказПоставщику |ГДЕ | ЗаказПоставщику.Ссылка = &ТекДок | И ЗаказПоставщику.Товары.Номенклатура = &ТекНом"; Если ТипЗнч(СтрокаТЧ.НовоеРазмещение) = Тип("ДокументСсылка.ЗаказПоставщику") тогда Запрос.УстановитьПараметр("ТекДок", СтрокаТЧ.НовоеРазмещение); Запрос.УстановитьПараметр("ТекНом",СтрокаТЧ.Номенклатура); Рез = Запрос.Выполнить(); Если рез.Пустой() тогда Сообщить("Ошибка в строке № "+СтрокаТЧ.НомерСтроки+". В указаном заказе отсутствует данная номенклатура"); Отказ = Истина; Иначе Выборка = рез.Выбрать(); Если СтрокаТЧ.Количество > Выборка.Количество тогда Сообщить("Ошибка в строке № "+СтрокаТЧ.НомерСтроки+". В указаном заказе не хватает кол-ва данной номенклатуры"); Отказ = Истина; КонецЕсли; КонецЕсли; КонецЕсли; Вываливается ошибка: Ошибка при выполнении обработчика - 'ОбработкаПроведения' по причине: {Документ.РезервированиеТоваров.МодульОбъекта(568)}: Поле объекта не обнаружено (Колво) Что неправильно в запросе? |
|||
1
Красный рассвет
13.08.12
✎
07:10
|
а где строка 568-то?
|
|||
2
Альбатрос
13.08.12
✎
07:11
|
(1) Неправильно скопировал. Ошибка в этой строке:
Если СтрокаТЧ.Количество > Выборка.Колво тогда |
|||
3
ZanderZ
13.08.12
✎
07:13
|
(2) ты посмотри в отладчике что тебе выборка возвращает...
|
|||
4
Красный рассвет
13.08.12
✎
07:13
|
А где Выборка.Следующий() ?
|
|||
5
Красный рассвет
13.08.12
✎
07:16
|
Вообще надо было выбирать из таблицы Документ.ЗаказПоставщику.Товары, а не Документ.ЗаказПоставщику
|
|||
6
Альбатрос
13.08.12
✎
07:33
|
(4)(5) Спасибо! Оба замечания в тему. Все работает.
|
|||
7
Альбатрос
13.08.12
✎
07:42
|
Не все гладко. Почему то не срабатывает отбор по номенклатуре. Возвращает Выборка.Количество с типом Null, если нужной номенклатуры в ТЧ нет. Соответственно вываливается ошибка на: Если СтрокаТЧ.Количество > Выборка.Количество тогда
Ошибка при выполнении обработчика - 'ОбработкаПроведения' по причине: {Документ.РезервированиеТоваров.МодульОбъекта(567)}: Операции сравнения на больше-меньше допустимы только для значений совпадающих примитивных типов (Булево, Число, Строка, Дата) Новый текст запроса: Запрос = Новый Запрос; Запрос.текст = "ВЫБРАТЬ | СУММА(ЗаказПоставщикуТовары.Количество) КАК Количество |ИЗ | Документ.ЗаказПоставщику.Товары КАК ЗаказПоставщикуТовары |ГДЕ | ЗаказПоставщикуТовары.Ссылка = &ТекДок | И ЗаказПоставщикуТовары.Номенклатура = &ТекНом"; Если ТипЗнч(СтрокаТЧ.НовоеРазмещение) = Тип("ДокументСсылка.ЗаказПоставщику") тогда Запрос.УстановитьПараметр("ТекДок", СтрокаТЧ.НовоеРазмещение); Запрос.УстановитьПараметр("ТекНом",СтрокаТЧ.Номенклатура); Рез = Запрос.Выполнить(); Если рез.Пустой() тогда Сообщить("Ошибка в строке № "+СтрокаТЧ.НомерСтроки+". В указаном заказе отсутствует данная номенклатура"); Отказ = Истина; Иначе Выборка = рез.Выбрать(); Пока выборка.Следующий() цикл Если СтрокаТЧ.Количество > Выборка.Количество тогда Сообщить("Ошибка в строке № "+СтрокаТЧ.НомерСтроки+". В указаном заказе не хватает кол-ва данной номенклатуры"); Отказ = Истина; КонецЕсли; КонецЦикла; КонецЕсли; КонецЕсли; Что неправильно я указал в условии? |
|||
8
Wobland
13.08.12
✎
07:54
|
Если СтрокаТЧ
запрос в цикле? где моя линейка.. |
|||
9
Альбатрос
13.08.12
✎
07:56
|
(8) Это тестовый. Чтоб понять как сделать отбор в табличной части. Почему, если в ТЧ отсутствует указанная номенклатура, выборка не пустая? более того, возвращает с типом значения Null
|
|||
10
Красный рассвет
13.08.12
✎
07:57
|
isnull (СУММА(ЗаказПоставщикуТовары.Количество),0)
|
|||
11
Светлый Гений
13.08.12
✎
07:59
|
Выборка не пустая, потому что нет группировочного поля, а есть только СУММА(ЗаказПоставщикуТовары.Количество). Если добавить группировочное поле, например ссылку на документ, то выборка станет пустой. По-моему так.
|
|||
12
aleks-id
13.08.12
✎
08:08
|
мой мозг испепелен сим волшебным кодом
|
|||
13
Альбатрос
13.08.12
✎
08:12
|
(11) Именно так, спасибо за разъяснение.
(12) Что неправильно? |
|||
14
Anastasiy
13.08.12
✎
08:14
|
ЕСТЬNULL(твой параметр,0)
|
|||
15
the_pal
13.08.12
✎
08:17
|
или добавить условие:
Имеющие СУММА(ЗаказПоставщикуТовары.Количество) >0 |
|||
16
Альбатрос
13.08.12
✎
08:19
|
Добавил группировку как посоветовали в (11), ненужные выборки исчезли. Но вариант с ЕСТЬNULL я тоже попробовал.
|
|||
17
aleks-id
13.08.12
✎
08:20
|
(13) да там же цикл в цикле!!!
|
|||
18
Альбатрос
13.08.12
✎
08:22
|
(17) Ну это да, я щас поправлю.
|
|||
19
aleks-id
13.08.12
✎
08:23
|
(18) смысл тогда делать такую ветку? надо было изначально правильно составить запрос _БЕЗ_ цикла вообще а вот потом спрашивать - а чё это у меня тут нулл??
|
|||
20
Альбатрос
13.08.12
✎
08:30
|
(19) Ну так ветка не про запрос в цикле, а про "чё это у меня тут нулл??". Две несвязанные проблемы. Тем более у меня пока трудности с тем, чтобы составить грамотный запрос, не пихая его в цикл. Но я над этим работаю, и благодарен, что народ мне здесь помогает, и надеюсь будет помогать в будущем.
|
|||
21
aleks-id
13.08.12
✎
08:35
|
(20) вот и надо было тогда спросить: помогите избавиться от циклов. тебе бы посоветовали тогда как запрос сделать грамотно и как выбрать только неправильные строки для вывода сообщения об ошибке. копай в этом направлении
|
|||
22
Альбатрос
13.08.12
✎
08:45
|
Ну вот я и встал на месте. Не могу понять как связать ТЧ док-та резервирования с ТЧ запрашиваемых заказов. Запросом можно? Док-т не должен быть записан?
|
|||
23
ILM
гуру
13.08.12
✎
08:49
|
(22) Брррр... Давайте по порядку формулировать.
1) Есть заказы с ТЧ. 2) Есть документ резерва с ТЧ. 3) Нужно получить .... из заказы.ТЧ связанную по номенклатуре с резерв.ТЧ (ЛЕВОЕ/ПРАВОЕ/ВНУТРЕННЕЕ СОЕДИНЕНИЕ ... ПО ...), при условии (ГДЕ ...). Так надо? |
|||
24
shuhard
13.08.12
✎
08:56
|
(22)[Док-т не должен быть записан]
не обязательно нет же ни каких проблем выгрузить ТЧ в ТЗ и подсунуть пакетному запросу |
|||
25
Альбатрос
13.08.12
✎
09:32
|
(23) Ну да... только маленечко наоборот. Нужно из документа резервирования связать ТЧ с ТЧ указаного заказа. Я так понимаю, нужно использовать ЛЕВОЕ СОЕДИНЕНИЕ.
(24) Сейчас попробую |
|||
26
Альбатрос
14.08.12
✎
06:58
|
Уважаемые, вернемся к моему вопросу. Наваял вот такое чудо:
ТабНом = Новый ТаблицаЗначений; Массив = Новый Массив; Массив.Добавить(Тип("Число")); Кч = Новый КвалификаторыЧисла(10,2); ОписаниеТиповЧ = Новый ОписаниеТипов(Массив,,,Кч); ТабНом.Колонки.Добавить("НомерСтроки", ОписаниеТиповЧ); ТабНом.Колонки.Добавить("Ном", Новый ОписаниеТипов("СправочникСсылка.Номенклатура")); ТабНом.Колонки.Добавить("Колво", ОписаниеТиповЧ); ТабНом.Колонки.Добавить("Заказ", Новый ОписаниеТипов("ДокументСсылка.ЗаказПоставщику")); Для каждого СтрокаТЧ из товары цикл Если ТипЗнч(СтрокаТЧ.НовоеРазмещение) = Тип("ДокументСсылка.ЗаказПоставщику") тогда НовСтрока = ТабНом.Добавить(); НовСтрока.НомерСтроки = СтрокаТч.НомерСтроки; НовСтрока.Ном = СтрокаТЧ.Номенклатура; НовСтрока.Колво = СтрокаТЧ.Количество; НовСтрока.Заказ = СтрокаТЧ.НовоеРазмещение; КонецЕсли; КонецЦикла; Запрос = Новый Запрос; МенеджерВТ = Новый МенеджерВременныхТаблиц; Запрос.МенеджерВременныхТаблиц = МенеджерВТ; Запрос.текст = "ВЫБРАТЬ | ТабНом.НомерСтроки КАК НомерСтроки, | ТабНом.Ном КАК НомРезерва, | ТабНом.Колво КАК КолвоРезерва, | ТабНом.Заказ КАК Заказ |ПОМЕСТИТЬ ТабРезерва |ИЗ | &Данные КАК ТабНом |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТабРезерва.НомерСтроки, | ТабРезерва.КолвоРезерва - СУММА(ЗаказПоставщикуТовары.Количество) КАК Разн, | ТабРезерва.НомРезерва |ИЗ | ТабРезерва КАК ТабРезерва | ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказПоставщику.Товары КАК ЗаказПоставщикуТовары | ПО ТабРезерва.НомРезерва = ЗаказПоставщикуТовары.Номенклатура | И ТабРезерва.Заказ = ЗаказПоставщикуТовары.Ссылка | |СГРУППИРОВАТЬ ПО | ТабРезерва.НомерСтроки, | ТабРезерва.КолвоРезерва, | ТабРезерва.НомРезерва"; Запрос.УстановитьПараметр("Данные", ТабНом); Рез = Запрос.Выполнить(); Если рез.Пустой() тогда //Сообщить("Ошибка в строке № "+СтрокаТЧ.НомерСтроки+". В указаном заказе отсутствует данная номенклатура"); //Отказ = Истина; Иначе Выборка = рез.Выбрать(); Пока выборка.Следующий() цикл Сообщить(""+Выборка.НомРезерва +" "+Выборка.Разн); КонецЦикла; КонецЕсли; Выборка.Разн возвращает НУЛЛ. Скажите, что не так? |
|||
27
Светлый Гений
14.08.12
✎
07:03
|
ЗаказПоставщикуТовары.Количество надо на Null проверять
|
|||
28
Светлый Гений
14.08.12
✎
07:03
|
у тебя ж там левое соединение
|
|||
29
Альбатрос
14.08.12
✎
07:07
|
(28) Ок, щас добавлю. Но! Он не связывается с соответствующим заказом, я что-то не то намудрил в условиях?
|
|||
30
Альбатрос
14.08.12
✎
07:29
|
Таки апну, укажите, пожалуйста на ошибку в запросе
|
|||
31
Альбатрос
14.08.12
✎
07:54
|
Вобщем, разобрался. Есть еще вопрос. Где и как использовать ВЫБОР в запросе, мне нужно завести какую-нибудь переменную в запросе и писать туда "найдено/не найдено" в зависимоти от значения Разн.
|
|||
32
ZloyProger
14.08.12
✎
07:59
|
Как-то так:
Выбор Когда ЕстьNULL(ТабРезерва.Разн, 0) = 0 Тогда "Не найдено" Иначе "Найдено" Конец Как КакаяНибудьПеременная |
|||
33
Альбатрос
14.08.12
✎
08:06
|
(32)А куда вставить это условие?
|
|||
34
Альбатрос
14.08.12
✎
08:11
|
(32) Спасибо, вроде работает
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |