Make your own free website on Tripod.com

Account 2000 = Бухгалтерия + Тoрговля+ Кадры + SQL Server
Account 2000 поддерживает конфигурации 1С: Бухгалтерии
Стоимость с внедрением около $1000-$2000

1C:TOP-100

 

Введение Конструктор отчетов Account

Введение

Account 2000 это программа бухгалтерского и финансового учета (склад, платежи и т.д.), которая совместима с 1С: Бухгалтерией. Программа выполнена на базе Microsoft SQL, производительная система проводок на 20 уровней аналитики реализована в хранимых процедурах на Transact SQL, так же вы можете использовать прямые SQL-запросы для составления отчетов. Макроязык Account совместим сверху вниз с 1С: Бухгалтерией, программа также позволяет подключать созданные для 1С настройки. Вдобавок Account содержит много новых команд и функций, необходимых для корпоративных пользователей, в частности Account поддерживает возможность организации секретности создания кросс-отчетов, позволяет иметь раздельные планы счетов для разных юрлиц и др. При большом богатстве различных функций, программа использует очень лаконичный макроязык. Обычно, даже довольно сложные скрипты редко содержат больше 100 строк программы. В основном время тратится на разработку учетной политики, а не на программирование.

Account имеет систему интеграции со складскими программами. Account прозрачно для пользователя может использовать документы и аналитические справочники оперативного контура вашей складской программы. Следует отметить, что в Account реализован полнофункциональный склад, чаще всего интеграция полезна при постепенном переходе со старой программы. Account поддерживает механизм секретности и разделения привилегий по ролям пользователей.

Новинки 2000 года

Судя по заявлениям клиентов,  программа Account 2000 благополучно пережила проблему 2000г. 

К концу  2000г программа получила следующие функции:

Скорость и надежность

Как отмечалось, ядро Account 2000 реализовано в хранимых процедурах MS SQL. Это позволяет достигнуть очень высокой скорости проводок. При 50000 аналитических разрезов в сальдовой таблице (каждый разрез на 20 уровней) скорость выполнения всех   проводок к документу, требующих изменения 1000 записей в сальдо, составляет 1-2 сек. Эта цифра приведена для накладной в 10-20 позиций, для накладной в 60-100 позиций время выполнения   проводок будет около 2-3 сек. Эти цифры соответствуют правильно сконфигурированному серверу MS SQL с P200 и 120M памяти. При увеличении мощности сервера обычно скорость линейно возрастает. Проводки формируются в транзакциях, поэтому в случае сбоя оборудования в момент работы пользователей MS SQL должен автоматически откатить незаконченные операции и восстановить БД.

Интерпретатор скриптов Account 2000 имеет встроенный компилятор П-кода. Скомпилированный код, представляет собой массив указателей на функции-исполнители команд, что позволяет достигнуть высокой скорости интерпретации. Впервые такая технология была применена в FoxPro. Она оказалась настолько эффективной, что FoxPro иногда обгонял по скорости компиляторы в код процессора. Тестовый  пример для Account ниже выполняется за 5 сек на Celeron-450. Таким образом, чистая скорость интерпретации Account 2000 достигает 20.000-30.000 строк скрипта в секунду. При этом скорость компиляции среднего скрипта обычно не превышает 0,5-1 сек.

!п1=1
!ЦИКЛ п1<100000
!п1=п1+1
!ВОЗВРАТ

Однако следует учесть, что скорость  манипуляций программы с БД ограничена возможностями MS SQL. Тем не менее, и эта скорость очень высока. Тестовый пример ниже демонстрирует алгоритм формирования отчета, выводящего список всех объектов БД (в нашем примере 6000 строк). Пример выполнился за 2 сек на Celeron-450. Таким образом, скорость обращения к БД у Account 2000 достигает 3000 команд в секунду. Примерно такую же скорость выборки данных показывает Microsoft SQL Query Tool прямо на сервере.

!п1="select UDN as КОД, Name as НАЗВАНИЕ, No as НО from Docs order by UDN"
!выбрать ряд п1
[пКОД] [пНазвание] [пНО]
!следующий ряд

Следует отметить, что пользователь может управлять всеми возможностями MS SQL для повышения скорости и надежности в многопользовательском режиме (создавать новые индексы, управлять блокировками и т.д.). Также Account 2000 позволяет вызывать хранимые процедуры для создания отчетов, а также использовать серию команд на Transact-SQL для этих нужд.

Разработчики продолжают работы по оптимизации программы. Жизнь коротка, не тратьте ее в ожидании ответа программы.

Подневный учет без расчетов и замедления

Помимо 5 уровней аналитики, Account 2000 поддерживает подневный учет в реальном времени. Иными словами вы можете установить рабочий период в виде интервала двух любых дат без расчета итогов. Данные по проводкам и сальдо  рассчитываются сразу при проведении документов. Поэтому команда !ВРЕМЕННЫЙ РАССЧЕТ срабатывает мгновенно, т.к. на самом деле ничего не рассчитывает, а только переключает интервал дат для команд СКК, СКД  и др.

Макрокоманда формирования проводок (5 уровней аналитики)

Для формирования проводок служит следующая макрокоманда:

!ПРОВОДКА дат, счд, счк, сум, текст, сд1, ск1, кол, вал, сумвал, жур, сд2, ск2, сд3, ск3, сд4, ск4, сд5, ск5

Где дат – дата проводки, счд – счет дебета, счк – счет кредита, сум – сумма проводки, текст – текст проводки, сд1 – субконто дебета 1 уровня, ск1 - субконто кредита 1 уровня, кол – количество, вал – валюта проводки, сумвал – сумма в валюте, жур – журнал операций, сд2 – субконто дебета 2 уровня, ск2 - субконто кредита 2 уровня, сд3 – субконто дебета 3 уровня, ск3 - субконто кредита 3 уровня, сд4 – субконто дебета 4 уровня, ск4 - субконто кредита 4 уровня, сд5 – субконто дебета 5 уровня, ск5 - субконто кредита 5 уровня.

Макрокоманды выборки сальдовой информации (5 уровней аналитики)

Для выборки сальдовой и оборотной информации за установленный период расчетов итогов используются следующие макрокоманды:

СНДсч[:[c1][:[c2][:[c3][:[c4][:[c5]]]]]][~вал[^B]][Н] – сальдо на начало периода дебетовое;

СНКсч[:[c1][:[c2][:[c3][:[c4][:[c5]]]]]][~вал[^B]][Н] – сальдо на начало периода кредитовое;

СКДсч[:[c1][:[c2][:[c3][:[c4][:[c5]]]]]][~вал[^B]][Н] – сальдо на конец периода дебетовое;

СККсч[:[c1][:[c2][:[c3][:[c4][:[c5]]]]]][~вал[^B]][Н] – сальдо на конец периода кредитовое;

ДОсч[:[c1][:[c2][:[c3][:[c4][:[c5]]]]]][~вал[^B]][Н] – дебетовый оборот за период;

КОсч[:[c1][:[c2][:[c3][:[c4][:[c5]]]]]][~вал[^B]][Н] – кредитовый оборот за период;

ОБсч1:сч2 – Обороты за период в дебет счета сч1 с кредита счета сч2.

Где сч – счет или субсчет, для которого будут выдаваться результаты, с1, с2, с3, с4 и с5 – субконто, соответственно, на 1 уровне аналитики, на 2 уровне аналитики, на 3 уровне аналитики, на 4 уровне аналитики и на 5 уровне аналитики для счета сч.

Последняя часть макрокоманд ~вал^B служит для валютного учета. Если Вы хотите получить информацию в рублевом эквиваленте для валюты вал, тогда добавьте конструкцию ~вал к макрокоманде. Если Вы хотите получить данные в валюте вал, добавьте конструкцию ~вал^B.

Если Вы хотите получить результаты по счету в целом, вы можете опустить часть с аналитиками. Если Вы хотите пропустить какую-либо аналитику, нужно пропускать ввод субконто, но оставлять двоеточия. Например, СНД41:&1::&3.

Чтобы получить информацию в натуральном выражении (количество) нужно добавить в конце макрокоманды букву “Н”. Например, СНД41:&1::&3Н.

Для получения развернутого сальдо по субконто по счету нужно ставить только двоеточие из всей конструкции для аналитик после счета. Например, СНД41:.

Для получения развернутого сальдо по всем субсчетам счета нужно счет указывать с точкой на конце. Например, СНД41.:&1::&3Н.

 

Макрокоманды обработки субконто (5 уровней аналитики)

Для обработки субконто служит следующая конструкция:

!ВЫБРАТЬ СУБКОНТО ВИД {n, сч~m} [;k] ВСЕ

[команды на макроязыке]

[!ВЫБРАТЬ СУБКОНТО ВИД {n1, сч1~m1} ;k1 ВСЕ

команды на макроязыке

!СЛЕДУЮЩИЙ СУБКОНТО]

команды на макроязыке

!СЛЕДУЮЩИЙ СУБКОНТО

n, n1 – номер субконто (он задается в настройках субконто в меню "Администратор"),

сч, сч1 – счет (сч и сч1 могут совпадать), m, m1 – номер аналитики (m и m1 могут совпадать),

k, k1 – псевдоним для цикла.

Эта конструкция может быть вложенной.

В случае конструкции, где указывается только номер субконто, это будет просто цикл по всем субконто вида n. Для каждого субконто вида n по очереди выполняются команды, которые указаны в теле цикла. Если Вы не используете вложенной конструкции, то можно не указывать псевдоним. В таком случае, макрокоманда & возвращает указатель на текущее субконто. Если используете, тогда указание псевдонима обязательно. В этом случае для получения указателя на текущее субконто в цикле, где указан псевдоним k, нужно использовать макрокоманду &~k. При такой конструкции перебираются все субконто, даже те, которые никогда не использовались в проводках.

Лучше, по возможности, всегда использовать конструкцию с указанием счета - сч и номера аналитики - m. В такой конструкции перебираются только те субконто, которые фигурировали в проводках с данным счетом в аналитике номер m. Эта конструкция в большинстве случаев работает намного быстрее, чем предыдущая. Для получения указателей на текущие субконто нужно использовать те же макрокоманды, что и в предыдущем варианте.

Продемонстрирую использование этой конструкции на следующем примере. Пусть у Вас настроен план счетов следующим образом:

Счет

1 Аналитика

2 Аналитика

3 Аналитика

41

Товар

Склад

Партия

Если Вы хотите получить отчет по остаткам товара на складах товара одновременно в разрезе всех трех аналитик (товара, склада и партии), Вам нужно будет написать следующий модуль:

!ВЫБРАТЬ СУБКОНТО ВИД "41~1"; "1" ВСЕ

!ВЫБРАТЬ СУБКОНТО ВИД "41~2"; "2" ВСЕ

!ВЫБРАТЬ СУБКОНТО ВИД "41~3"; "3" ВСЕ

!п1=СКД41:&1:&2:&3Н

!СООБЩИТЬ "Товар -"+СН&1+", Склад -"+СН&2+", Партия - "+СН&3+", Остаток"+п1

!СЛЕДУЮЩИЙ СУБКОНТО

!СЛЕДУЮЩИЙ СУБКОНТО

!СЛЕДУЮЩИЙ СУБКОНТО

В этом модуле перебираются поочередно все товары, склады и партии, которые фигурировали в проводках по 41 счету и для каждой такой комбинации выводится сообщение: "Товар – наименование товара, Склад – наименование склада, Партия – наименование партии, Остаток – количество, оставшееся от партии на складе товара".

В данном примере Вы наверняка заметили новую, пока еще не описанную, макрокоманду – СН. Она относится к группе макрокоманд, с помощью которых можно получать дополнительные сведения о субконто. Кроме макрокоманды СН, к этой группе относятся макрокоманды СП и СЦ.

Макрокоманда СН{n:m,&k} возвращает наименование субконто с кодом n:m, или наименование субконто, которое в данный момент текущее в цикле с псевдонимом k.

Макрокоманда СЦ{n:m,&k} возвращает наименование субконто с кодом n:m, или наименование субконто, которое в данный момент текущее в цикле с псевдонимом k.

Макрокоманда СП{n:m,&k}.i возвращает параметр номер i субконто с кодом n:m, или субконто, которое в данный момент текущее в цикле с псевдонимом k.

Макрокоманды для SQL-запросов к данным. (Настоящая эффективность настоящего SQL. Отладчик.)

Account 2000 является открытой даже на системном уровне. Таблицы данных программы описаны (описание модели хранения объектов, описание таблиц проводок и сальдо) и вы можете строить SQL-запросы к ним из пользовательского генератора форм программы.

Рассмотрим простейший SQL-запрос. Отчет выводящий список платежных документов за указанный период.

Поясним на примере как строится отчет по платежным документам. До того как вы приступите к данному примеру, вам необходима рабочая станция где установлен клиент Account и Microsoft SQL Enterprise Manager (далее Enterprise).

Составление SQL-запроса в Microsoft SQL Enterprise Manager

  1. Запустите Enterprise. Вызовите SQL Query Tool (кнопка с вопросиком). Выберите базу в поле DB. Теперь все готово для разработки SQL-запросов для отчетов.
  2. Наберите под закладкой Query команду select * from sPays. Данная команда означает "выбрать все данные из таблицы sPays".
  3. Нажмите Ctrl+E для запуска команды. Вы автоматически попадете на закладку Results где вы можете видеть результат запроса (см. рис) выводящий список всех платежных документов. Если вы видете надпись "(0 row(s) affected)", то это значит что у вас нет введенных платежных документов.
  4. Просмотрите результат запроса на предмет какие колонки могут представлять интерес как данные, а на какие следует наложить условия. В нашем примере интерес представляют колонки Name (название документа), No (номер документа), SummTotal (общая сумма по документу), Date (дата документа).
  5. Построим запрос выбирающий дату, название, номер и сумму документа. Наберите на закладке Query и выполните запрос select Date, Name, No,SummTotal from sPays. Как можно видеть он вывел только указанные колонки.
  6. Можно заметить что данные выводятся не упорядоченно, а нам бы хотелось чтобы они были отсортированы по датам. Для этого набрите и выполните запрос select Date, Name, No,SummTotal from sPays order by Date.
  7. Теперь нам необходимо вывести не все записи, а только записи за указнный промежуток дат. Например, от 1 января 1999г. до 31 августа 1999г включительно. Для этого наберите и выволните запрос
    select Date as ДАТА, Name as НАЗВАНИЕ, No as НОМЕР,SummTotal as СУММА from sPays
    where Date>='1.1.99' and Date<='8.31.99'
    order by Date
    Обратите внимание, что дата пишется в американском формате месяц-день-год, а не в русском день-месяц-год. Ключевое слово "as" позволяет дать русское название колонке полученного результата. На закладке Results мы видим готовые данные отчета, этап разработки SQL-запроса завершен. Нужно теперь создать для данных печатную форму.
  8.  

    Создание формы и программы для обслуживания SQL-запроса

    FORMPAYS4.gif (16609 bytes)

  9. Запустите Account. Создайте отчет "Список платежных документов".
  10. В появившемся окне "Структура отчета" нажмите кнопку "Скопировать". Выберите отчет "Интервал дат". На предупреждение "Текущая структура полей будет удалена. Продолжить?" нажмите кнопку "Yes". В результате программа скопирует структуру полей из отчета "Интервал дат". Применяйте это прием тогда, когда разрабатываете отчеты с похожими параметрами.
  11. Нажмите кнопку "Форма". Из прямоугольников текста и секций составте форму отчета как изображено на рис. Обратите внимание, что полосы-разделители должны точно находится на границах прямоугольников с текстом. Команда Е0 в [пНомер Е0] служит для того чтобы номера документов, которые представлены цифрами отображались без двух нулей как для денежного формата. Если E0 убрать, то "1" напечается как "1.00".
  1. Полосы разделители содержат в себе следующие команды.
    Самая верхняя полоса.
    !п1=""+ЗН1
    !п2=""+ЗН2
    Что это означает мы уже разбирали.
    Средняя полоса.
    !п10="
    select Date as ДАТА, Name as НАЗВАНИЕ, No as НОМЕР,SummTotal as СУММА
    from sPays
    where Date>='"+ДАТАСЕРВ(п1)+"' and Date<='" +ДАТАСЕРВ(п2)+"'
    order by Date"
    !выбрать ряд п10
    Первая команда заносит в переменную п10 запрос на языке SQL, который мы составили выше. При этом начальные и конечные даты подставляются из переменных п1 и п2. Для перекодировки даты из русского формата в американский используется функция ДАТАСЕРВ. Обратите внимание на то, что рядом с двойными кавычками присутствуют одинарные. Вторая команда начинает цикл выборки результата запроса, который содержится в переменной п10. Очередная полученная строка запроса автоматически заносится в переменные одноименные колонкам запроса. Например, колонка ДАТА заносится в переменную пДата. Названия колонок в запросе должны быть только из ЗАГЛАВНЫХ русских букв.
    Нижняя полоса
    !следующий ряд
    Данная команда закрывает цикл выборки результата запроса, если запрос еще не кончился (есть еще строки), то по данной команде осуществляется переход к "!выбрать ряд" и повторение снова. Между командами "!выбрать ряд" и "следующий ряд" находится ряд прямоугольников с текстом, которые выводят значения очередного ряда запроса. В цикле они многократно повторяются и добавляются в отчет, пока цикл не кончится.
  2. Постройте данный отчет.
  3. Использование отладчика

  4. Для того чтобы лучше разобраться как работает построенный отчет, а также для удаления возможных ошибок воспользуемся отладчиком макроязыка. Для его запуска войдите в меню "Система" и вызовите пункт "Отладчик макроязыка". Появится отладчик.
  5. Наберите в окне "Исходный тект" программу аналогичную только что составленному нами отчету:
  6. !п1="1.1.99"
    !п2="31.8.99"
    !п10="
    select Date as ДАТА, Name as НАЗВАНИЕ, No as НОМЕР,SummTotal as СУММА
    from sPays
    where Date>='"+ДАТАСЕРВ(п1)+"' and Date<='" +ДАТАСЕРВ(п2)+"'
    order by Date"
    !выбрать ряд п10
    [пДата] [пНазвание] [пНомер E0] [пСумма]
    !следующий ряд

    Отладчик удобен для отработки различных конструкций макроязыка без создания печатных форм

  7. Нажмите кнопку "Скомпилировать", если программа не содержит синтаксических ошибок, то результат ее компиляции появится на закладке "Результат компиляции (п-код)". Информация на данной закладке служит для специалистов. Обычный пользователь может использовать кнопку скомпилировать чтобы убедится что в его программе нет синтаксических ошибок.
  8. Нажмите кнопку "выполнить". Если программа не содержит логических и синтаксических ошибок, то она успешно завершится. На закладке "Результат (отчеты)" вы может увидеть что печаталось из переменных с помощью квадратных скобок. В окне "Переменные и сообщения" можно увидеть значения переменных после окончания выполнения программы. В окне "Трассировка работы" можно увидеть как строка за строкой выполнялась программа, какие значения присваивались переменным, что печаталось. Используйте анализ трассировки для выявления логических ошибок в программе. Следует отметить важный момент. После выполнения отчета, его общая программа оказывается в отладчике, а трассировка отражает ход составления отчета. Используйте анализ трассировки сразу после выполнения отчета для выявления логических ошибок в отчете.

Подробнее об использовании отладчика см. тут.

Отчеты с формами запросов

FORM.gif (7975 bytes)

Account 2000 позволяет иметь форму запроса параметров для отчетов, а не пользоваться серией команд !ВВЕСТИ. Кроме того, программа позволяет администрировать доступ пользователей к отчетам (пользователь просто не видит в списке отчет на который у него нет прав).   На рис. приведена форма запроса параметров для отчета "Приход товара по приемным актам" в режиме разработки.

Вдобавок у программы есть специальный ключ запуска, который позволяет сразу попасть в список отчетов, это облегчает работу тем, кто пользуется программой только для просмотра отчетности. Этот вариант особенно удобен тем, кто формирует проводки из оперативного контура Ultima-S, а произвольные отчеты строит в Account 2000 (Ultima-S и Account 2000 совместимы по базе данных)

Макрокоманды для составления кросс-отчетов и организации массивов

CROSS.gif (16030 bytes)

Account содержит ряд новых команд, которые позволяют строить отчеты принципиального нового типа, это кросс-отчеты. В кросс-отчетах, применяется вертикальная группировка аналитики. На рис. приведен такой отчет, с боку указаны отдельные накладные, а сверху товары из них. Обратите внимание, что все колонки кросс-отчета в общем случае не помещаются на одном листе, поэтому отчет может "расти" при увеличении количества данных не только в длину, но и в ширину.

Среди новых команд обслуживающих кросс-отчеты, есть команды позволяющие из ряда переменных использовать как массив. В начале статьи приведен рис. на котором виден процесс разработки приведенного отчета. Следует заметить, что переменные п1-п7, пп1-пп7 и пт1-пт7 образуют три массива. Приведем примеры команд.

!ОЧИСТИТЬ 1;пколон;"Т"    -     Данная команда очищает массив переменных пт1-пт7

!ППП ПКол; П_КОЛИЧЕСТВО     -     Данная команда заносит значение П_КОЛИЧЕСТВО в переменную п1-п7 в зависимости от значения переменной ПКол, заодно увеличивается парная переменная-счетчик пп1-пп7 для итогов.

Макрокоманды для шапок и нижнего поля отчетов

Те, кто составлял ранее отчеты в 1С 6.0 и Account знают, как было сложно сделать шапку с названиями (большая шапка) или номерами колонок (малая шапка) над таблицей. Дело в том, что нужно выводить шапку заново на каждой новой странице отчета. Обычно это делал замысловатый алгоритм с подсчетом строк, в случае сложной группированной таблицы, требовалось потратить несколько часов на его разработку. Новая версия Account 2000 включает команды ШАПКА, ШАПКА2, КОНЕЦШАПКИ. Всего 3  командами можно описать большую и малую шапку таблицы. Программа автоматически определяет, что достигнут конец страницы, и автоматически находит изображение шапки. Программа также автоматически нумерует страницы в специальной переменной пСтр_Но.

В программу добавлена возможность организовывать печать на нижнем поле страницы (page footer, "футер страницы", низ страницы). Например, внизу страницы выводить ее номер. Для организации "футеров" имеются команды НИЗ, КОНЕЦНИЗА.
Также добавлена возможность "склеить" малую и большую шапку на при печати большой шапки. Это удобно вывода номеров столбцов в отчете, которые обычно делают в малой шапке. Для этого достаточно указать !ШАПКА ВМЕСТЕ

Отладчик макроязыка (пошаговый режим, просмотр переменных, точки остановки)

DEBUG2.gif (20154 bytes)

В программу встроен отладчик полноценный отладчик макроязыка (см. рис выше) со следующими возможностями.

Процедуры и макросы

Для разработки сложных отчетов требуются продвинутые средства структурирования алгоритмов, такие как процедуры и макросы. Следует отметить, что задача разработки сложной финансовой отчетности имеет свою специфику. Это четкое разделение алгоритма отчета  на две составляющих: логику выборки данных (Data logic) и логику отображения данных в форме отчета (Presentative logic).

Логика данных. Хранимые процедуры.

Для манипуляции с логикой данных оптимальным является язык SQL (Transact SQL). Если логика данных сложна, то рекомендуется использовать хранимые процедуры на Transact SQL для ее формирования. Использование макроязыка на манер 1С (ВЫБРАТЬ ОПЕРАЦИИ, СКД, СКК...) является нежелательным для выборки данных в сложных отчетах. Ориентированные на SQL отчеты работают в 10-15 раз быстрее, значительно быстрее разрабатываются, легче модифицируются и поддерживаются. Однако макроязык удобен для организации логики отображения данных в отчете (см. ниже).

Приведем пример использования хранимой процедуры в Account 2000 из рабочего отчета "Состояние склада" (остатки, резервирование, себестоимость по группам и подгруппам товаров).

!пзап="
exec UpdateGroups  -- Вызов хранимой процедуры
select  -- Запрос, использующий результаты подготовленные в хранимой процедуре
D1.Name as ГР1, D2.Name as ГР2, D3.Name as ГР3, D.Name as ТОВАР, D.No as НО, E2.StringValue as КОДПР,
u2 as КОДТОВАРА, Sum(sct-sdt) as СУММА, sum(ict-idt) as КОЛ, (select sum(ResCount) from Reserve where GoodUDN=*u2)as РЕЗЕРВ
from Saldo S, Groups G, Docs D, Docs D1, Docs D2, Docs D3, ExtValue E, ExtValue E2
where S.UDN=(select max(UDN) from Docs where No='У41' and Class='BookAcc')
and u1=(select max(u1) from Saldo where u1<="+ИндСерв(П_Дата)+" and idp=S.idp)     and (sct>0 or sdt>0 or ict>0 or idt>0)
and D.UDN=u2 and u2=E2.UDN and E2.ExtName='ProductionCode' and G.UDN=u2 and D1.UDN=*GR1 and D2.UDN=*GR2 and D3.UDN=*GR3
group by D1.Name, D2.Name, D3.Name, D.Name, D.No, E2.StringValue, u2
"

!выбрать ряд пзап
...
!следующий ряд

Также следует отметить, что используя хранимые процедуры можно применять элементы технологии Data Warehouse ("Склад данных"). Иными словами, можно в хранимых процедурах подготавливать в неких таблицах сырьевые данные ("склады данных") для целых групп сложных отчетов. Например, процедура UpdateGroups подготавливает данные о добавочных группировках товаров в таблице Groups, которая может быть задействована сразу в нескольких отчетах.

Логика отображения. Макросы

Логика отображения данных в формах имеет специфическую особенность, она часто плохо структурируется. Поэтому для логики отображения часто более удобны макросы, а не процедуры. Account 2000 поддерживает возможность организации макросов и библиотек макросов. Account 2000 допускает определение макросов со следующими возможностями:

  1. вложенные макросы
  2. многострочные макросы
  3. раздельные файлы макросов (тестируется)
  4. макрос как текстовой файл
  5. отладчик скриптов способен отлаживать макросы

Глобальные макросы содержатся в файле Account.mac. Рассмотрим примеры макросов.

_СЧЕТ=  !Псчет=Псчет+1

Если в программу вставить вызов _СЧЕТ, то на его место подставится выражение !Псчет=Псчет+1
Обратите внимание, что название макросов чувствительно к регистру.

Другой пример (многострочный макрос). Обратите внимание, что текст многострочного макроса ограничен ={ и }. Причем замыкающая скобка должна быть одна в строке.

_СБРОС_ПЕРЕМЕННЫХ2={
!ПП_Дох=0
!ППСум=
!ППСум2=
!ППСумДол=
}

Прямой вызов SQL-команд

В программе имеется возможность для прямого вызова SQL-команд. Программист-настройщик может использовать операторы insert/update/delete/exec. На первый взгляд это кажется ненужным для разработки отчетов, т.к. вроде бы достаточно одного select. Однако это не так, сложные алгоритмы трудно и даже часто невозможно построить  в виде одного select-запроса. Кроме того, черезмерно громоздкие SQL-выражения медленно выполняются. Часто более эффективное решение, это создание "складов данных" (Dataware house). Их можно создавать в хранимых процедурах (как то описано выше). Однако во многих случаях более удобно избежать создания хранимых процедур, а просто выполнить серию SQL-операторов.   В этом случае несколько снижается быстродействие, но программист используя программу SQL Trace может наблюдать за результатом каждой команды, т.е. отладка значительно упрощается.

Приведем примеры вызова SQL-команд.

!выполнить "exec UpdateGroups  -- Выполняем хранимую процедуру"

!выполнить " delete OP3Totals where u=@@spid  -- Чистим наш Data Warehouse
insert OP3Totals(u,Region, Grp, PDoc, DFee, Cs, Ci,Cv,C2s, C2v) -- Заполняем наш Data Warehouse
select @@spid, E.IntValue, E2.IntValue, P.Doc, sum(DeliverFee), sum(C.s), sum(C.i), sum(C.v),
(select sum(C2.s) from Pass P2, Complect C2, ExtValue E3 where P2.Processed=1 and P2.AccId=905 and C2.UDN=P2.UDN and P2.Acc1=P.Acc2 and C2.u2=E3.UDN and E3.ExtName='Group' and P2.Doc=P.Doc and E2.IntValue=E3.IntValue),
(select sum(C2.v) from Pass P2, Complect C2, ExtValue E3 where P2.Processed=1 and P2.AccId=905 and C2.UDN=P2.UDN and P2.Acc1=P.Acc2 and C2.u2=E3.UDN and E3.ExtName='Group' and P2.Doc=P.Doc and E2.IntValue=E3.IntValue)
from Pass P, Comple
ct C, Docs DP, Docs DC, Docs DN, ExtValue E, ExtValue E2, NaklOutIS NIS
where P.Processed=1 and P.AccId=905 and DP.UDN=P.UDN and C.UDN=P.UDN and P.Doc=DN.UDN
and NIS.UDN=P.Doc and P.Acc2=(select max(UDN) from Docs where No='У46' and Class='BookAcc')
and
DP.Date>='"+ДАТАСЕРВ(П_1Д)+"' and DP.Date<='"+ДАТАСЕРВ(пар2)+"'
and u1=E.UDN and E.ExtName='Region' and DC.UDN=u1 and u2=E2.UDN and E2.ExtName='Group'
group by P.Acc2, E.IntValue, E2.IntValue, P.Doc
"


Владимир Иванов. Руководитель группы разработки Account 2000