Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Список значений в Locate, вариантный массив 
V
    Опции темы
Akella
  Дата 18.5.2011, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Есть что-то вроде универсальной процедуры для Refresh`а набора данных.

в неё передаётся ссылка на грид: cxGridDBTableView.

Запись сначала нужно найти, а потом выполнить Refresh, т.к. Refresh обновляет только одну активную (сфокусированную) запись.

Код

procedure RefreshDataSet(cxGridDBTableView: TcxGridDBTableView);
Var
 n: string;
 v: variant;
begin
  if cxGridDBTableView = nil then exit;
  n := cxGridDBTableView.DataController.KeyFieldNames;
  if n = '' then exit;
  if VarIsNull(cxGridDBTableView.DataController.DataSet.FieldByName(n).Value) then exit;

  //обрабатываем, если несколько ключевых полей (ID;ID_TYPE;)
  if POS(';', n) <> 0 then
    begin

      if cxGridDBTableView.DataController.DataSet.Locate(n,
          VarArrayOf([cxGridDBTableView.DataController.DataSet.FieldByName('F1').Value,
                      cxGridDBTableView.DataController.DataSet.FieldByName('F2').Value,
                      cxGridDBTableView.DataController.DataSet.FieldByName('Fx').Value
                    ]),
          [])
      then
        cxGridDBTableView.DataController.DataSet.Refresh;

    end;//if POS()

  //обрабатываем, если только одно ключевое поле
  if POS(';', n) = 0 then
    begin

      if cxGridDBTableView.DataController.DataSet.Locate(n,
          cxGridDBTableView.DataController.DataSet.FieldByName(n).Value, [])
      then
        cxGridDBTableView.DataController.DataSet.Refresh;

    end;//if POS()
end;


Проблема в том, что ключевых полей может быть несколько. Как во второй параметр передать значения заранее неизвестного количества полей? Ключевых полей может быть не 2, а 3 или 4, например. Т.е. заранее неизвестно.
PM MAIL   Вверх
Keeper89
Дата 18.5.2011, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 1
Всего: 58



Массив с названием полей не пойдет?


--------------------
PM MAIL WWW   Вверх
Akella
Дата 18.5.2011, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Я так понял, что значения нужно записать в VarArrayOf (вариантный динамический массив)?

Добавлено через 31 секунду
Цитата(Keeper89 @  18.5.2011,  11:02 Найти цитируемый пост)
Массив с названием полей не пойдет? 

Нужны не названия, а значения полей.

Добавлено через 6 минут и 46 секунд
Для начала нужно объявить:
Код

v: array of variant;

PM MAIL   Вверх
Akella
Дата 18.5.2011, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Код

  //обрабатываем, если несколько ключевых полей (ID;ID_TYPE;)
  if POS(';', n) <> 0 then
    begin

      i := CountPos(';', n);
      v := VarArrayCreate(i, varVariant);

      for i := 0 to high(v) do
        with TStringList.Create do
        begin
          text := StringReplace(n, ';', #13#10, [rfReplaceAll]);
          v[i] := Strings[i];
        end;


      if cxGridDBTableView.DataController.DataSet.Locate(n, v, [])
      then
        cxGridDBTableView.DataController.DataSet.Refresh;

так?
PM MAIL   Вверх
Keeper89
Дата 18.5.2011, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 1
Всего: 58



А зачем для обновления текущей записи нужны значения полей?


--------------------
PM MAIL WWW   Вверх
superVad
Дата 18.5.2011, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 3
Всего: 15



Повыбирал кусочки - как я это делал:
Код

type
  t_locate_values = array of Variant;
...
var
  locate_values: t_locate_values;
  key_fields_sl: TStringList;
...
    SetLength(locate_values, key_fields_sl.Count);// в key_fields_sl ключевые поля
    for sl_index := 0 to key_fields_sl.Count-1 do
    begin
      locate_values[sl_index] := тут значение поля передаешь;
    end;
    ds.Locate(locate_fields,VarArrayOf(locate_values),[]);


Это сообщение отредактировал(а) superVad - 18.5.2011, 15:17
PM MAIL   Вверх
Akella
Дата 18.5.2011, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Цитата(Keeper89 @  18.5.2011,  11:50 Найти цитируемый пост)
А зачем для обновления текущей записи нужны значения полей? 

Не текущей, в том-то  и дело.

Приложение так построено, что можно открывать сколько угодно много форм редактирования записи. Т.е. пользователь может открыть сразу несколько форм для редактирования разных записей.

Добавлено через 2 минуты и 16 секунд
superVad, ну я почти также и реализовал.

Только теперь это уже ни к чему.

Как оказалось, запросы на Refresh сформулировать очень сложно. Легче просто переоткрыть набор данных.

Поэтому я переоткрываю полностью набор данных.

В остальных случаях locate+refresh работает нормально smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0466 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.