30 апр. 2012 г.
Компонент gsComScaner
25 апр. 2012 г.
13 апр. 2012 г.
Firebird 2.0.7
12 апр. 2012 г.
Опять двадцать пять...
Когда 3 апреля грохнулась база предприятия Б, мы восстановили архив на 30 марта. Так как часть информации из исходной базы данных могла быть прочитана, объекты за 1-2 апреля были сохранены в поток и загружены на новую базу. В результате, некоторые записи задвоились. Почему?
Как известно, при загрузке из потока система пытается найти объект по его РУИДу или с помощью запроса из метода CheckTheSameStatement. Последний определен только для узкого круга классов, так что вся надежда на РУИДы. Если РУИД загружаемого объекта не найден, то считается что такого объекта нет и создается новая запись.
Предположим, некоторая запись была создана 20 марта на рабочей еще базе простым пользователем. РУИДа у этой записи не будет, потому как он автоматически присваивается только в трех случаях:
- Если работа идет под учетной записью Administrator.
- В момент открытия диалогового окна Свойства объекта.
- В процессе сохранения объекта в поток.
Можно ли было избежать такого неприятного развития событий? Да. Так как архивная база является копией исходной по состоянию на 30 марта, все объекты в обеих базах, созданные до указанной даты, имеют одинаковые идентификаторы. Следовательно, если мы:
- Не меняли идентификатор базы данных, восстановленной из архива. (Заметим, что даже если идентификатор базы был изменен, ничего страшного не произойдет. Главное — обеспечить равенство идентификаторов двух баз до начала выполнения шагов 2 и 3.)
- В поврежденной базе создали вручную РУИДы для всех записей.
- В архивной базе создали вручную РУИДы для всех записей.
Принудительно создать РУИДы для всех записей в базе можно с помощью приведенного здесь запроса. Обратите внимание на использование оператора MERGE.
Таким бы качеством нам документацию издать...
5 апр. 2012 г.
Обновлены библиотеки FastMM и Fast Report 4
- 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.
- добавлен экспорт 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+
Bing still sucks
3 апр. 2012 г.
На авось
- Мало купить бесперебойник — надо подключить к нему сервер.
- Мало подключить сервер к бесперебойнику — надо убедиться, что мощности последнего хватит, чтобы продержать сервер достаточное время для корректного завершения всех задач и выключения операционной системы.
- Обратная связь должна быть настроена и специальная утилита должна следить за обрывом питания и выключать сервер по прошествии некоторого времени.
- Аккумуляторы источника бесперебойного питания деградируют со временем. Проверять их работоспособность следует не реже 2-3-х раз в год.
- Предыдущее утверждение справедливо и для батарейки на RAID контроллере, которая обеспечивает энергонезависимость кэш памяти. Следите за сообщениями при загрузке сервера и регулярно проверяйте лог операционной системы.
- Мало регулярно делать архив базы, надо также регулярно проверять восстанавливается ли база из этого архива.
- Архив базы данных в десятки гигабайт будет восстанавливаться часами. Всегда следует держать на резервном сервере горячую копию, выполненную с помощью утилиты nbackup или SQL командами ALTER DATABASE BEGIN BACKUP, ALTER DATABASE END BACKUP.
- И последнее, но от этого не менее важное: резервный сервер должен быть.
В помощь системному администратору
- Если Гедымин расположен на одном компьютере с сервером Firebird и при конекте к базе данных на экране появляется сообщение Character set WIN1251 is not defined, проверьте какая библиотека используется для подключения. Наверняка это fbembed.dll, которую Гедымин при загрузке ищет первой. Если в строке подключения не прописан адрес (имя) сервера, то fbembed.dll выступит в роли встроенного сервера. Проблема в том, что подкаталог Intl, который ему нужен для поддержки символьных таблиц, будет искаться относительно расположение файла gedemin.exe. Если его там нет — получим сообщение об ошибке. Возможные решения проблемы:
- Удалить fbembed.dll. Тогда gedemin.exe будет подключаться через fbclient.dll как нормальный сетевой клиент.
- Прописать имя компьютера в строке подключения к базе данных, чтобы форсировать сетевое подключение по протоколу TCP.
- Запускаем Гедымин
- Отказываемся от конекта к базе данных
- Идем в меню Справка, окно О системе и там смотрим имя, версию и расположение.
- После ручной остановки и удаления сервиса Firebird, не забыть удалить библиотеки gds32.dll и fbclient.dll из каталога Windows\System32.
- После копирования файлов Firebird из архива и ручной установки и запуска сервиса, не забыть прописать путь в глобальной переменной среды Path к папке c:\program files\firebird\bin или куда там были переписаны файлы из архива.
- После ручного удаления старой версии gedemin.exe следует зайти в папку Windows\System32 и выполнить две команды:
- regsvr32 -u midas.dll
- del midas.dll
- Как минимум второй раз сталкиваемся с тем, что антивирус NOD32 препятствует работе сервера Firebird. Сообщение: Connection rejected by remote interface. Наверняка в нем есть соответствующие настройки, но не было времени разбираться — снесли антивирус под корень и все наладилось.
1 апр. 2012 г.
Специфика ORM модели платформы Гедымин
- Не учитывается разница между истинным абстрактным базовым классом (например, TgdcBase), и базовым классом c конкретной ListTable, который служит фундаментом для иерархии наследованных классов (например, TgdcBaseContact).
- Некоторые объекты могут использоваться только внутри кода других объектов с выполнением магических действий по программной настройке:
- Все наследники TgdcInvBaseRemains
- TgdcInvCard
- TgdcLink
- TgdcAcctDocument
- 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
- Как уже отмечалось выше, связь мастер-дитэйл обрабатывается платформой только для документов и только на уровне пользовательского интерфейса. Связь мастер-дитэйл-сабдитэйл не обрабатывается вообще никак.
- Наследование подтипов невозможно.
- Не лишней была бы возможность создать атрибут типа бизнес-класс. То, что сейчас решается созданием автономного объекта и ручным связыванием его с головной записью. Пример: дополнительная информация по товарно-транспортной накладной.