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



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

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

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

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

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

среда, августа 29, 2007

Учетная строка

Учетная строка включает в себя счет и до девяти учетных измерений. Длина любой из частей не может превышать 12 символов.

Я уже затрагивал эту тему в предыдущем посте, но решил вернуться, ведь разбирать учетную строку на части в запросах приходится часто и довольно быстро надоедает вспоминать ее раскладку.

Можно облегчить себе задачу, если создать в базе набор функций, каждая из которых будет возвращать нужное учетное измерение. В результате вместо substring(GL06001, 13, 6) можно будет писать dbo.Dim1(GL06001). В добавок отчеты, сделанные с использованием таких функций можно будет без проблем переносить на другие инсталляции Scala, где разбивка учетной строки отличается, потребуется только подправить функции.

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

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

Для примера возьмем следующую разбивку учетной строки: Счет - 12, УИ1 - 4, УИ2 - 6, УИ3 - 6, УИ4 - 4, УИ5 - 3, УИ6 - 6, УИ7 - 3, УИ8 - 2, УИ9 - 4. Создаем функции:


CREATE FUNCTION dbo.Account(@AccountString nvarchar(50))
RETURNS nvarchar(12)
AS
BEGIN
RETURN rtrim(left(@AccountString, 12))
END
GO

CREATE FUNCTION dbo.Dim1(@AccountString nvarchar(50))
RETURNS nvarchar(12)
AS
BEGIN
RETURN rtrim(substring(@AccountString, 13, 4))
END
GO

CREATE FUNCTION dbo.Dim2(@AccountString nvarchar(50))
RETURNS nvarchar(12)
AS
BEGIN
RETURN rtrim(substring(@AccountString, 17, 6))
END
GO

CREATE FUNCTION dbo.Dim3(@AccountString nvarchar(50))
RETURNS nvarchar(12)
AS
BEGIN
RETURN rtrim(substring(@AccountString, 23, 6))
END
GO

CREATE FUNCTION dbo.Dim4(@AccountString nvarchar(50))
RETURNS nvarchar(12)
AS
BEGIN
RETURN rtrim(substring(@AccountString, 29, 4))
END
GO

CREATE FUNCTION dbo.Dim5(@AccountString nvarchar(50))
RETURNS nvarchar(12)
AS
BEGIN
RETURN rtrim(substring(@AccountString, 33, 3))
END
GO

CREATE FUNCTION dbo.Dim6(@AccountString nvarchar(50))
RETURNS nvarchar(12)
AS
BEGIN
RETURN rtrim(substring(@AccountString, 36, 6))
END
GO

CREATE FUNCTION dbo.Dim7(@AccountString nvarchar(50))
RETURNS nvarchar(12)
AS
BEGIN
RETURN rtrim(substring(@AccountString, 42, 3))
END
GO

CREATE FUNCTION dbo.Dim8(@AccountString nvarchar(50))
RETURNS nvarchar(12)
AS
BEGIN
RETURN rtrim(substring(@AccountString, 45, 2))
END
GO

CREATE FUNCTION dbo.Dim9(@AccountString nvarchar(50))
RETURNS nvarchar(12)
AS
BEGIN
RETURN rtrim(substring(@AccountString, 47, 4))
END
GO

-- Проверяем, получилось ли:

select top 100 GL06001 AccStr,
dbo.Account(GL06001) Acc,
dbo.Dim1(GL06001) Dim1,
dbo.Dim2(GL06001) Dim2,
dbo.Dim3(GL06001) Dim3,
dbo.Dim4(GL06001) Dim4,
dbo.Dim5(GL06001) Dim5,
dbo.Dim6(GL06001) Dim6,
dbo.Dim7(GL06001) Dim7,
dbo.Dim8(GL06001) Dim8,
dbo.Dim9(GL06001) Dim9
from GL06CCYY

вторник, августа 21, 2007

Структура БД: Главная Книга

GL/General Ledger/ГК/Главная книга. Основной модуль, практически любая операция в конечном итоге находит свое отражение в проводках этого модуля. Вот и начнем плясать от печки. Сразу оговорюсь, что не ставлю своей целью досконально описать структуру БД, скорее это описание основных сущностей, необходимых для построения отчетов.

По большому счету у модуля две задачи - ведение плана счетов (справочник счетов и справочник учетных измерений (УИ)) и механизм формирования проводок.

Сначала стоит определиться с учетной строкой - это строка из 50 символов, включает в себя счет и учетные измерения. Разбивка внутри этой строки делается на этапе внедрения и потом редко меняется. Максимальное число составных частей учетной строки 9 . Подсмотреть текущую разбивку можно здесь: Системные Утилиты - Управление Деловой Информацией - Настройка Компании (System Utilities - Business Data Management - Company Setup) закладка 5.

GL53 - Справочник счетов

Годо-Зависимость - ДА
Компание-Зависимость - ДА

Поле Описание
GL53001 Счет
GL53002 Наименование счета
GL53003 Тип счета.
0 - прибылей и убытков
1 - балансовый
2 - статистический
GL53005 Определяет привязку учетных измерений. Состоит из девяти символов. Каждый символ отвечает за свое УИ.
0 - УИ не привязано
1 - УИ должно использоваться обязательно
2 - УИ может использоваться
GL53006 Блокировка счета
0 - счет можно использовать
1 - счет заблокирован
2 - прямой ввод для счета запрещен
GL53009 Код книги или спецфункции. Возможные значения можно посмотреть в форме редактирования счета

Остальные поля  редко используются при построении отчетов.

GL03 - Справочник учетных измерений

Годо-Зависимость - ДА
Компание-Зависимость - ДА

Поле Описание
GL03001 Код учетного измерения. B - 1, C - 2, D - 3, E - 4, F - 5, G - 6, H - 7, I - 8, J - 9
GL03002 Код учетного измерения
GL03003 Наименование учетного измерения
GL03004, GL03005 Описание учетного измерения

GL06 - Проводки

Годо-Зависимость - ДА
Компание-Зависимость - ДА

Можно сказать - основная таблица модуля. Именно здесь хранятся все проводки. Каждая проводка состоит из двух и более линий. Знак суммы определяет дебет это или кредит. Кроме случая красного строно - тогда минус это дебет, а плюс кредит. Строки красного сторно помечаются в поле GL06017.

Поле Описание
GL06001 Учетная строка
GL06002 Номер проводки
GL06003 Дата проводки
GL06004 Сумма в локальной валюте
GL06005 Текст проводки
GL06006 Код контрагента
GL06007 Содержимое зависит от модуля. Для КЗ и КП - это номер СЧФ
GL06009

Флаг периодического автораспределения (когда нужно запустить его повторно)

GL06012 Тип проводки. По этому полю можно узнать из какого модуля создана проводка. Более подробно смотри в отдельной статье "Типы проводок".
GL06013 Код пользователя
GL06014 Дата ввода
GL06016 В этом поле хранится уникальный ключ линии. Не советую пользоваться им в качестве ключа связи с другими таблицами, т.к. при некоторых операциях Скала перенумеровывает это поле.
GL06017 Красное сторно
0 - обычная линия
1 - красное сторно
GL06018 Сумма в оригинальной валюте
GL06019 Код валюты
GL06030

Флаг сложного автораспределения (когда нужно запустить его повторно)

GL06032 счет компании источника (для консолидированных компаний)
GL06033 сумма компании источника(для консолидированных компаний)
GL06034

код компании источника (для консолидированных компаний)

 

GL07 - Дневной журнал

Годо-Зависимость - ДА
Компание-Зависимость - ДА

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

Другие таблицы

Здесь приведу краткое описание некоторых таблиц:

  1. GL52 - таблица служит для хранения сальдо в разрезе счетов, периодов и учетных измерений (только до четвертого включительно). Таблица нужна для ускоренного извлечения сальдо. Для перерасчета содержимого можно запустить процедуру реконструкции сальдо. Я предпочитаю не пользоваться этой таблицей, а при необходимости считать сальдо по таблице GL06
  2. GLCB, GLCD, GLCX, GLCY - таблицы модуля Касса
  3. GL10, GL1A - параметры модуля Главная Книга
  4. GL41 - Связка консолидированных компаний по счетам

Примеры запросов

В запросах макросы CC и YY нужно заменить на код компании и финансовый год соответственно. Если есть

Вывод проводки по номеру:

select * from GL06CCYY where GL06002 = '123456'


Расчет сальдо(кредитовое, дебетовое, свернутое) по всем счетам, начинающимся на 60 (при условии, что длинна счета 12 символов):

select left(GL06001, 12) Account,
sum(case when (GL06004 > 0 and GL06017 = '0')or(GL06004 < 0 and GL06017 = '1') then GL06004 else 0 end) DSaldo,
-sum(case when (GL06004 < 0 and GL06017 = '0')or(GL06004 > 0 and GL06017 = '1') then GL06004 else 0 end) CSaldo,
sum(GL06004) Saldo
from GL06V106
where GL06001 like '60%'
group by left(GL06001, 12)


 


Если нужно, то приведу другие примеры - спрашивайте в комментариях.

среда, августа 15, 2007

Структура БД ERP Scala

При создании внешних отчетов, разработке VBA проектов очень важно ориентироваться в структуре базы данных Scala. Данная статья будет вводной частью, в дальнейшем постараюсь пройтись по основным модулям. Описание будет строится на основе версии iScala 2.2.
При инсталляции системы создается минимум две БД. Одна системная (обычно ScaSystemDB) и база для данных компании (имя произвольное). В системной БД хранятся общие данные, определяющие системные настройки системы. Для прикладных задач нас больше интересует именно база рабочих данных. Ею и займемся.
Каждая таблица может быть годо-зависимой и компание-зависимой. Имена таблиц формируются по шаблону MMNNCCYY, где:

  • MM - модуль (например: GL - главная книга, SC - управление запасами….)
  • NN - номер таблицы
  • CC - код компании (для компание-независимых таблиц 00)
  • YY - финансовый год (для годо-независимых таблиц 00)
Имена полей в таблицах тоже унифицированы и составляются из префикса XXXX, копирующего первые четыре символа имени таблицы, плюс трехзначный номер по порядку.
Пример для наглядности: таблица справочника поставщиков - PL010100:
  • PL - Purchase Ledger - Книга Закупок
  • 01 - номер таблицы
  • 01 - код компании
  • 00 - т.к. годо-независимая
  • Имена полей PL01001, PL01002, PL01003…
Просмотреть структуру БД можно с помощью программы ScaDBConv:

  1. Выбор модуля
  2. Список таблиц выбранного модуля
  3. Свойства выбранной таблицы
  4. Списко полей, из названия, тип выбранной таблицы
  5. Информация по индексам
Легенда значков, используемых в программе:

На самом деле вся информация по структуре БД хранится в таблице SCA_TAB_COLUMNS в компанейской базе, если у вас нет доступа к ScaDBConv, то можно считать ее прямо оттуда.

UPDATE 28.11.2009: Добавлено небольшое веб-приложение, показывающее структуру базы данных iScala. Сделано на основе версии 2.3 SR2.

четверг, августа 09, 2007

Как удалить профиль пользователя

Есть в iScala 2.2 SR1 дурная ошибка - меню распахивается на весть экран, при запуске любой команды рабочая область не видна. Возникает она довольно редко, лечится обычно переключением несколько раз разрешения монитора и запуска Scala на этих разрешениях (может есть более простой способ лечения?). Но бывает это не помогает, переключаешь-переключаешь, а результата нет. Вот после одного такого раза я написал инструкцию как удалять профиль. С тех пор на эту ошибку ни разу не натыкался, может исправили? Очень рад, если так, а инструкция все-таки на всякий случай, вот(да в конце-концов мало ли для какой цели потребуется удалить профиль):
  1. Выйти из Скалы. Все последующие действия, за исключением скрипта, нужно производить непосредственно на компьютере пользователя, если используется терминальный доступ, то на том терминале, где работает пользователь
  2. Запустить RegEdit. Путь: HKEY_LOCAL_MACHINE\SOFTWARE\Scala Business Solutions NV\Windows Deployment Server\1.0\Paths
  3. Берем из ключика UserProfileCache путь и открываем по этому пути Проводник:
  4. Открываем в notepad файл DirectoryMap.xml:
    <?xml version="1.0" encoding="UTF-16"?>
    <DirectoryMap Version="1">
        <Mapping UserName="RUS" Directory="00000313"/>
        <Mapping UserName="SCALA" Directory="00001661"/>
        <Mapping UserName="ADMIN" Directory="00004CCD"/>
    </DirectoryMap>
  5. Находим строку, отвечающую за нужного пользователя, удаляем папку, указанную в ключе Directory. Например, если нам нужно удалить профиль для пользователя RUS, то нужно удалить папку 00000313 и удалить строку, чтобы получилось следующее:
    <?xml version="1.0" encoding="UTF-16"?>
    <DirectoryMap Version="1">
        <Mapping UserName="SCALA" Directory="00001661"/>
        <Mapping UserName="ADMIN" Directory="00004CCD"/>
    </DirectoryMap>
  6. Находим нужного пользователя в таблице ScaUsers системной базы данных Скалы, запоминаем значение поля UserID
  7. Выполняем скрипт в системной базе данных Скалы:
    DELETE pd
    FROM ScaUserProfileEntryDesc pd
    INNER JOIN
    ScaUserProfileEntries p On p.EntryID = pd.EntryID
    WHERE p.UserID = 233 -- !!! Заменить на реальный UserID
    DELETE FROM ScaUserProfileEntries WHERE UserID = 233 -- !!! Заменить на реальный UserID
Не забывайте, что удаляя профиль, вы удаляете все личные настройки данного пользователя: расположение и размер окон, настроенные кнопочки и т.д.

четверг, августа 02, 2007

TTX на основе отчета

Все встроенные отчеты iScala на Crystal Reports используют в качестве источника данных Field Definition File - это текстовый файл, в котором описана структура данных, передаваемых отчету. Данный файл нужен только при разработке отчета, при рабочем формировании он не используется. Расширение у таких файлов TTX, поэтому часто их и называют TTX файлы.

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

Для восстановления TTX можно воспользоваться скриптом, написанным Sergey Mikhno. Скачать его можно здесь.

Запускается скрипт из командной строки: createttx.bat МойОтчет.rpt

В результате работы скрипта будут сформированы все TTX и ссылки внутри отчета будут исправлены, т.е. будут указывать на вновь сформированные файлы. Советую делать все эти операции над копией, а не над оригинальным отчетом.