Перейти к содержанию
Fire Monkey от А до Я
  • 0

Удаление записи из таблицы БД связанной с ListView


dmdel

Вопрос

Delphi xe7, SQLite под ANDROID

Соединяю таблицу БД с компонентом ListView через Bind Visually, все нормально, показывает записи.

Пытаюсь удалить запись с помощью стандартного удаления записи (с помощью DeleteButton). Запись из ListView удаляется. С этим проблем нет. 

Пытаюсь теперь удалить эту запись из базы данных.

На событие OnDeleteItem пытаюсь поймать значение первичного ключа (ID) для этой таблицы, чтобы скриптом типа delete from dairy where id=:id удалить запись.

На показ кнопки delete исчезает выделенная строка, т.е. ListView.Selected=nil. Значение первичного ключа ID не соответствует текущей записи в этот момент.

Получается, scroll автоматом не срабатывает, выделенной записи нет. Как узнать ID записи, по которой нажали кнопку Delete, чтобы ее (запись) удалить из БД?

Ссылка на комментарий

Рекомендуемые сообщения

  • 1

попробуйте OnDeletingItem

у меня к примеру такая конструкция норм работает: (правда Bind Visually не юзаю... а в таг каждого итема засовываю нужный ключ)

procedure TFVisitPhotoComment.ListView1DeletingItem(Sender: TObject;
  AIndex: Integer; var ACanDelete: Boolean);
begin
  ...
  ...'delete bla-bla-bla where Id = :Id';
  ...ParamByName('Id').Value:= ListView1.items[AIndex].Tag;
  ...
  
  //не забываем ...
  ACanDelete := True;
  //ну или отмена удаления при необходимости
  ACanDelete := False;
end;

 

Изменено пользователем beklexx
Ссылка на комментарий
  • 0
В 13.08.2016 в 20:26, dmdel сказал:

На событие OnDeleteItem пытаюсь поймать значение первичного ключа (ID) для этой таблицы, чтобы скриптом типа delete from dairy where id=:id удалить запись.

Как-то не понятно что вы ловите, если в запросе нет SELECT ID... то что должно подставиться в  where id=:id

Ссылка на комментарий
  • 0
12 минут назад, GASCHE сказал:

Как-то не понятно что вы ловите, если в запросе нет SELECT ID... то что должно подставиться в  where id=:id

Почему нет то? Есть! Я же проверяю его значение!?!

Ссылка на комментарий
  • 0

Реализовал заполнение ListView вручную, т.е. без Bind Visually, как советовал beklexx. Заработало, беру ID из Tag.

Но неужели это никак не сделать автоматически с использованием Bind VisuallyДолжно же это быть предусмотрено

 

Ссылка на комментарий
  • 0
13 часов назад, dmdel сказал:

Реализовал заполнение ListView вручную, т.е. без Bind Visually, как советовал beklexx. Заработало, беру ID из Tag.

Но неужели это никак не сделать автоматически с использованием Bind VisuallyДолжно же это быть предусмотрено

имхо... Bind Visually противоречит шаблонам MVC, и полезен скорее для "HelloWord" проектов,

да и с СУБД лучше воевать вручную, хотя SQLite - "недобаза", однако лучше сразу "по-взрослому".

Bind Visually работает в блокирующем режиме? - неясно, скорее всего блокирует интерфейс;

насколько корректно работает AutoCommit? - неясно, видимо на каждое действие проходит commit;

какая будет ситуация с уровнями изоляции? - непонятно... слишком много потенциальных проблем.

Изменено пользователем Камышев Александр
Ссылка на комментарий
  • 0
В 14.08.2016 в 17:34, dmdel сказал:

Можете показать, как программно засовываете данные в ListView + данные в Tag?

для заполнения листвью юзаю подобное решение

procedure TFVisit.bListViewFill(LV: TListView; FDSource: TFDQuery; TextField, DetailField, TagField: string; IsClear: boolean);
var i, index: integer;
    item: TListViewitem;
begin
  if LV.Selected <> nil
    then index:= LV.Selected.Index
    else index:= -1;
    
  if FDSource.IsEmpty then
    begin
//      ShowMessage('Нет данных!');
      LV.Items.Clear;
      exit;
    end;
  if IsClear then LV.Items.Clear;
  LV.BeginUpdate;
  try
  for i:= 1 to FDSource.RecordCount do
    begin
      FDSource.RecNo:= i;
      item:= LV.Items.Add;
      item.Text:= FDSource.FieldByName(TextField).AsString;
      item.Detail:= FDSource.FieldByName(DetailField).AsString;
//      item.Bitmap.Assign(...)  
      item.Tag:= FDSource.FieldByName(TagField).AsInteger;
    end;
  finally
    LV.EndUpdate;
  end;

  if index = -1 then exit;
  if (LV.Items.Count >= index) then LV.ItemIndex:= index;
end;

ну и заполняю

tbPriceList: TFDQuery; 
.
.
.
tbPriceList.Open; //фильтрованный по необходимым условиям
bListViewFill(ListView1, tbPriceList, 'Name', 'LCP_Qty', 'ProductId', True);
tbPriceList.Close;

Мне часто приходится работать с листвью где text, detail и tag... но иногда приходится юзать остальной функционал листвью: хидеры-шмидеры, имейджи и т.д. но это уже другой вопрос

Изменено пользователем beklexx
Ссылка на комментарий
  • 0

И все-таки, хотелось бы понять, перемещение по набору данных не происходит при перемещении по ListView?

Вот тут написано, что в  FireDAC это возможно настроить, а в ClientDataSet?

Конечно, можно это перемещение организовать, но неужели не предусмотрено?

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...