1
Ваши вопросы / DataSet
« : 12 Мая 2025, 03:31:00 »
Всем добрый день.
Возможно вопрос уже задавался, но поиск по форуме мне результата не дал.
Есть база данных MySQL, при старте проекта происходит чтение ее таблицы и заполнение некоторых элементов формы результатами.
Обработка выполнения SQL-запроса выглядит примерно так:
В глобальном блоке объявлена переменная:
ZS_DataSet:TM_DataSet;
а также есть две процедуры:
Upgrade_ZS_DataSet - пересохраняет набор данных DataSet из SQL-запроса для будущей обработки
Upgrade_ZS_Record_Data - обновляет некоторые данные на экранной форме.
После старта проекта, сразу формируется SQ-запрос на чтение таблицы.
Все процедуры начиная с OnRecipeDoneSQL отрабатывают корректно и на экране появляются данные.
Но дальнейшие обращения к переменной ZS_DataSet приводят к ошибке "Обращение к несуществующему объекту".
Например, вот такая процедура на кнопке, которая сдвигает курсор в наборе данных.
Строка "ZS_DataSet.Next" приведет к ошибке.
Подскажите в чем ошибка?
Возможно надо как-то дополнительно обработать команду ZS_DataSet:=DataSet?
Но почему тогда при первом запуске процедур, работа с ZS_DataSet выполняется корректно?
Возможно вопрос уже задавался, но поиск по форуме мне результата не дал.
Есть база данных 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;
Все процедуры начиная с 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 выполняется корректно?