30 апр. 2012 г.

Компонент gsComScaner

До сих пор компонент TgsComScaner корректно принимал только данные, переданные устройством в строковом виде с оговоренным символом-маркером конца строки. Некоторые устройства просто передают последовательность байт и не позволяют задать концевой символ. Для работы с ними в компонент добавлено свойство PacketSize — размер ожидаемого пакета в байтах. Данное свойство задействуеся только если указаны нулевые коды начального и конечного символов-ограничителей, а также свойства CRSuffix и LFSuffix установлены в False. Полученный результат побайтово преобразуется в строку шестнадцатеричных чисел и записывается в свойство BarCode. Дополнительно, если PacketSize <= SizeOf(Integer), результат копируется в новое свойство IntCode.

13 апр. 2012 г.

Firebird 2.0.7

Для нас это не сильно актуально (Гедымин требует как минимум версию Firebird 2.5), тем не менее, вышел релиз Firebird 2.0.7. Разработчики обещают, что последний для сервера Firebird 2.0.

12 апр. 2012 г.

Опять двадцать пять...

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

Когда 3 апреля грохнулась база предприятия Б, мы восстановили архив на 30 марта. Так как часть информации из исходной базы данных могла быть прочитана, объекты за 1-2 апреля были сохранены в поток и загружены на новую базу. В результате, некоторые записи задвоились. Почему?

Как известно, при загрузке из потока система пытается найти объект по его РУИДу или с помощью запроса из метода CheckTheSameStatement. Последний определен только для узкого круга классов, так что вся надежда на РУИДы. Если РУИД загружаемого объекта не найден, то считается что такого объекта нет и создается новая запись.

Предположим, некоторая запись была создана 20 марта на рабочей еще базе простым пользователем. РУИДа у этой записи не будет, потому как он автоматически присваивается только в трех случаях:

  1. Если работа идет под учетной записью Administrator.
  2. В момент открытия диалогового окна Свойства объекта.
  3. В процессе сохранения объекта в поток.
Первый раз РУИД сформируется при сохранении в поток на поврежденной базе данных. Естественно, что поиск по этому РУИДу при загрузке из потока на базу данных из архива ничего не даст. Система примет загружаемую запись за новую и создаст дубликат.

Можно ли было избежать такого неприятного развития событий? Да. Так как архивная база является копией исходной по состоянию на 30 марта, все объекты в обеих базах, созданные до указанной даты, имеют одинаковые идентификаторы. Следовательно, если мы:

  1. Не меняли идентификатор базы данных, восстановленной из архива. (Заметим, что даже если идентификатор базы был изменен, ничего страшного не произойдет. Главное — обеспечить равенство идентификаторов двух баз до начала выполнения шагов 2 и 3.)
  2. В поврежденной базе создали вручную РУИДы для всех записей.
  3. В архивной базе создали вручную РУИДы для всех записей.
то, можно спокойно переносить объекты потоком без угрозы задвоения.

Принудительно создать РУИДы для всех записей в базе можно с помощью приведенного здесь запроса. Обратите внимание на использование оператора MERGE.

Таким бы качеством нам документацию издать...

Надрукавалася кнiга Алеся Краўцэвiча "Гедымiн (1316-1341). Каралеўства Лiтвы i Русi".

5 апр. 2012 г.

Обновлены библиотеки FastMM и Fast Report 4

От сегодняшнего дня на сайте находится gedemin.exe, откомпилированный с новыми версиями библиотек. Интересующие нас изменения в FastMM 4.99:
  • Reduced the minimum block size to 4 bytes from the previous value of 12 bytes (only applicable to 8 byte alignment). This reduces memory usage if the application allocates many blocks <= 4 bytes in size.
  • Fixed a crash bug (that crept in in 4.96) that may manifest itself when resizing a block to 4 bytes or less.
В Fast Report 4.12.6:
  • добавлен экспорт Excel формул в BIFF экспорте
  • добавлен экспорт внешних URL в PDF экспорт
  • добавлено свойство Cross.KeepRowsTogether
  • оптимизировано объединение ячеек в BIFF экспорте
  • добавлено свойство DataOnly в экспорты
  • формат картинок во всех экспортах изменён на PNG
  • улучшена обработка числовых форматов в BIFF экспорте
  • добавлено свойство TfrxODFExport.SingleSheet
  • добавлено свойство TfrxSimpleTextExport.DeleteEmptyColumns
  • добавлено свойство TfrxBIFFExport.DeleteEmptyRows
  • исправлена ошибка c рамкой для некоторых типов штрих кодов
  • исправлен неправильный размер метафайлов в EMF экспорте
  • исправлена обработка отрицательных чисел в OLE экспорте
  • исправлена ошибка в OLE экспорте в обработке исключений
  • исправлена ошибка в создании прогресс-бара (относится ко многим экспортам)
  • исправлена ошибка в ODF экспорте в обработке строк
  • исправлена ошибка в OLE экспорте в форматировании чисел
  • исправлена ошибка в PDF экспорте в повороте текста на 90, 180 и 270 градусов
  • исправлена ошибка в ODF экспорте в обработке колонтитулов
  • исправлена ошибка в Text экспорте в вычислении границ объектов
  • исправлена ошибка в ODF экспорте в UTF8 кодировании
  • исправлено скрытие линий сетки вокруг непустых ячеек в BIFF экспорте
  • исправлено размытие картинок при экспорте
  • исправлен перенос слов в экспорте Excel XML
  • добавлен новый фильтр экспорта BIFF8 XLS
  • добавлено в ODF экспорт свойство Language
  • исправлена в XML экспорте ошибка использовании свойства ShowProgress
  • исправлена в RTF экспорте ошибка в вычислении размера шрифта для ячекк без текста
  • исправлена в ODF экспорте обработка поля Creator
  • исправлена в XML экспорте обработка специальных символов в строке
  • исправлена ошибка в ODF экспорте в формировании атрибутов table:number-columns-spanned и table:number-rows-spanned
  • исправлена ошибка в ODF экспорте в обработке цвета clNone
  • исправлена ошибка в ODF экспорте в формировании стиля table:covered-table-cell
  • исправлена ошибка в ODF экспорте в формировании копий тегов table:covered-table-cell
  • исправлена ошибка в ODF экспорте: ненужные теги text:p теперь не добавляются внутрь тегов table:covered-table-cell
  • исправлена ошибка в ODF экспорте в формировании языковых стилей
  • исправлена ошибка в ODF экспорте в обработке пробелов и знаков табуляции
  • исправлена ошибка в ODF экспорте в формировании стилей числовых ячеек
  • исправлена ошибка в ODF экспорте в обработке фоновой картинки
  • исправлена ошибка в ODF экспорте в формировании междусимвольного интервала
  • исправлена ошибка в ODF экспорте в форматировании чисел
  • исправлена ошибка в ODF экспорте с тегом table-row
  • исправлена ошибка в XLS(OLE) экспорте в форматировании чисел
  • исправлена ошибка в RTF экспорте в обработке RTF полей
  • исправлена ошибка в обработке специальных символов в HTML экспорте
  • исправлена ошибка UTF8 кодирования в ODF экспорте
  • исправлена ошибка экспорта в PDF подчеркнутых, перечёркнутых и повёрнутых текстов.

4 апр. 2012 г.

Плюсуем Гедымин на Google+

Обладатели акаунтов Google+ теперь могут плюсовать наш проект. Идем сюда и ищем кнопочку в левой верхней части экрана.

Bing still sucks

Элементарный вопрос — восстановление поврежденной базы данных Firebird. Google и Yandex дружно на первом месте выдают ссылку на инструкцию с нашего сайта, а Микрософт не может предложить ничего полезного даже в первой десятке: восстановление баз mssql, падение 1c, до кучи касперский и (на первом месте!) ссылка на техподдержку почтового клиента The Bat... Лузеры, одним словом.

3 апр. 2012 г.

На авось

Снова история. Снова крупное предприятие парализовано на полдня с перспективой повторного ввода всей информации за несколько дней. И все по причине элементарной безалаберности:
  • Мало купить бесперебойник — надо подключить к нему сервер.
  • Мало подключить сервер к бесперебойнику — надо убедиться, что мощности последнего хватит, чтобы продержать сервер достаточное время для корректного завершения всех задач и выключения операционной системы.
  • Обратная связь должна быть настроена и специальная утилита должна следить за обрывом питания и выключать сервер по прошествии некоторого времени.
  • Аккумуляторы источника бесперебойного питания деградируют со временем. Проверять их работоспособность следует не реже 2-3-х раз в год.
  • Предыдущее утверждение справедливо и для батарейки на RAID контроллере, которая обеспечивает энергонезависимость кэш памяти. Следите за сообщениями при загрузке сервера и регулярно проверяйте лог операционной системы.
  • Мало регулярно делать архив базы, надо также регулярно проверять восстанавливается ли база из этого архива.
  • Архив базы данных в десятки гигабайт будет восстанавливаться часами. Всегда следует держать на резервном сервере горячую копию, выполненную с помощью утилиты nbackup или SQL командами ALTER DATABASE BEGIN BACKUP, ALTER DATABASE END BACKUP.
  • И последнее, но от этого не менее важное: резервный сервер должен быть.

В помощь системному администратору

Разбор полетов после разгребания кучи-малы из нескольких версий Firebird и одного Yaffil на клиентском сервере:
  • Если Гедымин расположен на одном компьютере с сервером Firebird и при конекте к базе данных на экране появляется сообщение Character set WIN1251 is not defined, проверьте какая библиотека используется для подключения. Наверняка это fbembed.dll, которую Гедымин при загрузке ищет первой. Если в строке подключения не прописан адрес (имя) сервера, то fbembed.dll выступит в роли встроенного сервера. Проблема в том, что подкаталог Intl, который ему нужен для поддержки символьных таблиц, будет искаться относительно расположение файла gedemin.exe. Если его там нет — получим сообщение об ошибке. Возможные решения проблемы:
    1. Удалить fbembed.dll. Тогда gedemin.exe будет подключаться через fbclient.dll как нормальный сетевой клиент.
    2. Прописать имя компьютера в строке подключения к базе данных, чтобы форсировать сетевое подключение по протоколу TCP.
    Как проверить библиотеку подключения?
    1. Запускаем Гедымин
    2. Отказываемся от конекта к базе данных
    3. Идем в меню Справка, окно О системе и там смотрим имя, версию и расположение.
  • После ручной остановки и удаления сервиса Firebird, не забыть удалить библиотеки gds32.dll и fbclient.dll из каталога Windows\System32.
  • После копирования файлов Firebird из архива и ручной установки и запуска сервиса, не забыть прописать путь в глобальной переменной среды Path к папке c:\program files\firebird\bin или куда там были переписаны файлы из архива.
  • После ручного удаления старой версии gedemin.exe следует зайти в папку Windows\System32 и выполнить две команды:
    1. regsvr32 -u midas.dll
    2. del midas.dll
    Новейший gedemin.exe подключает midas.dll через файл манифеста и не нуждается в отдельной регистрации COM сервера.
  • Как минимум второй раз сталкиваемся с тем, что антивирус NOD32 препятствует работе сервера Firebird. Сообщение: Connection rejected by remote interface. Наверняка в нем есть соответствующие настройки, но не было времени разбираться — снесли антивирус под корень и все наладилось.

1 апр. 2012 г.

Очередной магазин КУП Минскхлебпром

Магазин «Свежий хлеб», Калиновского, 4.

Специфика ORM модели платформы Гедымин

ORM Гедымина имеет ряд нестыковок. Известны они давно и очередной раз привлекли к себе внимание во время разработки автоматизированного теста (см. предыдущий пост). Ниже перечислены некоторые из них:
  • Не учитывается разница между истинным абстрактным базовым классом (например, TgdcBase), и базовым классом c конкретной ListTable, который служит фундаментом для иерархии наследованных классов (например, TgdcBaseContact).
  • Некоторые объекты могут использоваться только внутри кода других объектов с выполнением магических действий по программной настройке:
    1. Все наследники TgdcInvBaseRemains
    2. TgdcInvCard
    3. TgdcLink
    4. TgdcAcctDocument
    5. TgdcAcctEntryRegister
  • К списку выше можно добавить все объекты позиций документов, создать запись в которых можно только при настроенной связи мастер-дитэйл с шапкой или непосредственно указывая ИД головной записи. При этом связь надо настраивать вручную, так как объекты шапки и позиций автономны и ничего не знают друг о друге. Частично задача решена для документов и только с вовлечением интерфейса пользователя — платформа формирует экранную форму просмотра на основе информации о типе документа.
  • В ситуациях, когда бизнес-сущность хранится в нескольких таблицах, список последних нигде не задан явно. Мы можем полагаться на сформированный запрос или обращаться к метаданным. В последнем случае мы рискуем получить слишком большой список связанных таблиц, не все из которых являются частью нашего бизнес-класса. Например, окно Свойства объекта выдает такое множество связанных таблиц для документа Отпуск товара на сторону из стандартного пакета настроек:
    BN_BANKCATALOGUE, BN_BANKCATALOGUELINE, BN_BANKSTATEMENT, BN_BANKSTATEMENTLINE, BN_CURRCOMMISSION, BN_CHECKLIST, BN_CURRBUYCONTRACT, BN_CURRCOMMISSSELL, BN_CURRCONVCONTRACT, BN_CURRLISTALLOCATION, BN_CURRSELLCONTRACT, BN_DEMANDPAYMENT, CTL_INVOICE, CTL_RECEIPT, GD_TAXDESIGNDATE, GD_TAXRESULT, GD_CONTRACT, GD_DOCREALIZATION, INV_PRICE, INV_PRICELINE, USR$INV_ADDINFO, USR$BN_ACCMAKE, USR$BN_ACCMAKELINE, USR$BN_BILL, USR$BN_BILLLINE, USR$BN_BILLNDS, USR$BN_BILLNDSLINE, USR$BN_BLANKTRIP, USR$BN_BTRIPMONEY, USR$BN_BTRIPMONEYLINE, USR$BN_BUYCURR, USR$BN_CASHBOOK, USR$BN_CASHBOOKLINE, USR$BN_CASHDEPOSIT, USR$BN_CASHDEPOSITLINE, USR$BN_CASHREPORT, USR$BN_CASHREPORTLINE, USR$BN_CHANGECURR, USR$BN_COLLECT, USR$BN_COMMISS, USR$BN_COMMISSLINE, USR$BN_DATABTRIP, USR$BN_DATABTRIPLINE, USR$BN_DEMAND, USR$BN_INCOMECURR, USR$BN_INCOMECURRLINE, USR$BN_LISTDEM, USR$BN_LISTDEMLINE, USR$BN_NOTICE, USR$BN_NOTICELINE, USR$BN_ORDERBTRIP, USR$BN_ORDERBTRIPLINE, USR$BN_PAYMENT, USR$BN_SALECURR, USR$BN_SALECURRLINE, USR$BN_SHARECURR, USR$BN_SHARECURRLINE, USR$BN_TRANSFER, USR$BN_TTN, USR$BN_TTNLINE, USR$BNF_ACTS, USR$BNF_ACTSLINE, USR$BNF_CONTRACT, USR$BNF_CONTRACTLINE, USR$CHECKREGISTER, USR$CHECKREGISTERLINE, USR$CURR_PAYMENT, USR$FA_ACTNEW, USR$FA_ACTNEWLINE, USR$FA_AMORT, USR$FA_AMORTLINE, USR$FA_CHANGEPROP, USR$FA_CHANGEPROPLINE, USR$FA_COMPLECT, USR$FA_COMPLECTLINE, USR$FA_CONSERVATIONLINE, USR$FA_CONSERVATION, USR$FA_MOVEMENT, USR$FA_MOVEMENTLINE, USR$FA_REAPP_B, USR$FA_REAPP_BLINE, USR$FA_REAPP, USR$FA_REAPPLINE, USR$FA_REMONT, USR$FA_REMONTLINE, USR$FA_REPAIR, USR$FA_REPAIRLINE, USR$GS_ACCBALANCE, USR$GS_ACTWORK, USR$GS_ACTWORKLINE, USR$INCOME_ORD, USR$INCOME_ORDLINE, USR$INV_ACTWORK, USR$INV_ACTWORKLINE, USR$INV_ADDWBILL, USR$INV_ADDWBILLLINE, USR$INV_ATTORNEY, USR$INV_ATTORNEYLINE, USR$INV_BILL, USR$INV_BILLLINE, USR$INV_CARDPRMET, USR$INV_CARDPRMETLINE, USR$INV_CERT, USR$INV_CHANGEPERC, USR$INV_CHANGEPERCLINE, USR$INV_COMP, USR$INV_COMPLINE, USR$INV_CONTRACT, USR$INV_CONTRACTLINE, USR$INV_DECOMP, USR$INV_DECOMPLINE, USR$INV_GOODORDER, USR$INV_GOODORDERLINE, USR$INV_INVENT, USR$INV_INVENTLINE, USR$INV_INVMOVE, USR$INV_INVMOVELINE, USR$INV_NEWCOST, USR$INV_NEWCOSTLINE, USR$INV_OUTLAYS, USR$INV_PROCESSING, USR$INV_PROCESSINGLINE, USR$INV_PRODUCT, USR$INV_PRODUCTLINE, USR$INV_PRREC, USR$INV_PRRECLINE, USR$INV_REALCOMMIS, USR$INV_REALCOMMISLINE, USR$INV_RETAIL, USR$INV_RETAILLINE, USR$INV_RETCUST, USR$INV_RETCUSTLINE, USR$INV_RETPROV, USR$INV_RETPROVLINE, USR$INV_SELLBILL, USR$INV_SELLBILLLINE, USR$INV_SPEND, USR$INV_SPENDLINE, USR$INV_SPENDPREC, USR$INV_SPENDPRECLINE, USR$INV_TOTRADE, USR$INV_TOTRADELINE, USR$MOG_DEBTACC, USR$MOG_DEBTCONTR, USR$MOG_INBILLVAT, USR$MOG_INBILLVATLINE, USR$MOG_SERVICE, USR$REN_DIVSTATEMNLINE, USR$SKIDKI, USR$SKIDKILINE, USR$WG_ADDPAYBYPERIODLINE, USR$WG_ADDPAYBYPERIOD, USR$WG_AGREEMENTLONGLINE, USR$WG_AGREEMENT, USR$WG_AGREEMENTLINE, USR$WG_AGREEMENTLONG, USR$WG_ALIMONY, USR$WG_ALIMONYDEBT, USR$WG_ATTEST, USR$WG_AVGADDPAY, USR$WG_AVGADDPAYLINE, USR$WG_BANKCALC, USR$WG_BRIGADEORDERLINE, USR$WG_BRIGADEORDER, USR$WG_CHARGEREG, USR$WG_CHILDAID, USR$WG_CONTRACT, USR$WG_CONTRACTLINE, USR$WG_CORRECT, USR$WG_CORRECTLINE, USR$WG_FAMCHAG, USR$WG_HAZARDS, USR$WG_HAZARDSLINE, USR$WG_HOLIDAYWORK, USR$WG_HOLIDAYWORKLINE, USR$WG_INCTAXDEDUCTION, USR$WG_INCTAXOTHERPAYLINE, USR$WG_INCTAXOTHER, USR$WG_INCTAXOTHERPAY, USR$WG_INCTAXSECURITIES, USR$WG_INITINCOME, USR$WG_INITINCOMELINE, USR$WG_KINDDAY, USR$WG_KINDDAYLINE, USR$WG_LEAVEDOC, USR$WG_LEAVEDOCLINE, USR$WG_LEAVEPASS, USR$WG_LEAVESCHED, USR$WG_LEAVESCHEDLINE, USR$WG_LEAVESTOPDOC, USR$WG_MANUALINPUT, USR$WG_MANUALINPUTLINE, USR$WG_MOVEMENT, USR$WG_MOVEMENTLINE, USR$WG_MULTIORDER, USR$WG_MULTIORDERLINE, USR$WG_PARTDAY, USR$WG_PARTDAYLINE, USR$WG_PENALTYDOC, USR$WG_PERSONALORDERLINE, USR$WG_PERSONALORDER, USR$WG_PIECEWORK, USR$WG_PIECEWORKLINE, USR$WG_PROFDEVELOP, USR$WG_PU6, USR$WG_PU6LINE, USR$WG_RETRAINING, USR$WG_REWARDDOC, USR$WG_SALARYCALC, USR$WG_SALARYCALCLINE, USR$WG_SALARYPAY, USR$WG_SALARYPAYLINE, USR$WG_SCIENCEDEVELOP, USR$WG_SENCALC, USR$WG_SENCALCLINE, USR$WG_SETPAYMENT, USR$WG_SETPAYMENTLINE, USR$WG_SETSENBONUS, USR$WG_SICKLIST, USR$WG_SICKLISTJOURNAL, USR$WG_SICKLISTLINE, USR$WG_SINKDEBT, USR$WG_SINKDEBTLINE, USR$WG_STAFFLIST, USR$WG_STAFFLISTLINE, USR$WG_TAXATION, USR$WG_TBLCAL, USR$WG_TBLCALLINE, USR$WG_TIMEWORK, USR$WG_TIMEWORKLINE, USR$WG_TOTAL, USR$WG_TOTALLINE, USR$WG_VACATION, USR$WG_VACATIONLINE, USR$WG_WRITEOFF, USR$WG_WRITEOFFLINE, USR$WS_DISTANCE_LINE, USR$WS_FUEL_LINE, USR$WS_WAYSHEET
  • Как уже отмечалось выше, связь мастер-дитэйл обрабатывается платформой только для документов и только на уровне пользовательского интерфейса. Связь мастер-дитэйл-сабдитэйл не обрабатывается вообще никак.
  • Наследование подтипов невозможно.
  • Не лишней была бы возможность создать атрибут типа бизнес-класс. То, что сейчас решается созданием автономного объекта и ручным связыванием его с головной записью. Пример: дополнительная информация по товарно-транспортной накладной.
Список всех бизнес-классов платформы и пакета типовых настроек Комплексная автоматизация теперь выглядит так.