30 нояб. 2016 г.

Быстрая установка сервера Firebird 3

Здесь под "быстрая" мы имеем ввиду, что Firebird запускается в режиме максимальной совместимости с версией 2.5. Т.е. от нас не потребуется дополнительных усилий по настройке учетной записи SYSDBA и для существующих приложений не придется менять клиентские библиотеки.

Заходим сюда и скачиваем архив с новейшей версией сервера нужной нам разрядности.

Предположим, мы остановились на 32-х битной версии. Заходим в c:\Program Files и создаем там папку FB3.

Распаковываем содержимое скачаного архива в созданную папку.

Переходим в нее, находим и открываем на редактирование файл firebird.conf. Находим следующие параметры, убираем перед их именем символ комментария -- решетку и устанавливаем значения по списку ниже:
  • AuthServer = Legacy_Auth
  • AuthClient = Legacy_Auth
  • UserManager = Legacy_UserManager
  • WireCrypt = Disabled
  • WireCompression = false
Если на данном компьютере уже установлен Firebird, например версии 2.5, то изменим номер порта, чтобы избежать конфликтов. Номер по-умолчанию 3050. Установим, например, 3054:
  • RemoteServicePort = 3054
Сохраняем файл конфигурации.

В папку FB3\UDF подкладываем библиотеку GUDF.DLL, которую берем здесь (если устанавливается 64-х битная версия сервера, то библиотеку берем здесь).

Открываем окно командной строки. Перемещаемся в папку FB3 и выполняем три команды:
  1. instreg install
  2. instsvc install -a -n fb3
  3. instsvc start -n fb3
Теперь сервер работает и к нему можно подключаться. Если мы прописали порт 3054, как указано выше, то с этого же компьютера сетевое подключение будет выглядеть как localhost/3054.

Базы со старых версий сервера на тройку следует переносить через процедуру бэкап на старом сервере, затем восстановление на новом.

29 нояб. 2016 г.

GDMNN: Задача #1

В продолжение вчерашнего разговора. Первая задача: представить альтернативную структуру таблиц для документов, бухгалтерских проводок и складского движения.

Цель:
  • Унифицировать механизмы фиксации и учета движения, обобщив и распространив их не только на движение ТМЦ, но и на движение (изменение, трансформацию) любого объекта учета.
  • Избавиться от дублирования данных и непрозрачных функций преобразования (поля документа => аналитические признаки в проводках).
  • Любое поле документа может быть использовано в качестве аналитического признака при построении отчетов.
  • Отойти от ограниченной структуры шапка-позиции. Для сложных документов предусмотреть наличие нескольких датасетов с произвольным уровнем вложенности. 
  • Для сумовых данных, используемых с целью ускорения выборок (INV_BALANCE), предусмотреть неблокирующую схему обновления, чтобы отказаться от автокомита в складских документах (комита частично введенного документа). 
  • Статус документа: черновик, отложенный, готовый.
  • Уменьшить размер базы и, как следствие, увеличить скорость операций по изменению и выборке. 
Для новой структуры представить запрос на построение журнала ордера с использованием SQL window functions и другого функционала Firebird 3.

21 нояб. 2016 г.

14-15 ноября для студентов курса "Бухгалтер-калькулятор в общественном питании", обучающихся в "Республиканском институте повышения квалификации и переподготовки работников Министерства труда и социальной защиты Республики Беларусь", были проведены занятия по программому комплексу на платформе Гедымин.

28 авг. 2016 г.

Только до 9 сентября Embarcadero раздает Delphi 10.1 Starter Edition бесплатно. Не триал и не демо версия, а полностью рабочий продукт с серийным номером.

8 авг. 2016 г.

Байдарки 2016

Добавили Нарочанку и Вилию в нашу походную коллекцию.

В этом году нам повезло с погодой. Немного дождя в первый день и замечательная солнечная погода во второй и третий.

Традиционное фото на память.


И не менее традиционные благодарности агентству Вольны Вецер за прекрасную организацию.

2 авг. 2016 г.

GS.MulDiv

Для правильного округления введена функция MulDiv, которая доступна из макросов и из FastReport4. Теперь, вместо кода:

'По реализации по розн. ценам (сумма НДС, гр9 )
S95 = round(acc_CalcTaxPosition("148725640_116707345", GS.NG(BeginDate), EndDate) / 1000 + 1/100000, 3)

пишем:

'По реализации по розн. ценам (сумма НДС, гр9 )
S95 = GS.MulDiv(acc_CalcTaxPosition("148725640_116707345", GS.NG(BeginDate), EndDate), 1, 1000, 1, 3)

3 июл. 2016 г.

GetNumeral, GetCurrNumeral

С копейками, без копеек, числом, строкой, с полным названием, с кратким названием... Число функций для преобразования дошло до пяти и каждую надо трижды прописать: для макросов, для фаст репорта 2, для фаст репорта 4. Пришло время навести порядок. Встречайте две универсальные функции для преобразования числа в числительное: Функции доступны в макросах и четвертом фаст репорте.

15 июн. 2016 г.

Чем хороши радикальные изменения законодательства -- в офис наведываются давние и очень давние пользователи наших программ. На днях заглянул Евгений Александрович Кучерявенко, один из первых покупателей, пользователь Анжелики, а затем и Гедымина с 1996 года!
Стараниями Евгения Александровича все хозяйства Ивановского района систему полной автоматизации учета с/х предприятия, включая животноводство и растениеводство.

8 июн. 2016 г.

Несколько простых правил одновременной работы над проектом в гит

  1. Как можно чаще выполнять git pull для загрузки себе изменений, произведенных другими разработчиками.
  2. При работе в отдельной ветви, из которой позже изменения будут переданы в основную, регулярно выполнять git fetch, затем git merge master.
  3. При возникновении конфликтов принимаем чужие изменения (Accept theirs -- в Tortoise Git) и вносим в них свои правки.
  4. Если автоматический merge не прошел из-за конфликта, то, после его разрешения, на комите, будет показан список измененных файлов как нами, так и другими разработчиками. Если мы работаем с Tortoise Git ни в коем случае нельзя снимать галки с файлов (даже если лично мы их не меняли), иначе изменения других людей пропадут и в репозиторий запишется файл в том состоянии, в котором он был у нас на диске до merge.

7 июн. 2016 г.

Ветви Cash & Check

Две ветви добавлены в репозиторий gedemin-apps для текущей разработки проектов POSitive:Cash и POSitive:Check. Здесь будут находиться новейшие версии. После тестирования изменения будут скидываться в ветку master из которой у нас сейчас еженочно формируются дистрибутивы.

Посмотреть какие ветки присутствуют локально на компьютере:

git branch

Добавить и переключиться на локальную ветку cash, связать ее с веткой в центральном репозитории:

git checkout -b cash --track origin/cash

Переключиться на ветку master:

git checkout master

Переключиться на ветку cash:

git checkout cash

Получить изменения с сервера в локальную базу данных. Файлы изменены не будут!

git fetch

Применить полученные изменения из удаленной ветки к локальным файлам в текущей ветке:

git merge

Два предыдущих действия одной командой:

git pull

Если ругнется, что локальная ветка не привязана к ветке в удаленном репозитории, то:

git branch --set-upstream-to=origin/cash cash

После чего делаем pull.

Мы в ветке cash. Принимаем изменения из ветки master:

git merge master

ВАЖНО! При возникновении конфликтов принять изменения другой стороны и внести свои коррективы.

Изменили некоторые файлы. Сохраняем изменения в локальном хранилище:

git commit -a -m "some changes were made"

Отправляем изменения в центральный репозиторий:

git push

После того, как изменения в ветке cash протестированы, отправляем их в ветку master:

git checkout master
git merge cash
git commit -a -m "New cash version"
git push

14 мая 2016 г.

True UTF-8 encoding

XML файл в кодировке UTF-8 можно сформировать используя только ASCII и кодируя все национальные символы через &#x0 последовательности. Дешево и сердито. Например, такой подход предложен здесь.

Но, если мы хотим, чтобы XML файл красиво отображался в текстовом редакторе, системе контроля версий и т.п., надо сохранить его в настоящей кодировке UTF-8. Для этого мы добавили в платформу функции WIN1251ToUTF8 и UTF8ToWIN1251, которые принимают на вход два потока и перекодируют данные между ними. В дополнение к ним идут функции ReplaceXMLTags и ExpandXMLTags.

Пример использования см. здесь.

12 мая 2016 г.

Деноминация 2016. Технические аспекты

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

В отличие от конкурирующих решений наш подход сохраняет всю историю, весь документооборот предприятия до 1 июля.

Первая проблема, которая возникает, это возможная потеря точности. Платформа использует тип Currency, который позволяет обрабатывать денежные величины с точностью до 4-го знака после запятой. После деноминации 0.0001 в новых деньгах будет соответствовать 1-му старому рублю. Все что меньше рубля потеряется (округлится по правилам математического округления). Хотя 1 неденоминированный рубль очень маленькая величина (коробок спичек сейчас стоит 400 рублей) можно представить базу данных, где мелкий товар учитывается поштучно и цена единицы содержит копейки -- пуговицы, швейные иголки, болты, гайки и т.п. Мы рекомендуем в таком случае провести на 30 июня 2016 г. переоценку товара, округлив учетные цены до целых рублей.

Вторая проблема -- округление до целого числа в скрипт-функциях и отчетных формах через вызов функций Round, Int, Fix, CLng, CInt или обращение к полю через свойство AsInteger. Мы внесем исправления в типовые прикладные решения, но решить задачу в общем случае, анализируя программный код и автоматически заменяя вызовы функций нам не представляется возможным. Единственный путь -- заранее создать копию рабочей базы данных, деноминировать ее и затем тестировать на ней все режимы работы и устранять выявленные проблемы.

Третья проблема заключается в том, что бухгалтерия предприятия до 20 июля производит закрытие июня и второго квартала. При этом вносятся и/или корректируются документы прошлых периодов, закрываются транзитные счета, выполняется трансформация баланса, рассчитываются промежуточные показатели и налоги. Согласно методическим разъяснениям налоговые декларации за июнь подаются в неденоминированных рублях.

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

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

Деноминация базы данных производится с помощью отдельной утилиты dnmn.exe, которая предоставляется клиентам на абонентском обслуживании. Мы обработали несколько десятков баз данных и сформировали список полей для деноминации. Если на вашем предприятии используются частные решения, то перед запуском процесса следует добавить нужные поля в список деноминируемых.