Apico Soft / АПИКО Софт



Спонсором блога ScalaHelp.RU является компания АПИКО Софт.

Мы предоставляем:
- Качественный ERP консалтинг.
- Внедрение и сопровождение системы.
- Российские формы первичных документов, бухгалтерская и налоговая отчетность.

- Разработка корпоративной отчетности.

Наш телефон 8 (495) 961 98 48
Сайт http://www.apicosoft.ru/

Позвоните нам, мы сделаем все, чтобы помочь Вам.

среда, июля 25, 2007

Корреспонденция счетов

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

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

Можно ли обойти это? Например, поможет генератор отчетов RGW, один из режимов работы которого позволяет строить отчеты по корреспонденции. Как это делается - создается отдельная таблица RG_MEMORY. В эту таблицу RGW в полуавтоматическом режиме разносит проводки, пытаясь привести все к двухстрочному виду, для сложных случаев есть ручной режим разноски. После заполнения промежуточной таблицы генератор строит по ней отчет.

Нужно ли связываться с этим? На мой взгляд не стоит, лишняя головная боль. Грамотно составленный план счетов позволит получить все нужные суммы и так.

четверг, июля 19, 2007

UDDB: Дополнительные поля покупателя

Продолжаю тему UDDB. Потренируемся на покупателях. Предположим в карточке покупателя вы хотите иметь еще несколько полей, а все доступные поля уже использованы. Будем добавлять их средствами UDDB. Для простоты предположим, что нам нужно два дополнительных поля "Имя руководителя/Boss Name" и "E-mail". Весь процесс и скриншоты сделаны на версии iScala 2.2 SR2.

Создаем таблицу для дополнительных полей: Scala Administration Console -> User Defined Database -> User Defined Tables -> New User Defined Table…

Выбираем, что новая таблица связана отношением один к одному со справочником покупателей SL01

Создаем два новых поля (одно поле уже создано для связи со справочником)

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

Теперь нужно активировать все это в каждой компании, где это требуется. Этот процесс в Скале на мой взгляд сделан неоправданно запутанным, так что по шагам:

  1. Определяем диапазон покупателей, для которых хотим активировать ввод дополнительных полей - в нашем случае это все покупатели. System Utilities -> Extra Data -> Business Data Delimitation -> Enter/Adjust Common Range
  2. Создаем новую цепочку System Utilities -> Extra Data -> UDDB Chain Codes
  3. Привязываем цепочку к UDDB таблице System Utilities -> Extra Data -> Enter/Adjust Chains
  4. Сводим все вместе System Utilities -> Extra Data -> Extra Data Definitions -> Enter Extra Data Definition

Если нигде не ошиблись, то должно работать. Идем Sales Ledger -> Customer File -> Enter/Adjust Customer. Выбираем любого покупателя, после загрузки жмем Escape и видим новую форму

Эта же форма будет появляться при вводе нового покупателя и при просмотре покупателей через форму запроса.

Функциональность достаточно удобная. Поля можно привязывать выборочно, т.е. одной группе покупателей одни, одной другие, а можно и несколько наборов. Можно сделать связь один ко многим. Есть и свои минусы: запутанная настройка, дополнительная форма не встраивается, а появляется после закрытия основной.

четверг, июля 12, 2007

UDDB: Несвязанные таблицы

User Defined Database (UDDB) - Таблицы определенные пользователем. Возможность iScala незаслуженно редко используемая в реальной жизни.

Простейший случай - несвязанные UDDB таблицы. Предположим, что вы решили завести в БД новую таблицу для нужд отчетности, как справочник для хранимых процедур, да мало ли для чего. Можно просто создать такую таблицу и не думать ни о чем, а можно оформить ее в виде UDDB.

Плюсы:

  • Scala будет знать об этой таблице, что позволит ей, например, добавить содержимое таблицы в плоский бекап или при копировании компании создать в новой компании эту таблицу
  • Если компания годо- или компание-зависимая, то Scala сама будет следить за наличием таблиц при создании нового года или компании
  • Появится простейший интерфейс для редактирования
  • Новая таблица будет документирована, можно всегда глянуть и увидеть весь набор дополнительных таблиц, а не мучительно вспоминать, что же еще ты забыл создать в новой компании

Минусы:

  • Лишнее поле GUID (не думаю, что это страшно)

Мое мнение - по возможности нужно все дополнительные таблицы оформлять как UDDB.

Как создать несвязанную таблицу? Все просто:

  1. Запускаем iScala Administration Console
  2. Базы Данных определенные пользователями -> Таблицы Определенные Пользователями -> Новые таблицы Пользователей
  3. Появляется визард, понятный без особых описаний

Интерфейс для редактирования в стандартном меню: Системные Утилиты -> Дополнительные Данные -> UDDB -> Ввод/Корректировка Несвязанных Таблиц

пятница, июля 06, 2007

Дополнительные функций для CR

Crystal Reports имеет встроенный язык(даже два), который позволяет писать дополнительные функции. Эти функции можно выделять в общие и использовать в разных отчетах. Вот, например, простая функция печати даты вида "31 декабря 2007 г.", работа которой не зависит от региональных и языковых настроек компьютера пользователя:

Function (DateVar Dt)
  numberVar dd;
  numberVar mm;
  numberVar yy;
  stringVar sm;
  dd := Day(Dt);
  mm := Month(Dt);
  yy := Year(Dt);
  stringVar array MonthNames := ["Января", "Февраля", "Марта", "Апреля", "Мая", "Июня", "Июля", "Августа", "Сентября", "Октября", "Ноября", "Декабря"];
  CStr(dd, 0) & " " & MonthNames[mm] & " " & CStr(yy, 0, "") & " г."

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

Спецификация по созданию таких библиотек можно найти на сайте CR.

В составе iScala идет такая библиотека. Более подробно смотри раздел помощи "Special Functions for Crystal Reports".

В своей работе я часто пользуюсь одной такой библиотекой. Изначально она была написана Alexey Vishnyakov из SCALA CIS. С тех пор разными людьми в нее вносились изменения и добавлялись новые возможности.

Список функций библиотеки:

  • avvScaCRGetStringField(SqlString As String) As String - выполняет произвольный SQL запрос SqlString и возвращает значение текстового поля из БД. В запросе можно использовать макросы <CC> и <YY> - они будут заменены на код компании и финансовый год соответственно.
  • avvScaCRGetNumericField(SqlString As String) As Double - тоже, но для числового поля
  • avvScaCRGetDateField(SqlString As String) As Date - тоже, но для поля типа дата
  • avvScaCRNumStr(N As Currency, rub As Integer) As String - представление числа прописью.
    При втором аргументе функции равном:
    0 - вывод только числа прописью,
    1 - дополнительно вывод "рублей" и "копеек"
    2 - дополнительно вывод у.е. и сотых у.е.
    3 - дополнительно вывод "долларов" и "центов"
    4 - дополнительно вывод "ЕВРО" и "центов"
    5 - дополнительно вывод "ГРИВНЫ" и "копейки" (на украинском языке)
  • avvScaCRScaNumToNumber(strNum As String) As Double - конвертация текстовой строки в число
  • avvScaCRScaFormatNumber(Num As Double, ThousandSeparator As String, DecimalSeparator As String, DecimalPlaces As Integer) As String - форматирование числа
  • avvScaCRScaNumberToStr(Num As Double) As String - конвертация числа в строку в соответствии с настройками компании
  • avvScaCRScaShortDateToDate(StrDate As String) As Date - конвертация текстовой строки типа в дату

К сожалению функции, работающие с БД, не всегда правильно работают с несколькими сессиями. Я уже описывал эту проблему тут.

Саму библиотеку и ее исходный код можно скачать здесь.

Для установки нужно зарегистрировать DLL на всех компьютерах, где будут использоваться такие отчеты командой: regsvr32 CRUFLavv.dll

Должно появиться сообщение "DllRegisterServer в CRUFLavv.dll завершено успешно."

После этого новые в списке функций появятся новые пункты, путь к ним Functions/Additional Functions/Visual Basic UFLs (u2lcom.dll):

Можно пользоваться.

воскресенье, июля 01, 2007

Запуск внешней программы из меню (Часть 2)

Итак, второй способ запуска, правильно работающий с несколькими одновременно запущенными копиями Scala. Он немного сложнее и требует наличия вспомогательной DLL. Эту библиотеку нужно зарегистрировать на всех компьютерах.

Цель вспомогательной DLL - прикинуться скальской библиотекой, забрать у Скалы все нужные данные и запустить нашу программу, передав в параметрах командной строки собранную информацию. Все это она и делает. Библиотека реально используется у многих клиентов с версиями iScala 2.2 CR, iScala 2.2 SR1, iScala 2.2 SR2, iScala 2.3

Попробуем все это проверить:

  1. Скачиваем этот архив. В нем DLL, исходные коды DLL, и тестовое приложение.
  2. Выкладываем ExtLauncher.dll (обычно это какой-нибудь общий каталог на сервере, доступный для пользователей Скалы)
  3. Регистрируем DLL командой:
    regsvr32 ExtLauncher.dll
  4. Заводим в меню новую команду
    название действия - ExtLauncher.Launcher
    параметры - путь к программе в двойных кавычках
  5. Убеждаемся, что все работает