Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.10.2009, 23:17
Ruschel Ruschel вне форума
Прохожий
 
Регистрация: 06.10.2009
Сообщения: 10
Репутация: 10
Вопрос Вопрос по сортировке и отчет из таблиц

Всем привет! Объединил два интересующих вопроса в 1 тему, итак:
1.Имеется одна из 3-х таблиц адреса клиента, Houses, структура:
| HouseID | CityID | StreetID | House |
где House - строковый тип, это номер дома(строковый был выбран потому что дом может быть как в виде "12", так и "12А" или "12корп1")
HouseID - уникальный ID дома;
CityID - город, в котором нах-ся этот дом
StreetID - улица, в котором нах-ся этот дом
Две таблицы(с городами и улицами) сортируются посредством вторичного индекса без проблем и потом подставляются в DBLookupComboBox для выбора. С сортировкой домов проблемы, сортировать как числа не получается, а строковая сортировка здесь неправильно сортирует:
1
11
12
...
19

2
что-то в этом духе(точно не помню, но сортирует неверно)
Имеется идея создать доп стобец(невидимый для ДБГрид) где будет числовая часть дома и будет сортировка сначала по нему, потом по основному. Но я не знаю как SQL-запросом перенести из String-поля числовое значение с преобразованием в число в Integer-поле(к примеру HouseNum).
Если у кого есть другие предложения как отсортировать дома буду очень рад услышать!
2. Имеется сетка DBGrid. Требуется каким-нибудь удобным способом отметить нужные строки(несколько!) и передать на печать(либо в отчет, либо еще как-нибудь). Вопросы:
1) Для этого можно использовать QReport и ему подобные или возможно как-то передавать в .doc или .xls формат? Как это сделать?))
2) Как установить выбор многих значений в сетке я знаю(multiselect), а как передать весь фокус в отчет?
3) Слышал про продвинутую DBGrid не то от ehLib или как-то так и там есть функции отметки строк галочками и.т.д. Скажите, трудоёмко будет переписать под этот компонент программу?

Заранее очень благодарен!!
Ответить с цитированием
  #2  
Старый 08.10.2009, 18:06
Sed0Y Sed0Y вне форума
Прохожий
 
Регистрация: 29.09.2009
Сообщения: 10
Репутация: 10
По умолчанию

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  
Старый 09.10.2009, 14:36
Babuca Babuca вне форума
Прохожий
 
Регистрация: 09.08.2009
Сообщения: 27
Репутация: 10
По умолчанию

попробуи такои запрос для сортировки строк как числа.
Код:
SELECT House FROM Houses ORDER BY RIGHT('000' + House, 4)
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:08.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter