Как вы получаете доступ к памятке для извлечения записи для редактирования в Delphi? - PullRequest
0 голосов
/ 17 октября 2018

Я знаю, как получить информацию из запроса ADO на основе уникального идентификатора.Есть ли способ сделать это с помощью memtable, но без уникального идентификатора, чтобы установить запись для редактирования.Можете ли вы использовать только выбранный в данный момент элемент в memtable?

Редактировать:

Это Tkbmmemtable, это компонент третьей части, но я предполагаю, что он работает аналогично тому, что встроено в Delphi.Короче говоря, есть форма, которая получает данные от пользователя.Каждый раз, когда вы нажимаете «ОК», он добавляет его в таблицу tkbmmemtable (которая отображается для пользователя в сетке) и хранится там до тех пор, пока пользователь не нажмет «Запись в базу данных», а затем он будет записан в бэкэнд с уникальным идентификатором.Я пытаюсь включить возможность двойного щелчка мышью на записи в сетке, и у меня появляется экран, на котором они могут редактировать данные, а затем отправлять их обратно в таблицу памяти.

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

логика будет такой: 1. вытащить данные с помощью adoquery 2. поместить данные в memtable 3. пользователь будет редактировать значения 4. сохранить изменения
обработать вашу memtable как контейнер.поэтому при сохранении в базу данных ваш код будет выглядеть примерно так:

var
script : string;
begin
  if insert then
  begin
   script :=
     'insert into table(c1, c2, c3) values (' +
      QuotedStr(memTable.FieldByName('c1').AsString) + ',' +
      QuotedStr(memTable.FieldByName('c1').AsString) + ',' +
      QuotedStr(memTable.FieldByName('c1').AsString) + ' ' +
      ')';
  end
  else
  begin
    script :=
      'update table set ' +
      'c1='+ QuotedStr(memTable.FieldByName('c1').AsString) + ',' +
      'c1='+ QuotedStr(memTable.FieldByName('c1').AsString) + ',' +
      'c1='+ QuotedStr(memTable.FieldByName('c1').AsString) + ',' +
      'where id = ' + IntToStr(memTable.FieldByName('id').AsInteger);
  end;
 // adoQuery.Execute(script);

end;
0 голосов
/ 17 октября 2018

Можете ли вы использовать только выбранный в данный момент элемент в Memtable?

Краткий ответ - "Да", как решительно объяснил @KenWhite.

Причинаответ «Да» объясняется тем, как TDataSet и его потомки, такие как TKbmMemtable, работают.

Возможно, вы знаете, что определенное поведение TDataSet и др. состоит в том, что он моделирует внутренний «курсор», который точно указываетодна запись в наборе данных, и эта запись обрабатывается TDataSet и всеми элементами управления с поддержкой db как «активная» запись: вы перемещаетесь по набору данных, перемещая логический курсор такими методами, как First, Last, Next, Locate и т. Д.

Внутренне, когда TDataSet открыт, он имеет массив «буферов», которые являются указателями на динамически распределенные блоки памяти, каждый из которых хранит данные одного из смежных диапазоновзаписи в наборе данных.Количество буферов фиксируется при открытии набора данных и определяется тем, какие компоненты с поддержкой db подключены к набору данных;обычно их достаточно для хранения строк в TDbGrid.

TDataSet имеет метод (функцию) ActiveBuffer, который определен в DB.Pas как

function TDataSet.ActiveBuffer: PChar;
begin
  Result := FBuffers[FActiveRecord];
end;

Любая операция редактирования данных набора данных работает с данными записи в ActiveBufferОн идентифицируется просто указателем, который возвращает TDataSet.ActiveBuffer.Это все, что нужно, и именно поэтому операции редактирования записи в наборе данных в памяти работают нормально без ID / PK / SequenceNumber или какого-либо другого поля.

Вот и все, правда.

...