Удалить строку только из DBGrid - PullRequest
0 голосов
/ 08 мая 2020

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

DBgrid загружается из ADOconnection / Query / Datasource. Основное соединение - с БД, которая связана с файлом Excel. Файл XML - это просто отчет, который мы получаем каждый месяц. Обычно мы должны убедиться, что все машины в файле Excel также включены в предоставленный нам отчет. На сотнях машин я пытаюсь автоматически обнаружить любую разницу. но я не могу понять, как удалить строку в сетке, только когда она находит совпадение. Таким образом, в сетке находятся только несовпадающие элементы.

Ответы [ 3 ]

5 голосов
/ 08 мая 2020

Вы не можете удалять строки из DBGrid. Вы удаляете их из набора данных, к которому подключен DBGrid. DBGrid просто отображает данные из набора данных. Если вы хотите удалить строку, удалите ее из этого набора данных, используя метод .Delete.

После прочтения сделанного вами редактирования мне кажется, что вы должны загружать данные запроса в TClientDataSet ( CDS), а затем прикрепить этот CDS к источнику данных DBGrid. Затем вы можете делать с этим CDS все, что захотите, не затрагивая исходные данные, если вы не вызываете метод CDS ApplyUpdates.

1 голос
/ 08 мая 2020

Один из вариантов сделать строки / записи vani sh из dbGrid и других элементов управления, учитывающих данные, - это использовать OnFilterRecord TDataSet и возвращать false для строк, которые вы больше не хотите видеть. Он не влияет на базовые данные - он просто отфильтровывает то, что видно.

procedure TDM1.FDQueryTopicListFilterRecord(DataSet: TDataSet; var Accept: Boolean);
begin
   // Check if the row should be shown - set Accept to true if it should, false if not
end;
1 голос
/ 08 мая 2020

То, что Кен Уайт говорит в своем ответе, на 100% правильно, но я думаю, что есть еще кое-что, на что стоит обратить внимание, особенно когда вы упоминаете XML.

В отличие от некоторых других потомков TDataSet, как TClientDataSet, так и более современные наборы данных FireDA C реализуют свойство UpdateStatus набора данных, и это отражает то, что произошло с текущей записью в наборе данных - подробности см. в интерактивной справке. Это перечисление [1] , объявленное как

type
  TUpdateStatus = (usUnmodified, usModified, usInserted, usDeleted);

Вы говорите, что хотите сравнить записи с тем, что у вас есть в файле XML, и удалить записи, которые не были обновлено «из DBGrid», что, как сказал Кен, само по себе не имеет смысла.

Однако есть другой способ добиться того, чего вы, кажется, хотите. Если вы можете загрузить данные, отображаемые в наборе данных, подавая сетку из файла XML. тогда вы знаете, что, пока вы не обновите набор данных, записи должны соответствовать XML. Итак, после обновления записей в вашем приложении, вместо того, чтобы сравнивать все записи в наборе данных с их эквивалентами XML, вы можете просто удалить (из набора данных) записи, UpdateStatus которых равен usUnmodified. Это тривиально сделать с помощью такого метода:

procedure TForm1.DeleteUnmodifiedRecords;
begin
  ClientDataSet1.DisableControls;
  try
    ClientDataSet1.First;
    while not ClientDataSet1.Eof do begin
      if ClientDataSet1.UpdateStatus = usUnModified then
        ClientDataSet1.Delete
      else
      ClientDataSet1.Next;
      end;
  finally
    ClientDataSet1.EnableControls;
  end;
end;

, и это, конечно же, удалит записи из DBGrid.

Конечно, это предполагает, что вы можете загрузить XML данные в TClientDataSet или FireDA C набор данных, либо напрямую, либо путем преобразования XML в форму, которую любой из них может загружать с помощью компонента TXmlTransform, но я не буду go вдаваться в подробности этого здесь.

[1]: Следует остерегаться того, что usModified не кажется точным логическим отрицанием usUnmodified. Это имеет несколько неожиданное последствие: если вы примените StatusFilter [usModified] к CDS, записи, которые были изменены, могут появиться дважды, один раз в исходной форме и один раз в измененной форме - см. Рис. 6.5 Кэри Дженсена "* 1031" * Подробнее: ClientDataSets », 1-е издание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...