![]() |
![]() |
![]() |
|
Как использовать внешниюю функцию в запросе? | ☑ | ||
---|---|---|---|---|
0
los_hooliganos
12.11.09
✎
17:06
|
Есть Функция Расход = Расход(Количество)
Нужно что-то вроде Функция Расход = Когда (условие) тогда Расход(Количество) когда (условие) тогда внешняяфункция() Реализуемо? |
|||
1
Cap_1977
12.11.09
✎
17:09
|
Реализуемо в блоке Условие(ВнешняяФункция() = 1)
|
|||
2
Ёпрст
гуру
12.11.09
✎
17:09
|
(0)в принципе да, но не для всех функций..
|
|||
3
Дядя Васька
12.11.09
✎
17:09
|
если в нее надо передать параметр из того что запрос вытягивает, то нет, а если всегда одно и то же вертает, ну дык "+ТвояФункция()+"
|
|||
5
also
12.11.09
✎
17:12
|
(0) Мож лучше прямой?
|
|||
6
los_hooliganos
12.11.09
✎
17:12
|
(2) можно пример?)
вообщем при определенном условии мне надо не просто расход, а хитро посчитанный прямым запросом. переписывать все на прямой лень)) |
|||
7
los_hooliganos
12.11.09
✎
17:13
|
(5) возможно и на прямой перепишу, но это дофига времени, а скорость пока не критична.
|
|||
8
also
12.11.09
✎
17:14
|
"вообщем при определенном условии"
(6) А условие озвучь |
|||
9
Дядя Васька
12.11.09
✎
17:14
|
(7) Вопрос привычки. Вообще-то они быстрее одинэсовских пишутся, бо гораздо логичнее...
|
|||
10
Ёпрст
гуру
12.11.09
✎
17:15
|
(6)
|Функция Расход = Расход(Количество); |Функция _Расход = Сумма(?(А=Б,Запрос.Расход,0)); |
|||
11
Ёпрст
гуру
12.11.09
✎
17:16
|
+10
|Функция Расход = Расход(Количество); |Функция _Расход = Сумма(?(А=Б,Запрос.Расход,ВнешняяФункция())); |
|||
12
also
12.11.09
✎
17:17
|
(+8) Я в том плане, что может можно тупо сделать:
Если Условие Тогда Текст = Текст + |Функция Чето = Расход (КтоТо); Иначе Текст = Текст + |Условие (ВнешняяФункция() = ПочемуТО); |
|||
13
los_hooliganos
12.11.09
✎
17:18
|
(8) а смысл?
когда одна из внутренних переменных запроса = 0 тогда просто расход, иначе хитрый запрос к левой базе. |
|||
14
los_hooliganos
12.11.09
✎
17:21
|
(9) дело не в привычке, я просто перерабатываю отчет и там 2000 строк кода которые обрабатывают результаты запроса и лезьт туда мне совершенно не хочеться.
|
|||
15
los_hooliganos
12.11.09
✎
17:22
|
(12) не.. не канает
|
|||
16
Ёпрст
гуру
12.11.09
✎
17:22
|
(15) что именно?
|
|||
17
los_hooliganos
12.11.09
✎
17:22
|
(10) спс, попробую.
|
|||
18
los_hooliganos
12.11.09
✎
17:25
|
(16) а так можно:
|Функция Расход = Сумма(?(А=Б,Расход(Количество),мояфункция())); |
|||
19
Ёпрст
гуру
12.11.09
✎
17:27
|
(18) неа..
Сумма тогда будет складывать столько раз - сколько считали другие функции в тексте запроса |
|||
20
Ёпрст
гуру
12.11.09
✎
17:28
|
+19 блин.. не о том подумал - так не будет работать вообще :)
|
|||
21
los_hooliganos
12.11.09
✎
17:29
|
(20) а это как тогда должно работать:
|Функция _Расход = Сумма(?(А=Б,Запрос.Расход,0)); ?? |
|||
22
los_hooliganos
12.11.09
✎
17:30
|
чую придеться ипошить прямой с ROLL UP`ом
ибо потом идет куча Пока Запрос.Группировка(х) |
|||
23
Ёпрст
гуру
12.11.09
✎
17:30
|
(21) а вот это будет работать норм.
|
|||
24
Ёпрст
гуру
12.11.09
✎
17:31
|
Ты проверь на малых данных, фильтрани по-условию и проверь.
|
|||
25
los_hooliganos
12.11.09
✎
17:31
|
(23) В самом запросе?
|
|||
26
Ёпрст
гуру
12.11.09
✎
17:32
|
(25) Да.. при условии, что Запрос = СоздатьОбъект("Запрос")..
|
|||
27
los_hooliganos
12.11.09
✎
17:33
|
(26)Даже и не знал про такое.
Спс... попробую. |
|||
28
Ёпрст
гуру
12.11.09
✎
17:33
|
Ну вот еще пример - эммулирование функции НачОст и КонОст в тексте запроса:
Работает медленнно, но верно :) Функция Ё(Док,Запрос) Если Док.ДатаДок<НачДата Тогда Возврат Запрос.Пр - Запрос.Рр; Иначе Возврат 0; КонецЕсли; КонецФункции //******************************************* Процедура Сформировать() ТекстЗапроса = " |Период с '01.01.80' По КонДата; |Док = Регистр.Покупатели.ТекущийДокумент,Регистр.Поставщики.ТекущийДокумент; |Сумма = Регистр.Покупатели.СуммаРуб,Регистр.Поставщики.СуммаРуб; |Контрагент = Регистр.Покупатели.Договор.Владелец,Регистр.Поставщики.Договор.Владелец; |Функция Пр = Приход(Сумма); |Функция Рр = Расход(Сумма); |Функция Приход = Приход(Сумма)Когда(Док.ДатаДок>=НачДата); |Функция Расход = Расход(Сумма)Когда(Док.ДатаДок>=НачДата); |Функция НачОст = Сумма(Сумма-Сумма+Ё(Док,Запрос)); |Функция КонОст = Сумма(Сумма-Сумма+Запрос.Пр-Запрос.Рр); |Группировка Контрагент Без Групп; |Условие (Контрагент в ВыбКонтрагент);"; Запрос = СоздатьОбъект("Запрос"); Запрос.Выполнить(ТекстЗапроса); Запрос.Выгрузить(ТЗ,0,0); КонецПроцедуры |
|||
29
los_hooliganos
12.11.09
✎
17:34
|
(28) за пример тоже спасибо)
|
|||
30
Ёпрст
гуру
12.11.09
✎
17:35
|
+28 Да , еще:
Не удивляйся потом,что функция сумма якобы "округляет" копейки - на самом деле это не так.. |
|||
31
Ёпрст
гуру
12.11.09
✎
17:38
|
+31 Просто функция сумма берет точность из переменной запроса - а при использовании Сумма(МояФункция()) - нет переменной=> неоткуда брать точность => точность результата =0 ("округляет")
Но это тоже "лечится" - введением "ложной" переменной в аргумент функции: >>>Функция НачОст = Сумма(Сумма-Сумма+Ё(Док,Запрос)); // тут ввели Сумма-Сумма - т.е нуль, зато из переменной Сумма = Регистр.Покупатели.СуммаРуб... - точность соответственно будет такой же, как и у переменной Сумма в тексте запроса. |
|||
32
los_hooliganos
12.11.09
✎
17:41
|
(31) ясно, ну завтра уже пробовать буду.
надеюсь все получиться и огромное спасибо)) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |