Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: DataSet  (Прочитано 2312 раз)

AlekseyK

  • Новичок
  • *
  • Сообщений: 1
    • Просмотр профиля
DataSet
« : 12 Мая 2025, 03:31:00 »
Всем добрый день.
Возможно вопрос уже задавался, но поиск по форуме мне результата не дал.

Есть база данных MySQL, при старте проекта происходит чтение ее таблицы и заполнение некоторых элементов формы результатами.
Обработка выполнения SQL-запроса выглядит примерно так:

Код: (delphi)
 //  получаем таблицу инертных компонентов
procedure OnRecipeDoneSQL (DataSet:TM_DataSet)
  case DataSet.Tag of
    TABLE_ZS_GET:
      begin
        Upgrade_ZS_DataSet(DataSet);
      end;
  end;
В глобальном блоке объявлена переменная:
ZS_DataSet:TM_DataSet;

а также есть две процедуры:
Upgrade_ZS_DataSet - пересохраняет набор данных DataSet из SQL-запроса для будущей обработки
Upgrade_ZS_Record_Data  - обновляет некоторые данные на экранной форме.

Код: (delphi)
procedure  Upgrade_ZS_DataSet (DataSet:TM_DataSet);
  var
        i:  integer;
  begin

    ZS_DataSet:=DataSet;
    // Обнуляем список записей
    cm_Zs_Name_List.Clear;                 
    i:=0;

    if not ZS_DataSet.IsEmpty then
      begin
        ZS_DataSet.First;
        while not ZS_DataSet.EOF do
          begin
            ZS_DataSet.Next;
            i:=i+1;
            cm_Zs_Name_List.AddItem(ZS_DataSet[1].AsStr);
          end;
        ZS_DataSet.First;
        ZS_DataSet.Next;
        Upgrade_ZS_Record_Data(ZS_DataSet);
      end;
      Zs_Count.Value:=i;
  end;

procedure  Upgrade_ZS_Record_Data (DataSet:TM_DataSet);
  begin
  Zs_Number.Value:=DataSet.RecNo;      //показываем текущий номер записи

  fld_Zs_Name.Text            :=DataSet[1].AsStr;  // и выводим данные записи
  fld_Zs_Number.Text          :=DataSet[2].AsStr;
  fld_Zs_Manufacturer.Text    :=DataSet[3].AsStr;
  fld_Zs_Description.Text     :=DataSet[4].AsStr;
  fld_Zs_Grain.Text           :=DataSet[5].AsStr;
  end;
После старта проекта, сразу формируется SQ-запрос на чтение таблицы.
Все процедуры начиная с OnRecipeDoneSQL  отрабатывают корректно и на экране появляются данные.
Но дальнейшие обращения к переменной ZS_DataSet приводят к ошибке "Обращение к несуществующему объекту".

Например, вот такая процедура на кнопке, которая сдвигает курсор в наборе данных.
Строка "ZS_DataSet.Next" приведет к ошибке.
Код: (delphi)
procedure btn_Zs_Next_OnClick (Sender: TM_Control)
begin
  ZS_DataSet.Next;
  Upgrade_ZS_Record_Data (ZS_DataSet);
end.
Подскажите в чем ошибка?
Возможно надо как-то дополнительно обработать команду ZS_DataSet:=DataSet?
Но почему тогда при первом запуске процедур, работа с ZS_DataSet выполняется корректно?
« Изменён: 12 Мая 2025, 07:06:57 от Simple Scada »

Simple Scada

  • Глобальный модератор
  • *****
  • Сообщений: 285
    • Просмотр профиля
    • Simple-Scada
Re: DataSet
« Ответ #1 : 12 Мая 2025, 09:37:31 »
Здравствуйте.

Цитировать
Например, вот такая процедура на кнопке, которая сдвигает курсор в наборе данных.
Строка "ZS_DataSet.Next" приведет к ошибке.
Всё верно, так как работать с "Набором данных (TM_DataSet)" можно только в скриптах с типом события "Выполнен SQL-запрос". После выполнения скрипта, объекты TM_DataSet удаляются из памяти.
« Изменён: 12 Мая 2025, 09:41:22 от Simple-Scada »