|
v7: Помогите чайнику по запросу | ☑ | ||
---|---|---|---|---|
0
Jeema
16.10.12
✎
04:21
|
Суть отчета, определение какой товар не продавался или продавалось менее заданного количества штук в заданный период.
У меня в таблице например если поставлю лог.выражение > 10, показывает только 10, а если >11 то только 11 товаров. Помогите плиз!!! Перем Запрос, ТекстЗапроса; //******************************************* Процедура Сформировать() //инициация таблицы Таблица = СоздатьОбъект("Таблица"); Таблица.ИсходнаяТаблица("Таблица"); Таблица.Опции(0,0,0,0); Таблица.ВывестиСекцию("Шапка"); НомСтроки = 0; //конец инициации //формирование запроса Запрос = СоздатьОбъект("Запрос"); ТекстЗапроса=" |ПЕРИОД С ДатаНачала По ДатаКонца; |Фирма = Регистр.ОстаткиНаСкладах.Склад.Фирма; |Склад = Регистр.ОстаткиНаСкладах.Склад; |Номенклатура = Регистр.ОстаткиНаСкладах.Товар; |Сумма = Регистр.ОстаткиНаСкладах.Сумма; |Количество = Регистр.ОстаткиНаСкладах.Количество; |ЦенаПрод = Регистр.ОстаткиНаСкладах.ЦенаПрод; |КодОперации = Регистр.ОстаткиНаСкладах.КодОперации; |"; //***************************************************************** ТекстЗапроса = ТекстЗапроса + " |Группировка Номенклатура без групп; группировка Количество;"; ТекстЗапроса = ТекстЗапроса + "Функция НачКоличество = НачОст(Количество);" "Функция ПрихКоличество = Приход(Количество);" "Функция РасхКоличество = Расход(Количество);" "Функция КонКоличество = КонОст(Количество);" "Условие (КодОперации<>Перечисление.КодыОпераций.Продажа);" ""; //******************************************************************** //******************************************************************** Если ВыбСклад.Выбран() = 1 Тогда ТекстЗапроса = ТекстЗапроса + "Условие (Склад = ВыбСклад);"; КонецЕсли; Если ВыбНом.Выбран() = 1 Тогда ТекстЗапроса = ТекстЗапроса + "Условие (Номенклатура = ВыбНом);"; КонецЕсли; Если ВыбФирма.Выбран() = 1 Тогда ТекстЗапроса = ТекстЗапроса + "Условие (Фирма = ВыбФирма);"; КонецЕсли; //***************************************************************************************** если колво>0 тогда если выбзнач.текущаястрока()=">" тогда ТекстЗапроса = ТекстЗапроса + "Условие(количество>колво);"; //оператор1 иначеесли выбзнач.текущаястрока()="<" тогда ТекстЗапроса = ТекстЗапроса + "Условие(количество<колво);"; //оператор2 иначе ТекстЗапроса = ТекстЗапроса + "Условие(количество=колво);"; //оператор3 КонецЕсли; конецесли; //************************************************************************************** //конец блока формирования запроса Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда сообщить("запрос упал!!!"); Возврат; КонецЕсли; //цикл обработки запроса //*********************************************************************** //*********************************************************************** СуммаВсегоПриход=0; НомСтроки=1; сообщить(текстзапроса); пока Запрос.группировка(1) = 1 цикл Если запрос.количество <> 0 тогда Ценаприход = запрос.сумма/запрос.количество; СуммаВсегоПриход=суммаВсегоПриход+Ценаприход; Таблица.ВывестиСекцию("Строка"); НомСтроки=НомСтроки+1; иначеЕсли Запрос.Количество = 0 Тогда сообщить("Товар "+ запрос.номенклатура +" количество равно нулю!!! примите меры!!!"); КонецЕсли; КонецЦикла; //*********************************************************************** //конец цикла обработки запроса Таблица.Защита(0); Если глПолучитьПолномочие("РазрешитьРедактироватьПечатнуюФорму") = 0 Тогда Таблица.Защита(1); КонецЕсли; Таблица.ВывестиСекцию("Строка"); Таблица.ВывестиСекцию("Всего"); Таблица.ВывестиСекцию("Подвал"); Таблица.Показать("Отчет неликвидный товар",""); КонецПроцедуры //****************************************************************************** Процедура ПриОткрытии() ВыбЗнач.добавитьзначение("<",); ВыбЗнач.добавитьзначение(">",); ВыбЗнач.добавитьзначение("=",); ВыбФирма = глЗначениеПоУмолчанию("Фирма"); ВыбСклад= глзначениеПоУмолчанию("Склад"); ДатаКонца = ПолучитьДатуТА(); ДатаНачала = НачМесяца(ПолучитьДатуТА()); КонецПроцедуры //Если Условие <> "< Не выбран >" Тогда // ТекстЗапроса = ТекстЗапроса + // "Условие ("+Условие+"ЗначениеУсловия);"; //КонецЕсли; Процедура тст() сообщить(выбзнач.текущаястрока()); конецпроцедуры Процедура выбзнач() сообщить(выбзнач.текущаястрока()); конецпроцедуры //****************************************************************************** //******************************************************************************** |
|||
3
Jeema
16.10.12
✎
05:11
|
помогите!!!)))
|
|||
4
maip1
16.10.12
✎
05:21
|
видимо, надо не выбзнач.текущаястрока() = ">", а выбзнач.получитьзначение(выбзнач.текущаястрока()) = ">", и т.д.
|
|||
5
Jeema
16.10.12
✎
05:45
|
щас проверю
|
|||
6
Jeema
16.10.12
✎
06:03
|
спасибо, ребята получилось)))
|
|||
7
Sserj
16.10.12
✎
06:30
|
Вообще то если речь о "Торговля И Склад", а судя по всему о ней, то намного правильней использовать регист "Продажи", это регистр оборотов и выполняться все будет на много быстрее.
|
|||
8
Jeema
16.10.12
✎
06:37
|
SSerj - верно, спасибо! Ну если что спрошу ;)
|
|||
9
Jeema
16.10.12
✎
06:43
|
SSerj - простите, а где его использовать? подскажите где ставить "использовать регист "Продажи", это регистр оборотов и выполняться все будет на много быстрее." в моем коде?
|
|||
10
Jeema
16.10.12
✎
08:47
|
Подскажите где ставить "использовать регист "Продажи", это регистр оборотов и выполняться все будет на много быстрее." в моем коде? Плииз!!!
|
|||
11
apl1978
16.10.12
✎
09:05
|
(10) вот здесь
|ПЕРИОД С ДатаНачала По ДатаКонца; |Фирма = Регистр.ОстаткиНаСкладах.Склад.Фирма; |Склад = Регистр.ОстаткиНаСкладах.Склад; |Номенклатура = Регистр.ОстаткиНаСкладах.Товар; |Сумма = Регистр.ОстаткиНаСкладах.Сумма; переписать все на регистр Продажи |
|||
12
dk
16.10.12
✎
09:13
|
в продажах нет остатков
КонОст |
|||
13
Jeema
16.10.12
✎
09:16
|
спасибо большое!
|
|||
14
apl1978
16.10.12
✎
09:17
|
(12) очевидно, для его задачи КонОст и не нужен
|
|||
15
Jeema
16.10.12
✎
09:26
|
хотя там стоит же |КодОперации = Регистр.ОстаткиНаСкладах.КодОперации; и походу будет конфликтовать
|
|||
16
apl1978
16.10.12
✎
09:29
|
(15) а ты весь запрос перепиши. посмотри, например, в типовом Анализе продаж как количество тянется из запроса. у регистров разного типа и фишки разные :)
|Количество = Регистр.Продажи.Количество; |Функция СуммаКоличество = Сумма(Количество); а потом эту СуммаКоличество и анализируй |
|||
17
apl1978
16.10.12
✎
09:32
|
(15) А кстати да. Я че-то вообще это условие в твоем запросе не понял:
"Условие (КодОперации<>Перечисление.КодыОпераций.Продажа);" то-есть ты берешь любое движение товаров кроме продажи? Тогда как это согласуется с " товар не продавался или продавалось менее заданного количества"? |
|||
18
viktor_vv
16.10.12
✎
09:32
|
Вот это условие в искодном запросе работает совсем не так, как ты думаешь.
"Условие(количество>колво);"; См. (16). |
|||
19
Jeema
16.10.12
✎
09:43
|
Тогда мне надо переименовать на "Условие (КодОперации<>Перечисление.КодыОпераций.ПЕРЕМЕЩЕНИЕ);" - ?
|
|||
20
Jeema
16.10.12
✎
09:50
|
Вот это условие в искодном запросе работает совсем не так, как ты думаешь.
"Условие(количество>колво);"; См. (16). - а как? |
|||
21
apl1978
16.10.12
✎
09:51
|
(19) зачем? оно просто тебе не будет нужно
просто перепиши все на Продажи. в регистре продаж содержатся движения по всем проданным товарам. ну, правда, еще по возвратам, но по ним не стоит пока заморачиваться. |
|||
22
viktor_vv
16.10.12
✎
10:01
|
(20) отбирает отдельные записи в регистре с количеством в движении удовлетворяющим условию. Так что в итоге в твоем запросе должна была получится полная фигня в функциях. На остатки это вроде не должно было повлиять, по крайней мере на начальные, но в оборотах точно фигня.
|
|||
23
viktor_vv
16.10.12
✎
10:03
|
И таки условие на результат функции не получится поставить в запросе, поэтому отбирай уже после, в обходе.
|
|||
24
Jeema
16.10.12
✎
10:08
|
походу вы не поняли... нужно так, чтоб табл. показывала остатки товара на складах не товары проданные, ну например, менее 10...или более 10, так же и товары проданные. А так код показывает весь ассортимент товаров в складе менее 10...или более 10 (по выбору лог.знака)
|
|||
25
Jeema
16.10.12
✎
10:09
|
хммм
|
|||
26
apl1978
16.10.12
✎
10:10
|
в (0) про остатки товара ни слова не написано. наоборот - написано про продажи
|
|||
27
sidalexsandr
16.10.12
✎
10:15
|
(0) Убери из группировка Количество;
Останется так |Группировка Номенклатура без групп;"; |
|||
28
viktor_vv
16.10.12
✎
10:15
|
Ты проверь свои результаты другим каким-нибудь отчетом, тупо выбрав из него руками подходящие под усоловие позиции.
|
|||
29
Jeema
16.10.12
✎
10:28
|
(0) Убери из группировка Количество;
Останется так |Группировка Номенклатура без групп;"; - уже убрал, тогда еще, сразу после выложения кода |
|||
30
Jeema
16.10.12
✎
10:30
|
щас так:
Перем Запрос, ТекстЗапроса; //******************************************* Процедура Сформировать() //инициация таблицы Таблица = СоздатьОбъект("Таблица"); Таблица.ИсходнаяТаблица("Таблица"); Таблица.Опции(0,0,0,0); Таблица.ВывестиСекцию("Шапка"); НомСтроки = 0; //конец инициации //формирование запроса Запрос = СоздатьОбъект("Запрос"); ТекстЗапроса=" |ПЕРИОД С ДатаНачала По ДатаКонца; |Фирма = Регистр.ОстаткиНаСкладах.Склад.Фирма; |Склад = Регистр.ОстаткиНаСкладах.Склад; |Номенклатура = Регистр.ОстаткиНаСкладах.Товар; |Сумма = Регистр.ОстаткиНаСкладах.Сумма; |Количество = Регистр.ОстаткиНаСкладах.Количество; |ЦенаПрод = Регистр.ОстаткиНаСкладах.ЦенаПрод; |КодОперации = Регистр.ОстаткиНаСкладах.КодОперации; |"; //***************************************************************** //***************************************************************** ТекстЗапроса = ТекстЗапроса + " |Группировка Номенклатура без групп;"; ТекстЗапроса = ТекстЗапроса + "Функция НачКоличество = НачОст(Количество);" "Функция ПрихКоличество = Приход(Количество);" "Функция РасхКоличество = Расход(Количество);" "Функция КонКоличество = КонОст(Количество);" "Условие (КодОперации<>Перечисление.КодыОпераций.Продажа);" "Условие (КодОперации<>Перечисление.КодыОпераций.Перемещение);" ""; //******************************************************************** //******************************************************************** Если ВыбСклад.Выбран() = 1 Тогда ТекстЗапроса = ТекстЗапроса + "Условие (Склад = ВыбСклад);"; КонецЕсли; Если ВыбНом.Выбран() = 1 Тогда ТекстЗапроса = ТекстЗапроса + "Условие (Номенклатура = ВыбНом);"; КонецЕсли; Если ВыбФирма.Выбран() = 1 Тогда ТекстЗапроса = ТекстЗапроса + "Условие (Фирма = ВыбФирма);"; КонецЕсли; //***************************************************************************************** Если колво>0 тогда если выбзнач.получитьзначение(выбзнач.текущаястрока()) = ">" тогда ТекстЗапроса = ТекстЗапроса + "Условие(количество>колво);"; //оператор1 Иначеесли выбзнач.получитьзначение(выбзнач.текущаястрока()) = "<" тогда ТекстЗапроса = ТекстЗапроса + "Условие(количество<колво);"; //оператор2 иначеесли выбзнач.получитьзначение(выбзнач.текущаястрока()) = "=" тогда ТекстЗапроса = ТекстЗапроса + "Условие(количество=колво);"; //оператор3 конецесли Конецесли; //************************************************************************************** //конец блока формирования запроса Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда сообщить("запрос упал!!!"); Возврат; КонецЕсли; //цикл обработки запроса //*********************************************************************** //*********************************************************************** СуммаВсегоПриход=0; НомСтроки=1; сообщить(текстзапроса); пока Запрос.группировка(1) = 1 цикл Если запрос.КонКоличество <> 0 тогда Ценаприход = запрос.сумма/запрос.конколичество; СуммаВсегоПриход=суммаВсегоПриход+Ценаприход; Таблица.ВывестиСекцию("Строка"); НомСтроки=НомСтроки+1; иначеЕсли Запрос.КонКоличество = 0 Тогда //сообщить("Товар "+ запрос.номенклатура +" количество равно нулю!!! примите меры!!!"); КонецЕсли; КонецЦикла; //*********************************************************************** //конец цикла обработки запроса Таблица.Защита(0); Если глПолучитьПолномочие("РазрешитьРедактироватьПечатнуюФорму") = 0 Тогда Таблица.Защита(1); КонецЕсли; Таблица.ВывестиСекцию("Строка"); Таблица.ВывестиСекцию("Всего"); Таблица.ВывестиСекцию("Подвал"); Таблица.Показать("Отчет неликвидный товар",""); КонецПроцедуры //****************************************************************************** Процедура ПриОткрытии() ВыбЗнач.добавитьзначение("<",); ВыбЗнач.добавитьзначение(">",); ВыбЗнач.добавитьзначение("=",); ВыбФирма = глЗначениеПоУмолчанию("Фирма"); ВыбСклад= глзначениеПоУмолчанию("Склад"); ДатаКонца = ПолучитьДатуТА(); ДатаНачала = НачМесяца(ПолучитьДатуТА()); КонецПроцедуры //Если Условие <> "< Не выбран >" Тогда // ТекстЗапроса = ТекстЗапроса + // "Условие ("+Условие+"ЗначениеУсловия);"; //КонецЕсли; Процедура тст() сообщить(выбзнач.текущаястрока()); конецпроцедуры Процедура выбзнач() сообщить(выбзнач.текущаястрока()); конецпроцедуры //****************************************************************************** //******************************************************************************** |
|||
31
sidalexsandr
16.10.12
✎
10:38
|
(0) Для того чтобы тебе было понятнее что какие данные получил запрос выгрузи весь запрос в таблицу значений. Дальше ты сможеш просмотреть все данные в запроса таблице значений и уже осмысленно выводить данные которые выбрал запрос.
Вот так можно выгрузить весь запрос в ТаблицуЗначений и просмотреть ТаблицуЗначений: ТЗ = СоздатьОбъект("ТаблицаЗначений"); Запрос.Выгрузить(ТЗ); ТЗ.ВыбратьСтроку(1); |
|||
32
Jeema
16.10.12
✎
10:45
|
ок
|
|||
33
Cthulhu
16.10.12
✎
11:59
|
Выкинь кусловия на к-во из запроса к едрене фене, анализируй и фильтруй при обработке результатов запроса.
(блин, ну что за какая-то необъяснимая тяга к запихиванию в запросы причудливых фильтров и внешних функций, ну не будет оно в итоге(!) обрабатываться быстрее, не-бу-дет!.. запрос должен отработать быстро и дать все необходимое в результате, чтобы потом в этом необходимом копаться как будда на душу положит и вытаскивать что душе угодно и как ей же угодно!.. упор на максимальную фильтрацию дает выигрыш по итоговым(!) скоростям только при использовании прямых запросов, да и то не всегда) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |