1 Востаннє редагувалося javascriptIsLife (16.07.2022 10:05:27)

Тема: clientdataset is not in edit or insert mode

Хочу завантажувати і зберігати дані в табличці в локальному файлі. Дані чомусь не зберігаються. Розмір файлу не змінюється і при завантаження форми їх немає в DBGrid. Якщо прибрати рядок ClientDataSet1.Edit; або перемістити його вище ClientDataSet1.AppendRecord, то вилітає повідомлення про помилка в заголовку теми хоча керуючись здоровим глуздом Edit потрібно викликати перед додавнням нового запису. Що я роблю не так?

procedure TForm2.FormCreate(Sender: TObject);
begin
    with ClientDataSet1 do begin
        Open;
        FileName:='Categories.cds';
        LogChanges := False;
        AppendRecord(['adasdas']);
        Edit;
        Post;
    end;
end;

2

Re: clientdataset is not in edit or insert mode

Треба викликати ще й SaveToFile. А замість FileName треба LoadFromFile. А Edit чомусь повинен бути саме після AppendRecord.

    with ClientDataSet1 do begin
        Open;
        LoadFromFile('Categories.cds');
        LogChanges := False;
        AppendRecord(['13']);
        Edit;
        Post;
        SaveToFile('Categories.cds', dfBinary);
    end;

3

Re: clientdataset is not in edit or insert mode

javascriptIsLife написав:

Що я роблю не так?

procedure TForm2.FormCreate(Sender: TObject);
begin
    with ClientDataSet1 do begin
        Open;
        FileName:='Categories.cds';
        LogChanges := False;
        AppendRecord(['adasdas']);
        Edit;
        Post;
    end;
end;

Ну от подумайте: що повинен відкрити датасет, якщо ім'я файлу ви задаєте лише в наступному рядку?
Що стосується додавання нових даних, то вам треба визначитися, чи ви хочете це робити в одному рядку, чи в декількох. Якщо треба усе одним рядком, то використовуйте AppendRecord. Якщо хочете розбити дії з полями на декілька кроків, то використовуйте Append + Post.

Подякували: javascriptIsLife1

4

Re: clientdataset is not in edit or insert mode

Дійсно. Але в свій захист хочу написати що в документації нічого такого не написано

Call Open to set the Active property for the dataset to true. When Active is true, data can be populated with data. It can read data from a database or other source (such as a provider). Depending on the CanModify property, active datasets can post changes.).

Щойно перевірив що з FileName воно не працює що з Open попереду що після. Працює LoadFromFile і виклик Open перед або після ні на що не впливає (принаймні я йього не бачу). Про всяк випадок розмістив Open перед LoadFromFile.

5

Re: clientdataset is not in edit or insert mode

javascriptIsLife написав:

Дійсно. Але в свій захист хочу написати що в документації нічого такого не написано

Call Open to set the Active property for the dataset to true. When Active is true, data can be populated with data. It can read data from a database or other source (such as a provider). Depending on the CanModify property, active datasets can post changes.).

Це через те, що ви можете задати структуру датасета під час дизайну, і потім працювати з цією таблицею під час роботи програми, не звертаючись до будь яких файлів. Але тоді ви звичайно втратите дані після завершення роботи.

javascriptIsLife написав:

Щойно перевірив що з FileName воно не працює що з Open попереду що після.

Має працювати, мабуть проблема в чомусь іншому.