|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Вопрос по сортировке и отчет из таблиц
Всем привет! Объединил два интересующих вопроса в 1 тему, итак:
1.Имеется одна из 3-х таблиц адреса клиента, Houses, структура: | HouseID | CityID | StreetID | House | где House - строковый тип, это номер дома(строковый был выбран потому что дом может быть как в виде "12", так и "12А" или "12корп1") HouseID - уникальный ID дома; CityID - город, в котором нах-ся этот дом StreetID - улица, в котором нах-ся этот дом Две таблицы(с городами и улицами) сортируются посредством вторичного индекса без проблем и потом подставляются в DBLookupComboBox для выбора. С сортировкой домов проблемы, сортировать как числа не получается, а строковая сортировка здесь неправильно сортирует: 1 11 12 ... 19 1А 2 что-то в этом духе(точно не помню, но сортирует неверно) Имеется идея создать доп стобец(невидимый для ДБГрид) где будет числовая часть дома и будет сортировка сначала по нему, потом по основному. Но я не знаю как SQL-запросом перенести из String-поля числовое значение с преобразованием в число в Integer-поле(к примеру HouseNum). Если у кого есть другие предложения как отсортировать дома буду очень рад услышать! 2. Имеется сетка DBGrid. Требуется каким-нибудь удобным способом отметить нужные строки(несколько!) и передать на печать(либо в отчет, либо еще как-нибудь). Вопросы: 1) Для этого можно использовать QReport и ему подобные или возможно как-то передавать в .doc или .xls формат? Как это сделать?)) 2) Как установить выбор многих значений в сетке я знаю(multiselect), а как передать весь фокус в отчет? 3) Слышал про продвинутую DBGrid не то от ehLib или как-то так и там есть функции отметки строк галочками и.т.д. Скажите, трудоёмко будет переписать под этот компонент программу? Заранее очень благодарен!! |
#2
|
|||
|
|||
1. У меня сортировка при нажатии на Титл грида делается так:
Код:
private SortASC: Boolean; // для того, что бы запоминать какая была сортировка, что бы знать какую сделать при повторном нажатии ..... procedure TFMainForm.DBGridEh1TitleClick(Column: TColumnEh); var SQLtxt, Comman: String; begin if SortASC then SortASC := False else SortASC := True; SQLtxt := ' SELECT * FROM table.db '; if Column.FieldName <> '' then if SortASC then Comman := SQLtxt + ' ORDER BY ' + Column.FieldName + ' ASC '); else Comman := SQLtxt + ' ORDER BY ' + Column.FieldName + ' DESC '); QUery1.Close; Query1.sql.text := ''; query1.sql.text := Comman; query1.open; end; 2. Можешь передать в "CVS" он хорошо импортируется в Эксель, так как если ты не знаешь QReport то придется немного почитать тебе (если захочешь). По поводу Ehlib то он платный, если найдешь фри, то переделать под него проект раз плюнуть... для экспорта в "CVS" выделены строчки(я ничего не уберал, захочешь упростишь под себя): Код:
procedure TFMainForm.SpeedButton1Click(Sender: TObject); var Mem_ : TStringList; I, ColCount: Integer; SLine: String; DS: TDataSet; begin ColCount := DBGridEh1.Columns.Count - 1; SLine := ''; DS := DBGridEh1.DataSource.DataSet; Mem_ := TStringList.Create; SaveDialog1.Title := 'Save CVS file'; SaveDialog1.InitialDir := FileDireTxt; SaveDialog1.Filter := 'Exel file|*.cvs'; SaveDialog1.DefaultExt := 'txt'; SaveDialog1.FilterIndex := 1; if SaveDialog1.Execute then begin for I := 0 to ColCount do // шапка if DBGridEh1.Columns[i].Visible then begin SLine := SLine + '"' + DBGridEh1.Columns[i].Title.Caption + '";'; end; Mem_.Add(SLine); SLine := ''; DS.First; while not DS.Eof do begin // содержимое грида for I := 0 to ColCount do if DBGridEh1.Columns[i].Visible then begin SLine := SLine + '"' + DBGridEh1.Columns[i].DisplayText + '";'; end; Mem_.Add(SLine); SLine := ''; DS.Next; end; Mem_.SaveToFile(SaveDialog1.FileName); ShowMessage('File : '+ SaveDialog1.FileName); end else ShowMessage('Save file was cancelled'); Mem_.Free; end; ПРИ ТВОЕМ РЕШЕНИИ ВЫЛОЖИ РЕЗУЛЬТАТ, что бы и другие могли это использовать! |
#3
|
|||
|
|||
попробуи такои запрос для сортировки строк как числа.
Код:
SELECT House FROM Houses ORDER BY RIGHT('000' + House, 4) |