C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Сортировка Query, Сортировка Query ORDER BY
zaboy
  Отправлено: 07.11.2004, 02:47


Не зарегистрирован







Привет! Такая проблема:
Для нормального отображения русских букв в DBGrid'e при чтении данных из файла dbf приходится использовать событие OnGetText и функцию перекодировки OemToChar...
Далее формирую запрос к двум связанным таблицам типа:
select FAM,IMA,OTC,VNO,NSO,VID from ANK,SOS
where ANK.VNO=SOS.NSO and SOS.VID='01' and SOS.PPO is NULL
order by FAM
Так вот сортировка идет по первым буквам фамилий, а начиная со второй буквы сортирвка идет вразнобой, т.е. Акимов, Авдеев, Быков, Баринов......
Помогите плиз!
AVC
Отправлено: 08.11.2004, 09:42


Ветеран

Группа: Модератор
Сообщений: 1583



Каким компонентом работаете?
Для начала нужно настроить правильную перекодировку — решение зависит от компонента. Может то что на экране вразнобой на самом деле правильно, но в другой кодировке?
zaboy
  Отправлено: 08.11.2004, 20:26


Не зарегистрирован







Использую компоненты Query, DataSource и DBGrid.
Код обработчика перекодировки:
void __fastcall TForm1::MyGetText(TField *Sender, AnsiString &Text, bool DisplayText)
{
char s[300];
if(Sender->IsNull) {Text=""; return;}
Sender->GetData(s, true);
OemToChar(s,s);
Text=s;
}
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Query1FAM->OnGetText = MyGetText;
Query1IMA->OnGetText = MyGetText;
Query1OTC->OnGetText = MyGetText;
}
просто советы по правке реестра (про NLS) не помогают, пришлось писать функцию...
Изначально кодировка DOS'овская.
У меня тоже была идея о том, что сортировка верная, но отображение некорректное как раз из-за того, что была произведена перекодировка...
Но тут я застопорился...
Nick
Отправлено: 09.11.2004, 08:52


Машинист паровоза

Группа: Участник
Сообщений: 247



Во всех компонентах
Font->CharSet = OEM_CHARSET;
100% не гарантирую, глубоко с этим не работал,
попробуй.
AVC
Отправлено: 09.11.2004, 09:42


Ветеран

Группа: Модератор
Сообщений: 1583



Для BDE поиграйтесь языковыми настройками BDE Administrator. Как только в SQL Explorer станет информация по-русски то и в вашем приложении она станет по-русски. Обычно спасает dBASE RUS cp866
У dbf в заголовке есть специальный байт, отвечающий за язык (применяется в поздних версиях Fox'а) можно помацать его.

После правильной настройки BDE у меня проблем с сортировкой dbf не возникало. Если не получится — положите кусок dbf сюда попробую разобраться.

PS. Желательно этот файл в неправильной кодировка не модифицировать — есть шанс получить разные строки/поля в разных кодировках.

Вернуться в Работа с базами данных в C++Builder