|
v7: Ещё раз запрос | ☑ | ||
---|---|---|---|---|
0
ВежливаяТварь
28.10.11
✎
11:04
|
Добрый день уважаемые форумчане. Есть запрос
Запрос=СоздатьОбъект ("Запрос"); ТекстЗапроса = "Период с Дата1 по Дата2; |СсылкаНаСчет=Регистр.РезервыТоваров.ПоСчету; |Товар =Регистр.РезервыТоваров.Товар; |Количество = Регистр.РезервыТоваров.РезервТовара; |Функция КолПриход = Приход(Количество); |Группировка Товар; |"; В этот запрос должны входить только счета у которых четвёртая буква в номере "А"(например:SIMA, FEDA, YALA). Можно ли это условие указать в запросе? И если можно то как? |
|||
1
ДенисЧ
28.10.11
✎
11:06
|
Функция МойНомер(док)
Возврат ?(Сред(док.НомерДок, 4, 1)="А", 1, 0); КонецФункции Условие(МойНомер(Запрос.СсылкаНаСчет)=1); Что-то вроде такого |
|||
2
ВежливаяТварь
28.10.11
✎
11:13
|
Спасибо.Попробую.
|
|||
3
ВежливаяТварь
28.10.11
✎
11:27
|
Заработало. Огромное спасибо.
|
|||
4
Злопчинский
28.10.11
✎
11:30
|
но такая функция, по идее, напрочь "убивает" запрос... ничем от простой выборки отличаться не будет...?
|
|||
5
viktor_vv
28.10.11
✎
11:45
|
По идее вот так должно тоже работать, и может быть даже быстрее, чем через функцию.
|СсылкаНаСчет=Регистр.РезервыТоваров.ПоСчету; |НомерСчета = Регистр.РезервыТоваров.ПоСчету.НомерДок; |Условие (Сред(НомерСчета, 4, 1)=""А""); |
|||
6
ДенисЧ
28.10.11
✎
11:46
|
(5) Да тоже самое...
|
|||
7
viktor_vv
28.10.11
✎
11:54
|
(6) Не проверял. Просто есть надежда, что при наложении условия номер не дергает из базы каждый раз, а берет из сырого результата запроса . Хотя до конца не понятно как вот это получает НомерСчета = Регистр.РезервыТоваров.ПоСчету.НомерДок; . Джойнит журнал в запросе или опять же постфактум дергает.
Ну это так, чисто порассуждать :). |
|||
8
Cthulhu
28.10.11
✎
11:55
|
перебором быстрее.
|
|||
9
Sh1ko
28.10.11
✎
12:22
|
Что быстро было, можно по счетам пробежаться, проставить какой-то реквизит, а в запросе условие по реквизиту.
|
|||
10
viktor_vv
28.10.11
✎
12:55
|
(7)+ Это я как-то слишком оптимистично :). Поглядел, согласен с (6), в профайлере там вообще мрак. Более того, если тип значения измерения ПоСчету документ общего вида, то (5) вообще не работает, ошибку не выдает, но НомерДок пустой получается.
|
|||
11
ВежливаяТварь
28.10.11
✎
16:47
|
Эщё один вопрос возник. Этот запрос вытаскивает и группирует все виды товаров и выводит товар и количество(СсылкаНаСчет не мешает группировке?). И как сделать так что бы запрос выдавал ещё и группировку по СсылкаНаСчет? можно дописать этот или лучше отдельный запрос?
|
|||
12
Sh1ko
28.10.11
✎
16:48
|
Лучше этот
|
|||
13
ДенисЧ
28.10.11
✎
16:48
|
(11) кто мешает сделать вторую группировку?
|
|||
14
ВежливаяТварь
28.10.11
✎
16:54
|
Попробовал выдаёт ошибку что нельзя обходить верхние группировки. А если одним запросом то У меня два одинаковых товара же не смогут сгруппироваться если у них разные ссылки на счет?
|
|||
15
viktor_vv
28.10.11
✎
16:55
|
Так ты как обходишь ?
|
|||
16
ДенисЧ
28.10.11
✎
16:56
|
Группировка Товар;
Группировка СсылкаНаСчет; И обходить Пока Запрос.Группировка("Товар") = 1 //здесь итоги по товару Пока Запрос.Группировка("ССылкаНаСчет") = 1 //здесь по товару и счету. КонецЦикла; КонецЦикла; |
|||
17
ВежливаяТварь
28.10.11
✎
17:02
|
А можно сделать так что бы сначала обойти вытащить все сгруппированные товары, а потом все сгруппированные ссылки на счет.
Глобальная задача у меня такая: Нужно за указанную дату обойти все счета, вытянуть только с четвертой буквой А и все товары которые в них находятся сгруппировать и поместить в одну расходную накладную. Потом все эти счета удалить Сделал так но работает криво: Запрос=СоздатьОбъект ("Запрос"); ТекстЗапроса = "Период с Дата1 по Дата2; |СсылкаНаСчет=Регистр.РезервыТоваров.ПоСчету; |Товар =Регистр.РезервыТоваров.Товар; |Количество = Регистр.РезервыТоваров.РезервТовара; |Функция КолПриход = Приход(Количество); |Условие(МойНомер(Запрос.СсылкаНаСчет)=1); |Группировка Товар; |"; .... Пока Запрос.Группировка("Товар")=1 Цикл Если Запрос.Товар.ЭтоГруппа()=0 Тогда ДокСчет.НоваяСтрока(); ДокСчет.Товар=Запрос.Товар; ДокСчет.Количество=Запрос.КолПриход; глПриИзмененииТовара(ДокСчет); КонецЕсли; КонецЦикла; ДокСчет.Записать(); ДокСчет.Провести(); ОткрытьФорму(ДокСчет.ТекущийДокумент()); Запрос.вНачалоВыборки(); Пока Запрос.Группировка()=1 Цикл Если ПустоеЗначение(Запрос.СсылкаНаСчет)=0 Тогда Сообщить (Запрос.СсылкаНаСчет); СсылкаНаДокумент=Запрос.СсылкаНаСчет; ДокСчет.НайтиДокумент(СсылкаНаДокумент); ДокСчет.ПравоНаУдаление=1; ДокСчет.Записать(); ДокСчет.Удалить(0); КонецЕсли; КонецЦикла; |
|||
18
ДенисЧ
28.10.11
✎
17:04
|
ТОгда группируй в обратном порядке. Сначала счета, потом товары.
|
|||
19
FN
28.10.11
✎
17:07
|
(17) сначала сделай запрос к докам - результат загони в список
потом второй запрос к строкам доков (условие по списку из первого запроса) с группировкой товар и функциями Кол-во, Сумма и тп. |
|||
20
ВежливаяТварь
28.10.11
✎
17:09
|
Ага понял. Спасибо. Сейчас попробую.
|
|||
21
FN
28.10.11
✎
17:11
|
(19)+ хотя первый запрос наверное лучше заменить на обычную выборку - быстрее должно быть.
|
|||
22
FN
28.10.11
✎
17:15
|
(20) и на будущее - не стоит кодировать в номере док-та информацию, по которой потом нужны отборы. Лучше отдельным реквизитом.
|
|||
23
ВежливаяТварь
28.10.11
✎
17:18
|
Спасибо. Учту.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |