Показать сообщение отдельно
Старый 21.01.2009, 03:24   #4  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5803 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Оказалось, что "исправление втихоря" в 4-ке было связано с переходом на Unicode. В общем, метод find() ищет строки, используя итератор и передавая ему ссылку на функцию сравнения записей; та же, в свою очередь, перво-наперво сравнивает коды компаний двух записей, а потом пробегается по полям, используемым для сортировки, и сравнивает их значения с помощью некой функции _DBICompare().
Данная функция предназначена для сравнения уникальных ключей, составленных из значений различных примитивных типов (строковые, BCD, целочисленные, даты, etc). В основном это используется, я так понял, на DataSource'ах, при переиндексации таблиц через DictTable.reindex() и xCompany.reindex(), а также в RecordSortedList, в UtilElements, возможно, и во временных таблицах. Так вот, при условии, что в текущей локали не используется какая-нить многобайтовая кодировка и база не инициализирована для использования Unicode'а, для строковых значений эта функция в 3-ке тупо использует функцию strncmp() со всеми вытекающими... В 4-ке же используется CompareStringW() из kernel32.dll с флагами NORM_IGNORECASE | NORM_IGNOREKANATYPE | NORM_IGNOREWIDTH, поэтому и работает все, как положено.

Последний раз редактировалось gl00mie; 21.01.2009 в 03:28.
За это сообщение автора поблагодарили: Logger (5), aidsua (1).