27.03.2002, 17:09 | #1 |
Участник
|
Отчеты
Допустим, что где то в отчете я должен вывести какую-либо вычисляемую величину. Например среднее по столбцу, или например среднее арифмитическое отклонение... Как это делается в Аксапте ?
Я создавал Control в отчете и устанавливал его свойство DataMethod. В DataMethod писал например return 10; - работает. А как в этом методе получить доступ ко всем значениям выводимым в отчете. И еще один вопрос - зачем нужны (и нужны ли) ProgrammableSection ? Спасибо. |
|
28.03.2002, 06:14 | #2 |
Участник
|
Привет!
Чтобы вывести некую агрегатную ф-цию, создай в DataSours'е отчета поле, равное нужной функции (учти, что при этом обычные поля исчезнут). Или так: можно в executeSection стандартного Body добавить код для подсчета необходимой функции, а в конце просто вывести переменную через display-метод. Программируемые секции - вещь исключительно нужная, как только ты захочешь сделать что-нибудь хоть чуть-чуть нестандартно
__________________
С уважением, Андрей Беседин |
|
28.03.2002, 09:24 | #3 |
Участник
|
Цитата:
Andrew Besedin
Чтобы вывести некую агрегатную ф-цию, создай в DataSours'е отчета поле, равное нужной функции (учти, что при этом обычные поля исчезнут). Цитата:
Или так: можно в executeSection стандартного Body добавить код для подсчета необходимой функции, а в конце просто вывести переменную через display-метод.
A B C 1 3 6 -1 4 7 0 6 5 1 3 4 1 5 3 И мне необходимо вывести еще один столбец, получаемый следующим образом: - если A>0 то (B+C) -если А<0 то (B-C) - если А=0, то выводим сумму ПО ВСЕМУ отчету разности (B-C) Чтобы решить эту задачу(для примера она у меня абстрактная и практически не нужная), я должен иметь доступ к каждой выводимой на экран записи. Какой метод мне необходимо для этого перекрыть и каким образом в этом методе получать значения выводимых полей ? Спасибо за ответы. |
|
28.03.2002, 10:11 | #4 |
сибиряк
|
пользуй простой real - control ссылающийся на dataMethod
а в нем : <pre> display Real myMethod() { ; if (myTable.A < 0) return myTable.B + myTable.C; else return myTable.B - myTable.C; ................ } </pre>
__________________
С уважением, Вячеслав. |
|
28.03.2002, 11:39 | #5 |
Участник
|
2Rem:
Цитата:
Изначально опубликовано Rem
- если А=0, то выводим сумму ПО ВСЕМУ отчету разности (B-C) Ну и конечно, приглядись к тому, что написал Слава(slava). В этом самом методе ты же можешь делать всевозможные селекты (если нужно "ПО ВСЕМУ")
__________________
С уважением, Андрей Беседин |
|
28.03.2002, 12:05 | #6 |
Участник
|
2slava:
Большое спасибо. Это именно то, что мне нужно было понять. Цитата:
Andrew Besedin
а вот с этого места поподробнее можно? Допиши столбец D - какими значениями он должен быть заполнен? 1 3 6 9 -1 4 7 -3 0 6 5 = (3-6)+(4-7)+(6-5)+(3-4)+(5-3) 1 3 4 7 1 5 3 8 То есть в данном случае я должен обращаться не к отдельным строкам отчета, а ко всему отчету сразу, так как значение должно быть подсчитано еще до вывода отчета на экран. Пробовал завести глобальную переменную и вычислять эту сумму в методе, но в данном случае эта переменная будет изменяться по мере "появления" строк отчета. Следовательно этот способ здесь не подходит. Можно конечно сделать SUM(B)-SUM(C) - это сработает в данном конкретном случае, но в следующий раз понадобится вычислять более сложное выражение и хотелось бы понять, как это делается в общем случае. |
|
28.03.2002, 12:23 | #7 |
сибиряк
|
вот как раз для конкретного случая и будет
<pre> display Real myMethod() { ; ................. if (myTable.A = 0) return (select sum(B) from myTable).B - (select sum(C) from myTable).C; ................ } </pre> А что ты подразумеваешь под общим случаем? Это просто будет другая частность или нет?
__________________
С уважением, Вячеслав. |
|
28.03.2002, 13:10 | #8 |
Участник
|
Да это как раз "общий случай", то есть я имел в виду тот случай, когда мы можем применить функцию sql, а общий - когда нет.
Ну например, если мне нужна не сумма разностей полей, а сумма разностей кубов полей (во усложнил то), то есть SUM(B*B*B)-SUM(C*C*C) - (B*B*B) - это я имею в виду для каждоой строки. То есть для первой строки вычисляем B*B*B-C*C*C, для второй, третей... и все это суммируем. А полученный результат и выводим когда myTable.A = 0. Понимая, что случай абсолютно не реальный, но хотелось бы разобраться. |
|
29.03.2002, 14:56 | #9 |
Участник
|
Помогите пожалуйста !!!!!!
Удалите пожалуйста это сообщение. Я ошибся.
|
|
29.03.2002, 14:57 | #10 |
Участник
|
Помогите пожалуйста !!!!!!
Создал еще один отчет, который выводит данные все из той же таблицы. Создал в этом отчете метод, пишу:
display Real myMethod() { ; ................. if (myTable. Аксапта ругается, нет мол такого поля в таблице. КАК НЕТ ?????? Да вот же оно. В чем дело ??? Стал сравнивать два отчета - все одно и тоже, все но С ОДНИМ ОТЛИЧИЕМ. Если в АОТ MyReport\DataSources\Query\Data Sources\myTable посмотреть на окошко свойств, а именно на свойство Table, то в работающем отчете оно серенькое и недоступное для изменения, а во втором отчете (том, что не работает) оно активно, да еще есть выпадающий список, позволяющий мне выбрать любую другую таблицу. Это из-за этого у меня не видна таблица в моем методе во втором отчете ??? А как мне поправить это дело ?? P.S. Сам метод у меня расположен в MyReport\Methods\myMethod. Это правильно ? Помогите пожалуйста. |
|
01.04.2002, 11:10 | #11 |
Участник
|
Странно. Пришел после выходных - все работает. Но ведь не работало же !!!
Не была видна эта переменная. В чем же дело ??? Никто не сталкивался с тем, что иногда переменная, которая должна быть видна, почему-то невидима ? |
|
01.04.2002, 11:22 | #12 |
сибиряк
|
Почитай здесь
http://www.axforum.info/forums/showt...E5%EB%EE%F7%E8
__________________
С уважением, Вячеслав. |
|
01.04.2002, 20:41 | #13 |
Участник
|
Цитата:
Изначально опубликовано Rem
Никто не сталкивался с тем, что иногда переменная, которая должна быть видна, почему-то невидима ? |
|
02.04.2002, 13:06 | #14 |
Участник
|
Цитата:
slava
Почитай здесь В продолжениt темы об отчетах. У меня есть форма, на ней две клавиши. При нажатии на них должен вызываться один и тот же отчет (созданный ранее с помощью АОТ), но с разными параметрами. То есть при нажатии на первую клавишу должны выводиться данные где поле А>10, при нажатии на другую - где А<10. 1. Как реализовать передачу параметров в отчет ? Можно ли это сделать с помощью АОТ и как это сделать с помощью кода ? 2. Как и главное где(в каком методе) принять этот параметр в отчете ? Спасибо всем за помощь. |
|
02.04.2002, 13:18 | #15 |
сибиряк
|
В АОТ создай 2 Menu Items. (Если хочешь вызывать отчеты, то пусть у них будет тип OutPut).
Пусть по ним вызывается твой отчет. В свойствах этих MenuItems (свойства Parameters) установи значение >10 , и в другом <10. Из кода значения Parameters меняются так: <b> MenuFunction _майМеню = new MenuFunction(menuItemDisplayStr(AA_testMenu),MenuItemType::OutPut);</b> На форме создай 2 MenuItemButton control. В свойстве MenuItemName укажи название твоих менюайтемов. Кликаем по ним... А в методе init() отчета (до супера()) анализируй что тебе приперлось из caller'a. <b>element.args().parm();</b> он вернет тебе параметры, которые передались в отчет из вызывающего объекта.
__________________
С уважением, Вячеслав. |
|
|
|