1

Тема: Delphi сортування у таблиці

Для сортування по полю написав так:

procedure TOrchardProgr_Fr.BuName_MnItClick(Sender: TObject);
begin
  NS_ADOTb.IndexFieldNames:='Name sort';
end;

Скомпілювалось нормально.

Та при натиснені на MenuItem(BuName_MnIt)

Випливає повідомлення про помилку:
"Аргументи мають неправильний тип, лежать поза межами припустимого діапазону, або конфліктують один з одним.

Підкажіть де мій промах

2

Re: Delphi сортування у таблиці

Важко щось вгадувати, але швидше за все помилка в невірному індексі.
А так то - дебажте вглиб :)

Подякували: Romanvolja1

3

Re: Delphi сортування у таблиці

Romanvolja
Якщо я правильно пам'ятаю, то туди лише назву індекса можна вписувати, по якому треба сортувати. Якщо треба сортувати по довільних полях, то треба використовувати ADOQuery і в кінець запиту додавати ORDER BY.

Подякували: Romanvolja1

4

Re: Delphi сортування у таблиці

В мене б/д на основі MS Access.

Не знаю чому, та проблема була в тому, що назви полів в таблиці "Access" були з пробілом: "Name sort"

Змінив назву поля в таблиці "Access" на:  "NameSort"

procedure TOrchardProgr_Fr.BuName_MnItClick(Sender: TObject);
begin
  NS_ADOTb.IndexFieldNames:='NameSort';
end;

І все запрацювало нормально.

5

Re: Delphi сортування у таблиці

Romanvolja
Воно мабуть подвійні лапки хотіло:

NS_ADOTb.IndexFieldNames:='"Name Sort"';
Подякували: Romanvolja1

6

Re: Delphi сортування у таблиці

Доброго вечора.

Вертаюся ще раз до цієї теми, так як у мене виникли деякі проблеми.
Щоби відсортувати таблицю вказуємо у властивості IndexFieldNames назву стовпчика(колонки).
а як відсортувати дані у підлеглій таблиці, коли властивість IndexFieldNames вже занятата, так як там прописаний звязок з головною таблицею наприклад(ID_Main)

7

Re: Delphi сортування у таблиці

Це як? Основна таблиця задається через MasterSource.

8

Re: Delphi сортування у таблиці

koala написав:

Це як? Основна таблиця задається через MasterSource.

Саме так:

    IndexFieldNames = 'ID_Main'
    MasterFields = 'ID'
    MasterSource = Main_DSr

9

Re: Delphi сортування у таблиці

Якщо робити через *Query, то там за допомогою ORDER BY можна сортувати. А якщо у вас якийсь прямий доступ до бази, то можна проміжний датасет зробити. В старих Делфях є зв'язка TClientDataSet+TDataSetProvider, а у нових є іще й TFDMemTable. В обох випадках ви можете отримати дані з початкового набору даних, трансформувати їх, і уже потім вивести на екран. Щоправда, можливо треба буде ручками оновлювати проміжний датасет після оновлення початкового.

Подякували: Romanvolja1

10

Re: Delphi сортування у таблиці

Пробував двома варіантами сортувати але обидва щось непрацюють.
Першим пробував через DBGrid>TitleClick

procedure TMainForm.LangGrTitleClick(Column: TColumn);
Var
  f:string;
begin
  if DBGrid.DataSource.DataSet.FieldByName(Column.FieldName).Tag=0 then
   begin
    f :=' ASC';
    DBGrid1.DataSource.DataSet.FieldByName(Column.FieldName).Tag := 1;
   end
  else
   begin
    f :=' DESC';
    DBGrid1.DataSource.DataSet.FieldByName(Column.FieldName).Tag := 0;
   end;
 DBGrid1.DataSource.DataSet.Sort:=Column.FieldName + f;
end;

Помилка виходить тут(виділена червоним) DBGrid1.DataSource.DataSet.Sort:=Column.FieldName + f;

Другий варіант у мене такий:

procedure TSortForm.SaveBtClick(Sender: TObject);
var
  ParamSort: String;
begin
  If RadioButton1.Checked then
    begin
      ParamSort:=' ASC'
    end;
  If RadioButton2.Checked then
    begin
      ParamSort:=' DESC'
    end; 
  If ComboBox1.ItemIndex=0 then
    begin
      MainForm.DBGrid1.DataSource.DataSet.IndexFieldNames:='ID'+ParamSort;
    end;   
  If ComboBox1.ItemIndex=1 then
    begin
      MainForm.DBGrid1.DataSource.DataSet.IndexFieldNames:='Foreign'+ParamSort;
    end;
  If ComboBox1.ItemIndex=2 then
    begin
      MainForm.DBGrid1.DataSource.DataSet.IndexFieldNames:='Ukrainian'+ParamSort;
    end;
end;

У другому варіанті помилку вибиває тут:-"IndexFieldNames"

Хоча якщо другий варіант спростити так як нище то працює відмінно.

procedure TSortForm.SaveBtClick(Sender: TObject);
var
  ParamSort: String;
begin
  If RadioButton1.Checked then
    begin
      ParamSort:=' ASC'
    end;
  If RadioButton2.Checked then
    begin
      ParamSort:=' DESC'
    end; 
  If ComboBox1.ItemIndex=0 then
    begin
      RiderForm.ADOTable1.IndexFieldNames:='ID'+ParamSort;
    end;   
  If ComboBox1.ItemIndex=1 then
    begin
      RiderForm.ADOTable1.IndexFieldNames:='Foreign'+ParamSort;
    end;
  If ComboBox1.ItemIndex=2 then
    begin
      RiderForm.ADOTable1.IndexFieldNames:='Ukrainian'+ParamSort;
    end;
end;

Може хтось підкаже в чому моя помилка буду дуже вдячний.

11

Re: Delphi сортування у таблиці

MainForm.DBGrid1.DataSource.DataSet має тип TDataSet, а RiderForm.ADOTable1 має тип TADOTable. TADOTable - це нащадок TDataSet з деякими додатковими методами та властивостями, серед яких IndexFieldNames. TDataSet ніякого IndexFieldNames не має. Вирішити цю проблему можна через приведення типів, якщо ви впевнені, що MainForm.DBGrid1.DataSource.DataSet - це насправді завжди TADOTable:

(MainForm.DBGrid1.DataSource.DataSet as TADOTable).IndexFieldNames:='ID'+ParamSort;

Подробиці: http://docwiki.embarcadero.com/RADStudi … References

Подякували: Romanvolja, leofun012

12

Re: Delphi сортування у таблиці

Пане Torbins щиро вам дякую за допомогу, бо я ніяк не міг допетрати в чому проблема, а з вашою допомогою сортування за працювало.

Сортування
procedure TSortForm.BtSaveClick(Sender: TObject);
var
  SParamSort, SNameColumns: String;
  INumColumns: Integer;
begin
  If RBtSortUpDown.Checked then
    begin
      SParamSort:=' ASC'
    end;
  If RBtSortDownUp.Checked then
    begin
      SParamSort:=' DESC'
    end;
  INumColumns:=CBxLictColumns.ItemIndex;
  SNameColumns:=MainForm.GrLang.DataSource.DataSet.Fields[INumColumns].FieldName;
  (MainForm.GrLang.DataSource.DataSet as TADOTable).IndexFieldNames:=SNameColumns+SParamSort;
  SortForm.Close;
end;

У мене вибірка даних, додавання, редагування та пошук працювало добре, а от сортування ніяк не хотіло йти.

Вибірка даних
procedure TMainForm.GrLangCellClick(Column: TColumn);
begin
  EdID.Clear;
  EdID.Text:=IntToStr(GrLang.DataSource.DataSet.FieldByName('ID').AsInteger);
  EdLangForeign.Clear;
  EdLangForeign.Text:=GrLang.DataSource.DataSet.FieldByName('Foreign').AsString;
  EdLangUa.Clear;
  EdLangUa.Text:=GrLang.DataSource.DataSet.FieldByName('Ukrainian').AsString;
  MmNote.Clear;
  MmNote.Text:=GrLang.DataSource.DataSet.FieldByName('Note').AsString;   
end;
Додавання та редагування
procedure TFormRider.SaveBtClick(Sender: TObject);
begin 
  if EdID.Text<>'' then
    begin
      MainForm.GrLang.DataSource.DataSet.Edit;
    end
  else
    begin
      MainForm.GrLang.DataSource.DataSet.Insert;
    end;
  MainForm.GrLang.DataSource.DataSet.FieldByName('Foreign').AsString:=EdLangForeign.Text;
  MainForm.GrLang.DataSource.DataSet.FieldByName('Ukrainian').AsString:=EdLangUa.Text;
  MainForm.GrLang.DataSource.DataSet.FieldByName('Note').AsString:=MmNote.Text;
  FormRider.Close;
end;
Пошук
procedure TFormFind.BtSaveClick(Sender: TObject);
var
  STextFind, SNameColumns: String;
  INumColumns: Integer;
begin
  INumColumns:=CBxLictColumns.ItemIndex;
  SNameColumns:=MainForm.GrLang.DataSource.DataSet.Fields[INumColumns].FieldName;
  If EdTextFind.Text<>'' then
    begin
      STextFind:=EdTextFind.Text;
      MainForm.GrLang.DataSource.DataSet.Locate(SNameColumns,STextFind,[]);
      FormFind.Close;
    end
  else
    begin
      ShowMessage('Заповніть поле');
    end;
end;

Дякуючи вам також запрацювало сортування DBGrid>TitleClick та є проблема з полем Memo

Сортування
procedure TMainForm.GrLangTitleClick(Column: TColumn);
Var
  SParamSort:string;
begin
  if GrLang.DataSource.DataSet.FieldByName(Column.FieldName).Tag=0 then
   begin
    SParamSort:=' ASC';
    GrLang.DataSource.DataSet.FieldByName(Column.FieldName).Tag := 1;
   end
  else
   begin
    SParamSort:=' DESC';
    GrLang.DataSource.DataSet.FieldByName(Column.FieldName).Tag := 0;
   end;
  (GrLang.DataSource.DataSet as TADOTable).Sort:=Column.FieldName+SParamSort;
end;

Ще раз дякую за допомогу. Коли все працює можна трішки розслабитися.
За ваше здоров'я  *DRINK*