Лучший способ поменять местами две записи в TDataset Delphi?

Новичок в Delphi и программировании баз данных в целом, но мне любопытно, есть ли лучший способ поменять местами записи в TDataset? Я прочитал некоторую помощь и не могу найти никаких очевидных методов. В настоящее время у меня реализована процедура для перемещения записей по набору данных до тех пор, пока они не достигнут маркера Eof. Однако я получаю некоторые странные ошибки, когда добираюсь до последней записи в своих данных. Все, что у меня есть, это реализованная стандартная процедура подкачки в стиле массива, пытающаяся сохранить данные и еще много чего при жонглировании активными записями.

Код до сих пор

procedure TForm2.btnDownClick(Sender: TObject);
var
   sTmp,sTmp2  : string;
   iTmp,iTmp2  : integer;
begin
   tblMatched.DisableControls;
   if ( tblMatched.Eof <> true ) then
   begin
      // Grab data to swap
      tblMatched.GotoBookmark( tblMatched.GetBookmark );
      iTmp := tblMatched.Fields[0].AsInteger;
      sTmp := tblMatched.Fields[1].AsString;
      tblMatched.Next;
      iTmp2 := tblMatched.Fields[0].AsInteger;
      sTmp2 := tblMatched.Fields[1].AsString;

      // Swap data
      tblMatched.Prior;
      tblMatched.Edit;
      tblMatched.Fields[0].Value := iTmp2;
      tblMatched.Fields[1].Value := sTmp2;

      tblMatched.Next;
      tblMatched.Edit;
      tblMatched.Fields[0].AsInteger := iTmp;
      tblMatched.Fields[1].AsString := sTmp;
   end;
   tblMatched.EnableControls;
end;

person wfoster    schedule 13.07.2010    source источник


Ответы (1)


Похоже, вы используете набор данных в памяти, например TClientDataset. Если вы просто поместите индекс в набор данных, он сохранит для вас порядок, и вам не придется переупорядочивать их вручную. Просто настройте индекс на основе любых критериев, которые вы хотите использовать.

person Mason Wheeler    schedule 13.07.2010
comment
Да, я использую набор данных в памяти. Мне нужно сохранить естественный порядок записей, поскольку пользователь может управлять порядком записей (т. Е. Перемещать запись вниз или вверх). - person wfoster; 14.07.2010
comment
Не уверен, что это относится ко всем наборам данных, но я знаю, что в TClientDataset вы можете определить более одного индекса. Попросите одного из них сохранить естественный порядок и добавьте в набор данных поле порядка, которое поддерживает заданный пользователем порядок. Поместите индекс в это поле и сделайте его активным, когда он отображает данные пользователю. Затем переключитесь на индекс естественного порядка, когда вам нужно работать с данными в этом порядке. - person Mason Wheeler; 14.07.2010
comment
Итак, если у меня есть поле порядка и я хочу уменьшить его (т. е. переместить вверх набор данных), то все, что мне нужно сделать, это уменьшить поле порядка в активной записи? Как насчет записи, которую он заменяет? Могу ли я получить этот, прежде чем опубликовать уменьшенный? - person wfoster; 14.07.2010
comment
Нет, у вас может быть только одна активная запись одновременно. Вы захотите изменить значение порядка обеих записей. Попробуйте сначала вызвать DisableControls для набора данных, чтобы избежать побочных эффектов при обмене данными. - person Mason Wheeler; 14.07.2010