30 нояб. 2010 г.

Ищут пожарные, ищет милиция

Что приятно, теперь в любой момент загляни в базу резюме на rabota.by и обязательно найдется кто-то со знанием Гедымина.

А мы, в свою очередь, продолжаем набирать людей. Нам нужны:
  • Программисты (Delphi, SQL, WinAPI)
  • Специалисты по внедрению и сопровождению (знание основ баз данных, программирования и бухучета обязательно)
  • Технический писатель

Чуствуете в себе силы? Желаете пополнить наш дружный коллектив? Ищите возможность участия в амбициозном проекте? Заполняйте форму у нас на сайте.

29 нояб. 2010 г.

32 или 64? Определение разрядности ОС из bat файла

Чтобы из пакетного файла определить какая операционная система установлена приходится буквально стучать в бубен и взывать к духам предков:

set RegQry=HKLM\Hardware\Description\System\CentralProcessor\0
reg.exe Query %RegQry% > checkOS.txt
find /i "x86" < CheckOS.txt > StringCheck.txt

if %ERRORLEVEL% == 0 (
goto os32
) else (
goto os64
)

:os32
rem do something here
goto check_done

:os64
rem OS is 64 bit

:check_done
del StringCheck.txt
del CheckOS.txt

21 нояб. 2010 г.

А ларчик просто открывался!

Оказалось, избавиться от регистрации midas.dll — простейшая вещь. Берем утилиту regsvr42 и запускаем:

regsvr42 -client:gedemin.exe midas.dll

На выходе получаем два манифеста, для выполняемого файла и COM сервера.

gedemin.exe.manifest:



  
          
              
          
  

midas.sxs.manifest:







    

    

    

    



Собственно и все. Осталось избавиться от обращений к системному реестру и переносимый Гедымин будет готов.

Подробнее, про регистрацию COM серверов side-by-side можно прочитать здесь.

14 нояб. 2010 г.

Такой шанс бывает лишь раз

Oracle таки сделала это. Минимальная цена на MySQL выросла в четыре раза и составляет теперь 2000 USD с сервера. Вопреки распространенному заблуждению, MySQL никогда не был полностью бесплатным сервером. Свободно можно было использовать только community edition (движок без поддержки транзакций) и только для open source проектов. Таким образом, перед Firebird открывается блестящая возможность заполучить часть пользователей MySQL, которые будут искать альтернативный сервер. Учитывая, что основная сфера применения MySQL &mdash это веб, где большое количество одновременных подключений к базе на мощных многопроцессорных и многоядерных серверах, распараллеливание запросов и общий кэш становятся приоритетом номер один. Будем надеяться, что Firebird 3.0 не заставит себя долго ждать.

12 нояб. 2010 г.

Поиск дублирующихся FOREIGN KEY

Стандарт SQL запрещает создание более одного первичного ключа для таблицы, а вот количество внешних ключей по одному и тому же полю никак не ограничивается. Хотя ясно, что свыше одного — это пустая нагрузка на сервер и лишний индекс в базе данных. Запрос ниже помогает найти дублирующиеся внешние ссылки.
SELECT
  rf.rdb$relation_name,
  rf.rdb$field_name,
  LIST(TRIM(rc.rdb$constraint_name)),
  COUNT(*)
FROM
  rdb$indices i
  JOIN rdb$index_segments iseg 
    ON iseg.rdb$index_name = i.rdb$index_name
  JOIN rdb$relation_constraints rc 
    ON rc.rdb$index_name = i.rdb$index_name
      AND rc.rdb$constraint_type = 'FOREIGN KEY'
  JOIN rdb$relation_fields rf 
    ON rf.rdb$relation_name = i.rdb$relation_name
      AND iseg.rdb$field_name = rf.rdb$field_name
GROUP BY
  1, 2
HAVING
  COUNT(*) > 1

9 нояб. 2010 г.

Шажок к MVC

С выходом версии 2.5.7 с форм стандартных бухгалтерских отчетов и складской карточки исчезли компоненты xdeStart и xdeFinish. Их заменил компонент ввода периода gsDatePeriod. Но, не спешите с заменами по тексту скрипт-функций. Модель MVC запрещает обращение к визуальным контролам из кода прикладной логики. В интерфейсы классов Tgdv_frmG, Tgdc_frmInvCard добавлены свойства DateBegin, DateEnd. Их (и только их!) следует использовать для считывания и установки периода построения отчета.

Код, который обращался напрямую к удаленным компонентам работать не будет. В процессе апгрейда БД, Гедымин ищет в исходных текстах обращение к xdeStart, xdeFinish и меняет на работу со свойствами. Естественно, что трудно создать абсолютно универсальный алгоритм. Поэтому, после апгрейда следует открыть редактор скрипт-объектов и поискать в текстах функций строки "xdeStart", "xdeFinish". Если что найдется — исправлять вручную.

В эталоне присутствует код, который проверяет наличие компонента xdeStart или gsDatePeriod и обращается или к одному, или ко второму.
if Assigned(OwnerForm.FindComponent("xdeStart")) then
  ...
elseif Assigned(_
  OwnerForm.FindComponent("gsPeriodEdit")) then
  ...
end if
Я думаю, стоит пройтись по исходникам и заменить на обращение к свойствам формы без всяких проверок.
Other.FieldByName("Period").AsString = _
  "за период с " & OwnerForm.DateBegin & _
  " по " & OwnerForm.DateEnd
На эталоне одна пользовательская форма содержит компоненты xdeStart, xdeFinish. Это Книга покупок. Найти ее можно в Глобальном хранилище, по вхождению строки xdeStart в значения параметров. Форма книги покупок наследуется от Tgdv_frmG поэтому с нее компоненты надо удалить вручную. Для этого открываем в окне Хранилища просмотр текста DFM формы и удаляем из него описание объектов xdeStart, xdeFinish, а заодно и метки к ним: Label1, Label2.

Клиентам, которые работают с Книгой покупок, после установки версии 2.5.7 следует или проделать операции ручного удаления компонентов из DFM или загрузить новые версии настроек.

5 нояб. 2010 г.

Добавляя новые типы параметров

Двоичные форматы — это зло. Пишутся в поток быстро, занимают мало места, но дальше начинается сплошной геморрой. Просмотреть невозможно, стандарным поиском по базе данных пользоваться нельзя и, самое неприятное, когда программист не позаботился об изменении структуры потока в будущем. Типичный пример — список параметров макроса в двоичном потоке (см. метод SaveToStream класса TgsParamData в модуле prm_ParamFunctions_unit.pas). Хорошо, здесь нашелся относительно безболезненный выход: все последние расширения дописываются в поле комментария при записи, изымаются и распознаются при считывании. Например, признак "Обязательный", дописывается в коментарий как последовательноcть ^R, порядок сортировки выпадающих списков задается как ^A и ^D, и т.д.

Более затратным, но и более удобным способом было бы хранение параметров прямо в тексте макроса. Например:
Sub Test (A, B, C)
  '<params>
  '  <param name="A" required="TRUE" type="INTEGER" />
  '  <param name="B" type="LIST" values="..." />
  '  <patam name="C" type="DBLIST" table="GD_CONTACT" />
  '</params>

  'Test's actual code goes here
End Sub
Опытный разработчик определял бы типы параметров прямо в тексте, а для начинающего &mdash мы сохранили бы отдельную вкладку, в том виде, в котором она существует сейчас.